]> git.proxmox.com Git - mirror_frr.git/blob - zebra/zebra_evpn.h
Merge pull request #5702 from vishaldhingra/bgp_nb
[mirror_frr.git] / zebra / zebra_evpn.h
1 /*
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.
6 *
7 * This file is part of FRR.
8 *
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
12 * later version.
13 *
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.
18 *
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
22 * 02111-1307, USA.
23 */
24
25 #ifndef _ZEBRA_EVPN_H
26 #define _ZEBRA_EVPN_H
27
28 #include <zebra.h>
29
30 #include "if.h"
31 #include "linklist.h"
32 #include "bitfield.h"
33
34 #include "zebra/zebra_l2.h"
35 #include "zebra/interface.h"
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 typedef struct zebra_evpn_t_ zebra_evpn_t;
42 typedef struct zebra_vtep_t_ zebra_vtep_t;
43
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,
46 zebra_es_evi_rb_cmp);
47
48 /* Private Structure to pass callback data for hash iterator */
49 struct zebra_evpn_show {
50 struct vty *vty;
51 json_object *json;
52 struct zebra_vrf *zvrf;
53 bool use_json;
54 };
55
56 /*
57 * VTEP info
58 *
59 * Right now, this just has each remote VTEP's IP address.
60 */
61 struct zebra_vtep_t_ {
62 /* Remote IP. */
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
67 */
68 int flood_control;
69
70 /* Links. */
71 struct zebra_vtep_t_ *next;
72 struct zebra_vtep_t_ *prev;
73 };
74
75 /*
76 * VNI hash table
77 *
78 * Contains information pertaining to a VNI:
79 * - the list of remote VTEPs (with this VNI)
80 */
81 struct zebra_evpn_t_ {
82 /* VNI - key */
83 vni_t vni;
84
85 /* ES flags */
86 uint32_t flags;
87 #define ZEVPN_READY_FOR_BGP (1 << 0) /* ready to be sent to BGP */
88
89 /* Flag for advertising gw macip */
90 uint8_t advertise_gw_macip;
91
92 /* Flag for advertising svi macip */
93 uint8_t advertise_svi_macip;
94
95 /* Flag for advertising gw macip */
96 uint8_t advertise_subnet;
97
98 /* Corresponding VxLAN interface. */
99 struct interface *vxlan_if;
100
101 /* List of remote VTEPs */
102 zebra_vtep_t *vteps;
103
104 /* Local IP */
105 struct in_addr local_vtep_ip;
106
107 /* PIM-SM MDT group for BUM flooding */
108 struct in_addr mcast_grp;
109
110 /* tenant VRF, if any */
111 vrf_id_t vrf_id;
112
113 /* List of local or remote MAC */
114 struct hash *mac_table;
115
116 /* List of local or remote neighbors (MAC+IP) */
117 struct hash *neigh_table;
118
119 /* RB tree of ES-EVIs */
120 struct zebra_es_evi_rb_head es_evi_rb_tree;
121
122 /* List of local ESs */
123 struct list *local_es_evi_list;
124 };
125
126 struct interface *zvni_map_to_svi(vlanid_t vid, struct interface *br_if);
127
128 static inline struct interface *zevpn_map_to_svi(zebra_evpn_t *zevpn)
129 {
130 struct interface *ifp;
131 struct zebra_if *zif = NULL;
132 struct zebra_l2info_vxlan zl2_info;
133
134 ifp = zevpn->vxlan_if;
135 if (!ifp)
136 return NULL;
137 zif = ifp->info;
138 if (!zif)
139 return NULL;
140
141 /* If down or not mapped to a bridge, we're done. */
142 if (!if_is_operative(ifp) || !zif->brslave_info.br_if)
143 return NULL;
144 zl2_info = zif->l2info.vxl;
145 return zvni_map_to_svi(zl2_info.access_vlan, zif->brslave_info.br_if);
146 }
147
148 int advertise_gw_macip_enabled(zebra_evpn_t *zevpn);
149 int advertise_svi_macip_enabled(zebra_evpn_t *zevpn);
150 void zebra_evpn_print(zebra_evpn_t *zevpn, void **ctxt);
151 void zebra_evpn_print_hash(struct hash_bucket *bucket, void *ctxt[]);
152 void zebra_evpn_print_hash_detail(struct hash_bucket *bucket, void *data);
153 int zebra_evpn_add_macip_for_intf(struct interface *ifp, zebra_evpn_t *zevpn);
154 int zebra_evpn_del_macip_for_intf(struct interface *ifp, zebra_evpn_t *zevpn);
155 int zebra_evpn_advertise_subnet(zebra_evpn_t *zevpn, struct interface *ifp,
156 int advertise);
157 int zebra_evpn_gw_macip_add(struct interface *ifp, zebra_evpn_t *zevpn,
158 struct ethaddr *macaddr, struct ipaddr *ip);
159 int zebra_evpn_gw_macip_del(struct interface *ifp, zebra_evpn_t *zevpn,
160 struct ipaddr *ip);
161 void zebra_evpn_gw_macip_del_for_evpn_hash(struct hash_bucket *bucket,
162 void *ctxt);
163 void zebra_evpn_gw_macip_add_for_evpn_hash(struct hash_bucket *bucket,
164 void *ctxt);
165 void zebra_evpn_svi_macip_del_for_evpn_hash(struct hash_bucket *bucket,
166 void *ctxt);
167 zebra_evpn_t *zebra_evpn_map_vlan(struct interface *ifp,
168 struct interface *br_if, vlanid_t vid);
169 zebra_evpn_t *zebra_evpn_from_svi(struct interface *ifp,
170 struct interface *br_if);
171 struct interface *zebra_evpn_map_to_macvlan(struct interface *br_if,
172 struct interface *svi_if);
173 void zebra_evpn_install_mac_hash(struct hash_bucket *bucket, void *ctxt);
174 void zebra_evpn_read_mac_neigh(zebra_evpn_t *zevpn, struct interface *ifp);
175 unsigned int zebra_evpn_hash_keymake(const void *p);
176 bool zebra_evpn_hash_cmp(const void *p1, const void *p2);
177 int zebra_evpn_list_cmp(void *p1, void *p2);
178 void *zebra_evpn_alloc(void *p);
179 zebra_evpn_t *zebra_evpn_lookup(vni_t vni);
180 zebra_evpn_t *zebra_evpn_add(vni_t vni);
181 int zebra_evpn_del(zebra_evpn_t *zevpn);
182 int zebra_evpn_send_add_to_client(zebra_evpn_t *zevpn);
183 int zebra_evpn_send_del_to_client(zebra_evpn_t *zevpn);
184 zebra_vtep_t *zebra_evpn_vtep_find(zebra_evpn_t *zevpn,
185 struct in_addr *vtep_ip);
186 zebra_vtep_t *zebra_evpn_vtep_add(zebra_evpn_t *zevpn, struct in_addr *vtep_ip,
187 int flood_control);
188 int zebra_evpn_vtep_del(zebra_evpn_t *zevpn, zebra_vtep_t *zvtep);
189 int zebra_evpn_vtep_del_all(zebra_evpn_t *zevpn, int uninstall);
190 int zebra_evpn_vtep_install(zebra_evpn_t *zevpn, zebra_vtep_t *zvtep);
191 int zebra_evpn_vtep_uninstall(zebra_evpn_t *zevpn, struct in_addr *vtep_ip);
192 void zebra_evpn_handle_flooding_remote_vteps(struct hash_bucket *bucket,
193 void *zvrf);
194 void zebra_evpn_cleanup_all(struct hash_bucket *bucket, void *arg);
195 void process_remote_macip_add(vni_t vni, struct ethaddr *macaddr,
196 uint16_t ipa_len, struct ipaddr *ipaddr,
197 uint8_t flags, uint32_t seq,
198 struct in_addr vtep_ip, esi_t *esi);
199 void process_remote_macip_del(vni_t vni, struct ethaddr *macaddr,
200 uint16_t ipa_len, struct ipaddr *ipaddr,
201 struct in_addr vtep_ip);
202 void zebra_evpn_cfg_cleanup(struct hash_bucket *bucket, void *ctxt);
203
204 #ifdef __cplusplus
205 }
206 #endif
207
208 #endif /*_ZEBRA_EVPN_H */