2 * Zebra EVPN Data structures and definitions
3 * These are "internal" to this function.
4 * Copyright (C) 2016, 2017 Cumulus Networks, Inc.
5 * Copyright (C) 2020 Volta Networks.
7 * This file is part of FRR.
9 * FRR is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2, or (at your option) any
14 * FRR is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with FRR; see the file COPYING. If not, write to the Free
21 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
34 #include "zebra/zebra_l2.h"
35 #include "zebra/interface.h"
41 typedef struct zebra_evpn_t_ zebra_evpn_t
;
42 typedef struct zebra_vtep_t_ zebra_vtep_t
;
44 RB_HEAD(zebra_es_evi_rb_head
, zebra_evpn_es_evi
);
45 RB_PROTOTYPE(zebra_es_evi_rb_head
, zebra_evpn_es_evi
, rb_node
,
48 /* Private Structure to pass callback data for hash iterator */
49 struct zebra_evpn_show
{
52 struct zebra_vrf
*zvrf
;
59 * Right now, this just has each remote VTEP's IP address.
61 struct zebra_vtep_t_
{
63 /* NOTE: Can only be IPv4 right now. */
64 struct in_addr vtep_ip
;
65 /* Flood mode (one of enum vxlan_flood_control) based on the PMSI
66 * tunnel type advertised by the remote VTEP
71 struct zebra_vtep_t_
*next
;
72 struct zebra_vtep_t_
*prev
;
78 * Contains information pertaining to a VNI:
79 * - the list of remote VTEPs (with this VNI)
81 struct zebra_evpn_t_
{
87 #define ZEVPN_READY_FOR_BGP (1 << 0) /* ready to be sent to BGP */
89 /* Flag for advertising gw macip */
90 uint8_t advertise_gw_macip
;
92 /* Flag for advertising svi macip */
93 uint8_t advertise_svi_macip
;
95 /* Flag for advertising gw macip */
96 uint8_t advertise_subnet
;
98 /* Corresponding VxLAN interface. */
99 struct interface
*vxlan_if
;
101 /* List of remote VTEPs */
105 struct in_addr local_vtep_ip
;
107 /* PIM-SM MDT group for BUM flooding */
108 struct in_addr mcast_grp
;
110 /* tenant VRF, if any */
113 /* List of local or remote MAC */
114 struct hash
*mac_table
;
116 /* List of local or remote neighbors (MAC+IP) */
117 struct hash
*neigh_table
;
119 /* RB tree of ES-EVIs */
120 struct zebra_es_evi_rb_head es_evi_rb_tree
;
122 /* List of local ESs */
123 struct list
*local_es_evi_list
;
126 /* for parsing evpn and vni contexts */
127 struct zebra_from_svi_param
{
128 struct interface
*br_if
;
129 struct interface
*svi_if
;
130 struct zebra_if
*zif
;
131 uint8_t bridge_vlan_aware
;
135 struct interface
*zvni_map_to_svi(vlanid_t vid
, struct interface
*br_if
);
137 static inline struct interface
*zevpn_map_to_svi(zebra_evpn_t
*zevpn
)
139 struct interface
*ifp
;
140 struct zebra_if
*zif
= NULL
;
141 struct zebra_l2info_vxlan zl2_info
;
143 ifp
= zevpn
->vxlan_if
;
150 /* If down or not mapped to a bridge, we're done. */
151 if (!if_is_operative(ifp
) || !zif
->brslave_info
.br_if
)
153 zl2_info
= zif
->l2info
.vxl
;
154 return zvni_map_to_svi(zl2_info
.access_vlan
, zif
->brslave_info
.br_if
);
157 int advertise_gw_macip_enabled(zebra_evpn_t
*zevpn
);
158 int advertise_svi_macip_enabled(zebra_evpn_t
*zevpn
);
159 void zebra_evpn_print(zebra_evpn_t
*zevpn
, void **ctxt
);
160 void zebra_evpn_print_hash(struct hash_bucket
*bucket
, void *ctxt
[]);
161 void zebra_evpn_print_hash_detail(struct hash_bucket
*bucket
, void *data
);
162 int zebra_evpn_add_macip_for_intf(struct interface
*ifp
, zebra_evpn_t
*zevpn
);
163 int zebra_evpn_del_macip_for_intf(struct interface
*ifp
, zebra_evpn_t
*zevpn
);
164 int zebra_evpn_advertise_subnet(zebra_evpn_t
*zevpn
, struct interface
*ifp
,
166 int zebra_evpn_gw_macip_add(struct interface
*ifp
, zebra_evpn_t
*zevpn
,
167 struct ethaddr
*macaddr
, struct ipaddr
*ip
);
168 int zebra_evpn_gw_macip_del(struct interface
*ifp
, zebra_evpn_t
*zevpn
,
170 void zebra_evpn_gw_macip_del_for_evpn_hash(struct hash_bucket
*bucket
,
172 void zebra_evpn_gw_macip_add_for_evpn_hash(struct hash_bucket
*bucket
,
174 void zebra_evpn_svi_macip_del_for_evpn_hash(struct hash_bucket
*bucket
,
176 zebra_evpn_t
*zebra_evpn_map_vlan(struct interface
*ifp
,
177 struct interface
*br_if
, vlanid_t vid
);
178 zebra_evpn_t
*zebra_evpn_from_svi(struct interface
*ifp
,
179 struct interface
*br_if
);
180 struct interface
*zebra_evpn_map_to_macvlan(struct interface
*br_if
,
181 struct interface
*svi_if
);
182 void zebra_evpn_install_mac_hash(struct hash_bucket
*bucket
, void *ctxt
);
183 void zebra_evpn_read_mac_neigh(zebra_evpn_t
*zevpn
, struct interface
*ifp
);
184 unsigned int zebra_evpn_hash_keymake(const void *p
);
185 bool zebra_evpn_hash_cmp(const void *p1
, const void *p2
);
186 int zebra_evpn_list_cmp(void *p1
, void *p2
);
187 void *zebra_evpn_alloc(void *p
);
188 zebra_evpn_t
*zebra_evpn_lookup(vni_t vni
);
189 zebra_evpn_t
*zebra_evpn_add(vni_t vni
);
190 int zebra_evpn_del(zebra_evpn_t
*zevpn
);
191 int zebra_evpn_send_add_to_client(zebra_evpn_t
*zevpn
);
192 int zebra_evpn_send_del_to_client(zebra_evpn_t
*zevpn
);
193 zebra_vtep_t
*zebra_evpn_vtep_find(zebra_evpn_t
*zevpn
,
194 struct in_addr
*vtep_ip
);
195 zebra_vtep_t
*zebra_evpn_vtep_add(zebra_evpn_t
*zevpn
, struct in_addr
*vtep_ip
,
197 int zebra_evpn_vtep_del(zebra_evpn_t
*zevpn
, zebra_vtep_t
*zvtep
);
198 int zebra_evpn_vtep_del_all(zebra_evpn_t
*zevpn
, int uninstall
);
199 int zebra_evpn_vtep_install(zebra_evpn_t
*zevpn
, zebra_vtep_t
*zvtep
);
200 int zebra_evpn_vtep_uninstall(zebra_evpn_t
*zevpn
, struct in_addr
*vtep_ip
);
201 void zebra_evpn_handle_flooding_remote_vteps(struct hash_bucket
*bucket
,
203 void zebra_evpn_cleanup_all(struct hash_bucket
*bucket
, void *arg
);
204 void process_remote_macip_add(vni_t vni
, struct ethaddr
*macaddr
,
205 uint16_t ipa_len
, struct ipaddr
*ipaddr
,
206 uint8_t flags
, uint32_t seq
,
207 struct in_addr vtep_ip
, esi_t
*esi
);
208 void process_remote_macip_del(vni_t vni
, struct ethaddr
*macaddr
,
209 uint16_t ipa_len
, struct ipaddr
*ipaddr
,
210 struct in_addr vtep_ip
);
211 void zebra_evpn_cfg_cleanup(struct hash_bucket
*bucket
, void *ctxt
);
217 #endif /*_ZEBRA_EVPN_H */