mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-30 03:08:59 +00:00
zebra: zvni_map_to_vlan() adaptation for all namespaces
this change is needed when a MAC/IP entry is learned by zebra, and the entry happens to be in a different namespace. So that the entry be active, the correct vni match has to be found. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
f8ed2c5420
commit
db81d18647
@ -3528,32 +3528,37 @@ static int zvni_mac_send_del_to_client(vni_t vni, struct ethaddr *macaddr)
|
|||||||
0 /* seq */, ZEBRA_NEIGH_ACTIVE, ZEBRA_MACIP_DEL);
|
0 /* seq */, ZEBRA_NEIGH_ACTIVE, ZEBRA_MACIP_DEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
struct zvni_from_svi_param {
|
||||||
* Map port or (port, VLAN) to a VNI. This is invoked upon getting MAC
|
struct interface *br_if;
|
||||||
* notifications, to see if they are of interest.
|
struct zebra_if *zif;
|
||||||
*/
|
uint8_t bridge_vlan_aware;
|
||||||
static zebra_vni_t *zvni_map_vlan(struct interface *ifp,
|
vlanid_t vid;
|
||||||
struct interface *br_if, vlanid_t vid)
|
};
|
||||||
|
|
||||||
|
static int zvni_map_vlan_zns(struct zebra_ns *zns,
|
||||||
|
void *_in_param,
|
||||||
|
void **_p_zvni)
|
||||||
{
|
{
|
||||||
struct zebra_ns *zns;
|
|
||||||
struct route_node *rn;
|
struct route_node *rn;
|
||||||
|
struct interface *br_if;
|
||||||
|
zebra_vni_t **p_zvni = (zebra_vni_t **)_p_zvni;
|
||||||
|
zebra_vni_t *zvni;
|
||||||
struct interface *tmp_if = NULL;
|
struct interface *tmp_if = NULL;
|
||||||
struct zebra_if *zif;
|
struct zebra_if *zif;
|
||||||
struct zebra_l2info_bridge *br;
|
|
||||||
struct zebra_l2info_vxlan *vxl = NULL;
|
struct zebra_l2info_vxlan *vxl = NULL;
|
||||||
uint8_t bridge_vlan_aware;
|
struct zvni_from_svi_param *in_param =
|
||||||
zebra_vni_t *zvni;
|
(struct zvni_from_svi_param *)_in_param;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
/* Determine if bridge is VLAN-aware or not */
|
if (!in_param)
|
||||||
zif = br_if->info;
|
return ZNS_WALK_STOP;
|
||||||
|
br_if = in_param->br_if;
|
||||||
|
zif = in_param->zif;
|
||||||
assert(zif);
|
assert(zif);
|
||||||
br = &zif->l2info.br;
|
assert(br_if);
|
||||||
bridge_vlan_aware = br->vlan_aware;
|
|
||||||
|
|
||||||
/* See if this interface (or interface plus VLAN Id) maps to a VxLAN */
|
/* See if this interface (or interface plus VLAN Id) maps to a VxLAN */
|
||||||
/* TODO: Optimize with a hash. */
|
/* TODO: Optimize with a hash. */
|
||||||
zns = zebra_ns_lookup(NS_DEFAULT);
|
|
||||||
for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
|
for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) {
|
||||||
tmp_if = (struct interface *)rn->info;
|
tmp_if = (struct interface *)rn->info;
|
||||||
if (!tmp_if)
|
if (!tmp_if)
|
||||||
@ -3568,25 +3573,48 @@ static zebra_vni_t *zvni_map_vlan(struct interface *ifp,
|
|||||||
if (zif->brslave_info.br_if != br_if)
|
if (zif->brslave_info.br_if != br_if)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!bridge_vlan_aware || vxl->access_vlan == vid) {
|
if (!in_param->bridge_vlan_aware
|
||||||
|
|| vxl->access_vlan == in_param->vid) {
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
return NULL;
|
return ZNS_WALK_CONTINUE;
|
||||||
|
|
||||||
zvni = zvni_lookup(vxl->vni);
|
zvni = zvni_lookup(vxl->vni);
|
||||||
return zvni;
|
if (p_zvni)
|
||||||
|
*p_zvni = zvni;
|
||||||
|
return ZNS_WALK_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct zvni_from_svi_param {
|
/*
|
||||||
struct interface *br_if;
|
* Map port or (port, VLAN) to a VNI. This is invoked upon getting MAC
|
||||||
|
* notifications, to see if they are of interest.
|
||||||
|
*/
|
||||||
|
static zebra_vni_t *zvni_map_vlan(struct interface *ifp,
|
||||||
|
struct interface *br_if, vlanid_t vid)
|
||||||
|
{
|
||||||
struct zebra_if *zif;
|
struct zebra_if *zif;
|
||||||
uint8_t bridge_vlan_aware;
|
struct zebra_l2info_bridge *br;
|
||||||
vlanid_t vid;
|
zebra_vni_t **p_zvni;
|
||||||
};
|
zebra_vni_t *zvni = NULL;
|
||||||
|
struct zvni_from_svi_param in_param;
|
||||||
|
|
||||||
|
/* Determine if bridge is VLAN-aware or not */
|
||||||
|
zif = br_if->info;
|
||||||
|
assert(zif);
|
||||||
|
br = &zif->l2info.br;
|
||||||
|
in_param.bridge_vlan_aware = br->vlan_aware;
|
||||||
|
in_param.vid = vid;
|
||||||
|
in_param.br_if = br_if;
|
||||||
|
in_param.zif = zif;
|
||||||
|
p_zvni = &zvni;
|
||||||
|
|
||||||
|
zebra_ns_list_walk(zvni_map_vlan_zns, (void *)&in_param,
|
||||||
|
(void **)p_zvni);
|
||||||
|
return zvni;
|
||||||
|
}
|
||||||
|
|
||||||
static int zvni_from_svi_zns(struct zebra_ns *zns,
|
static int zvni_from_svi_zns(struct zebra_ns *zns,
|
||||||
void *_in_param,
|
void *_in_param,
|
||||||
|
Loading…
Reference in New Issue
Block a user