forked from Mirror/frr

Today to find the vni for a given (vlan, bridge) we walk over all interfaces and filter the vxlan device associated with the bridge. With multiple vlan aware bridge changes, we can derive the vni directly by looking up the hash table i.e. the vlan_table of the associated (vlan, bridge) which would give the vni. During vrf_terminate() call zebra_l2_bridge_if_cleanup if the interface that we are removing is of type bridge. In this case, we walk over all the vlan<->access_bd association and clean them up. zebra_evpn_t is modified to record (vlan, bridge) details and the corresponding vty is modified to print the same. zevpn_bridge_if_set and zl3vni_bridge_if_set is used to set/unset the association. Signed-off-by: Sharath Ramamurthy <sramamurthy@nvidia.com>
102 lines
2.3 KiB
C
102 lines
2.3 KiB
C
/*
|
|
* Zebra EVPN for VxLAN code
|
|
* Copyright (C) 2016, 2017 Cumulus Networks, Inc.
|
|
*
|
|
* This file is part of FRR.
|
|
*
|
|
* FRR is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2, or (at your option) any
|
|
* later version.
|
|
*
|
|
* FRR is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with FRR; see the file COPYING. If not, write to the Free
|
|
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
* 02111-1307, USA.
|
|
*/
|
|
|
|
/* Get the VRR interface for SVI if any */
|
|
static inline struct interface *
|
|
zebra_get_vrr_intf_for_svi(struct interface *ifp)
|
|
{
|
|
struct zebra_vrf *zvrf = NULL;
|
|
struct interface *tmp_if = NULL;
|
|
struct zebra_if *zif = NULL;
|
|
|
|
zvrf = ifp->vrf->info;
|
|
assert(zvrf);
|
|
|
|
FOR_ALL_INTERFACES (zvrf->vrf, tmp_if) {
|
|
zif = tmp_if->info;
|
|
if (!zif)
|
|
continue;
|
|
|
|
if (!IS_ZEBRA_IF_MACVLAN(tmp_if))
|
|
continue;
|
|
|
|
if (zif->link == ifp)
|
|
return tmp_if;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* EVPN<=>vxlan_zif association */
|
|
static inline void zevpn_vxlan_if_set(struct zebra_evpn *zevpn,
|
|
struct interface *ifp, bool set)
|
|
{
|
|
struct zebra_if *zif;
|
|
|
|
if (set) {
|
|
if (zevpn->vxlan_if == ifp)
|
|
return;
|
|
zevpn->vxlan_if = ifp;
|
|
} else {
|
|
if (!zevpn->vxlan_if)
|
|
return;
|
|
zevpn->vxlan_if = NULL;
|
|
}
|
|
|
|
if (ifp)
|
|
zif = ifp->info;
|
|
else
|
|
zif = NULL;
|
|
|
|
zebra_evpn_vxl_evpn_set(zif, zevpn, set);
|
|
}
|
|
|
|
/* EVPN<=>Bridge interface association */
|
|
static inline void zevpn_bridge_if_set(struct zebra_evpn *zevpn,
|
|
struct interface *ifp, bool set)
|
|
{
|
|
if (set) {
|
|
if (zevpn->bridge_if == ifp)
|
|
return;
|
|
zevpn->bridge_if = ifp;
|
|
} else {
|
|
if (!zevpn->bridge_if)
|
|
return;
|
|
zevpn->bridge_if = NULL;
|
|
}
|
|
}
|
|
|
|
/* EVPN<=>Bridge interface association */
|
|
static inline void zl3vni_bridge_if_set(struct zebra_l3vni *zl3vni,
|
|
struct interface *ifp, bool set)
|
|
{
|
|
if (set) {
|
|
if (zl3vni->bridge_if == ifp)
|
|
return;
|
|
zl3vni->bridge_if = ifp;
|
|
} else {
|
|
if (!zl3vni->bridge_if)
|
|
return;
|
|
zl3vni->bridge_if = NULL;
|
|
}
|
|
}
|