]>
git.proxmox.com Git - mirror_frr.git/blob - zebra/zebra_vxlan_private.h
2 * Zebra VxLAN (EVPN) Data structures and definitions
3 * These are "internal" to this function.
4 * Copyright (C) 2016, 2017 Cumulus Networks, Inc.
6 * This file is part of FRR.
8 * FRR is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2, or (at your option) any
13 * FRR is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with FRR; see the file COPYING. If not, write to the Free
20 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24 #ifndef _ZEBRA_VXLAN_PRIVATE_H
25 #define _ZEBRA_VXLAN_PRIVATE_H
31 #include "zebra_vxlan.h"
32 #include "zebra_evpn.h"
33 #include "zebra_evpn_mac.h"
39 #define ERR_STR_SZ 256
41 /* L3 VNI hash table */
51 #define PREFIX_ROUTES_ONLY (1 << 0) /* l3-vni used for prefix routes only */
54 struct in_addr local_vtep_ip
;
56 /* kernel interface for l3vni */
57 struct interface
*vxlan_if
;
59 /* SVI interface corresponding to the l3vni */
60 struct interface
*svi_if
;
62 struct interface
*mac_vlan_if
;
64 /* list of L2 VNIs associated with the L3 VNI */
67 /* list of remote router-macs */
68 struct hash
*rmac_table
;
70 /* list of remote vtep-ip neigh */
71 struct hash
*nh_table
;
74 /* get the vx-intf name for l3vni */
75 static inline const char *zl3vni_vxlan_if_name(struct zebra_l3vni
*zl3vni
)
77 return zl3vni
->vxlan_if
? zl3vni
->vxlan_if
->name
: "None";
80 /* get the svi intf name for l3vni */
81 static inline const char *zl3vni_svi_if_name(struct zebra_l3vni
*zl3vni
)
83 return zl3vni
->svi_if
? zl3vni
->svi_if
->name
: "None";
86 /* get the vrf name for l3vni */
87 static inline const char *zl3vni_vrf_name(struct zebra_l3vni
*zl3vni
)
89 return vrf_id_to_name(zl3vni
->vrf_id
);
92 /* get the rmac string */
93 static inline const char *zl3vni_rmac2str(struct zebra_l3vni
*zl3vni
, char *buf
,
99 ptr
= XMALLOC(MTYPE_TMP
, ETHER_ADDR_STRLEN
* sizeof(char));
101 assert(size
>= ETHER_ADDR_STRLEN
);
105 if (zl3vni
->mac_vlan_if
)
106 snprintf(ptr
, (ETHER_ADDR_STRLEN
),
107 "%02x:%02x:%02x:%02x:%02x:%02x",
108 (uint8_t)zl3vni
->mac_vlan_if
->hw_addr
[0],
109 (uint8_t)zl3vni
->mac_vlan_if
->hw_addr
[1],
110 (uint8_t)zl3vni
->mac_vlan_if
->hw_addr
[2],
111 (uint8_t)zl3vni
->mac_vlan_if
->hw_addr
[3],
112 (uint8_t)zl3vni
->mac_vlan_if
->hw_addr
[4],
113 (uint8_t)zl3vni
->mac_vlan_if
->hw_addr
[5]);
114 else if (zl3vni
->svi_if
)
115 snprintf(ptr
, (ETHER_ADDR_STRLEN
),
116 "%02x:%02x:%02x:%02x:%02x:%02x",
117 (uint8_t)zl3vni
->svi_if
->hw_addr
[0],
118 (uint8_t)zl3vni
->svi_if
->hw_addr
[1],
119 (uint8_t)zl3vni
->svi_if
->hw_addr
[2],
120 (uint8_t)zl3vni
->svi_if
->hw_addr
[3],
121 (uint8_t)zl3vni
->svi_if
->hw_addr
[4],
122 (uint8_t)zl3vni
->svi_if
->hw_addr
[5]);
124 snprintf(ptr
, ETHER_ADDR_STRLEN
, "None");
129 /* get the sys mac string */
130 static inline const char *zl3vni_sysmac2str(struct zebra_l3vni
*zl3vni
,
136 ptr
= XMALLOC(MTYPE_TMP
, ETHER_ADDR_STRLEN
* sizeof(char));
138 assert(size
>= ETHER_ADDR_STRLEN
);
143 snprintf(ptr
, (ETHER_ADDR_STRLEN
),
144 "%02x:%02x:%02x:%02x:%02x:%02x",
145 (uint8_t)zl3vni
->svi_if
->hw_addr
[0],
146 (uint8_t)zl3vni
->svi_if
->hw_addr
[1],
147 (uint8_t)zl3vni
->svi_if
->hw_addr
[2],
148 (uint8_t)zl3vni
->svi_if
->hw_addr
[3],
149 (uint8_t)zl3vni
->svi_if
->hw_addr
[4],
150 (uint8_t)zl3vni
->svi_if
->hw_addr
[5]);
152 snprintf(ptr
, ETHER_ADDR_STRLEN
, "None");
158 * l3-vni is oper up when:
159 * 0. if EVPN is enabled (advertise-all-vni cfged)
160 * 1. it is associated to a vxlan-intf
161 * 2. Associated vxlan-intf is oper up
162 * 3. it is associated to an SVI
163 * 4. associated SVI is oper up
165 static inline int is_l3vni_oper_up(struct zebra_l3vni
*zl3vni
)
167 return (is_evpn_enabled() && zl3vni
&& (zl3vni
->vrf_id
!= VRF_UNKNOWN
)
168 && zl3vni
->vxlan_if
&& if_is_operative(zl3vni
->vxlan_if
)
169 && zl3vni
->svi_if
&& if_is_operative(zl3vni
->svi_if
));
172 static inline const char *zl3vni_state2str(struct zebra_l3vni
*zl3vni
)
177 if (is_l3vni_oper_up(zl3vni
))
185 static inline vrf_id_t
zl3vni_vrf_id(struct zebra_l3vni
*zl3vni
)
187 return zl3vni
->vrf_id
;
190 static inline void zl3vni_get_svi_rmac(struct zebra_l3vni
*zl3vni
,
191 struct ethaddr
*rmac
)
196 if (!is_l3vni_oper_up(zl3vni
))
199 if (zl3vni
->svi_if
&& if_is_operative(zl3vni
->svi_if
))
200 memcpy(rmac
->octet
, zl3vni
->svi_if
->hw_addr
, ETH_ALEN
);
204 /* context for neigh hash walk - update l3vni and rmac */
205 struct neigh_l3info_walk_ctx
{
207 struct zebra_evpn
*zevpn
;
208 struct zebra_l3vni
*zl3vni
;
215 struct json_object
*json
;
218 extern struct zebra_l3vni
*zl3vni_from_vrf(vrf_id_t vrf_id
);
219 extern struct interface
*zl3vni_map_to_vxlan_if(struct zebra_l3vni
*zl3vni
);
220 extern struct interface
*zl3vni_map_to_svi_if(struct zebra_l3vni
*zl3vni
);
221 extern struct interface
*zl3vni_map_to_mac_vlan_if(struct zebra_l3vni
*zl3vni
);
222 extern struct zebra_l3vni
*zl3vni_lookup(vni_t vni
);
223 extern vni_t
vni_id_from_svi(struct interface
*ifp
, struct interface
*br_if
);
225 DECLARE_HOOK(zebra_rmac_update
,
226 (struct zebra_mac
* rmac
, struct zebra_l3vni
*zl3vni
, bool delete,
228 (rmac
, zl3vni
, delete, reason
));
236 * Multicast hash table.
238 * This table contains -
239 * 1. The (S, G) entries used for encapsulating and forwarding BUM traffic.
240 * S is the local VTEP-IP and G is a BUM mcast group address.
241 * 2. The (X, G) entries used for terminating a BUM flow.
242 * Multiple L2-VNIs can share the same MDT hence the need to maintain
243 * an aggregated table that pimd can consume without much
246 struct zebra_vxlan_sg
{
247 struct zebra_vrf
*zvrf
;
250 char sg_str
[PREFIX_SG_STR_LEN
];
252 /* For SG - num of L2 VNIs using this entry for sending BUM traffic */
253 /* For XG - num of SG using this as parent */
257 extern struct zebra_evpn
*zevpn_lookup(vni_t vni
);
258 extern void zebra_vxlan_sync_mac_dp_install(struct zebra_mac
*mac
,
260 bool force_clear_static
,
262 extern bool zebra_evpn_do_dup_addr_detect(struct zebra_vrf
*zvrf
);
264 #endif /* _ZEBRA_VXLAN_PRIVATE_H */