summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChirag Shah <chirag@cumulusnetworks.com>2019-09-06 22:55:35 +0200
committerChirag Shah <chirag@cumulusnetworks.com>2019-11-22 16:53:33 +0100
commit0056f687d759166e59fbe099c6b5aa8b90826b67 (patch)
tree5a9c54e7a7e768f043f133bd904842edfc2a060d
parentbgpd: evpn pip handle svi ip route (diff)
downloadfrr-0056f687d759166e59fbe099c6b5aa8b90826b67.tar.xz
frr-0056f687d759166e59fbe099c6b5aa8b90826b67.zip
zebra: evpn pip mac vlan up-down event
macvlan interface up/down event triggers bgp to send updates for evpn routes with changed RMAC and nexthop IP values. Ticket:CM-26190 Reviewed By: Testing Done: Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
-rw-r--r--zebra/interface.c7
-rw-r--r--zebra/zebra_vxlan.c61
-rw-r--r--zebra/zebra_vxlan.h2
3 files changed, 68 insertions, 2 deletions
diff --git a/zebra/interface.c b/zebra/interface.c
index eea80652e..02c00ebfa 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -1060,7 +1060,9 @@ void if_up(struct interface *ifp)
zif->link_ifindex);
if (link_if)
zebra_vxlan_svi_up(ifp, link_if);
- }
+ } else if (IS_ZEBRA_IF_MACVLAN(ifp))
+ zebra_vxlan_macvlan_up(ifp);
+
}
/* Interface goes down. We have to manage different behavior of based
@@ -1092,7 +1094,8 @@ void if_down(struct interface *ifp)
zif->link_ifindex);
if (link_if)
zebra_vxlan_svi_down(ifp, link_if);
- }
+ } else if (IS_ZEBRA_IF_MACVLAN(ifp))
+ zebra_vxlan_macvlan_down(ifp);
/* Notify to the protocol daemons. */
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c
index b2cb726fa..14df91f40 100644
--- a/zebra/zebra_vxlan.c
+++ b/zebra/zebra_vxlan.c
@@ -8563,6 +8563,67 @@ int zebra_vxlan_svi_up(struct interface *ifp, struct interface *link_if)
}
/*
+ * Handle MAC-VLAN interface going down.
+ * L3VNI: When MAC-VLAN interface goes down,
+ * find its associated SVI and update type2/type-5 routes
+ * with SVI as RMAC
+ */
+void zebra_vxlan_macvlan_down(struct interface *ifp)
+{
+ zebra_l3vni_t *zl3vni = NULL;
+ struct zebra_if *zif, *link_zif;
+ struct interface *link_ifp, *link_if;
+
+ zif = ifp->info;
+ assert(zif);
+ link_ifp = zif->link;
+ link_zif = link_ifp->info;
+ assert(link_zif);
+
+ link_if = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
+ link_zif->link_ifindex);
+
+ zl3vni = zl3vni_from_svi(link_ifp, link_if);
+ if (zl3vni) {
+ zl3vni->mac_vlan_if = NULL;
+ if (is_l3vni_oper_up(zl3vni))
+ zebra_vxlan_process_l3vni_oper_up(zl3vni);
+ }
+}
+
+/*
+ * Handle MAC-VLAN interface going up.
+ * L3VNI: When MAC-VLAN interface comes up,
+ * find its associated SVI and update type-2 routes
+ * with MAC-VLAN's MAC as RMAC and for type-5 routes
+ * use SVI's MAC as RMAC.
+ */
+void zebra_vxlan_macvlan_up(struct interface *ifp)
+{
+ zebra_l3vni_t *zl3vni = NULL;
+ struct zebra_if *zif, *link_zif;
+ struct interface *link_ifp, *link_if;
+
+ zif = ifp->info;
+ assert(zif);
+ link_ifp = zif->link;
+ link_zif = link_ifp->info;
+ assert(link_zif);
+
+ link_if = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
+ link_zif->link_ifindex);
+ zl3vni = zl3vni_from_svi(link_ifp, link_if);
+ if (zl3vni) {
+ /* associate with macvlan (VRR) interface */
+ zl3vni->mac_vlan_if = ifp;
+
+ /* process oper-up */
+ if (is_l3vni_oper_up(zl3vni))
+ zebra_vxlan_process_l3vni_oper_up(zl3vni);
+ }
+}
+
+/*
* Handle VxLAN interface down
*/
int zebra_vxlan_if_down(struct interface *ifp)
diff --git a/zebra/zebra_vxlan.h b/zebra/zebra_vxlan.h
index bb80ae1c9..1a85c6e51 100644
--- a/zebra/zebra_vxlan.h
+++ b/zebra/zebra_vxlan.h
@@ -217,6 +217,8 @@ extern int zebra_vxlan_clear_dup_detect_vni(struct vty *vty,
extern void zebra_vxlan_handle_result(struct zebra_dplane_ctx *ctx);
extern void zebra_evpn_init(void);
+extern void zebra_vxlan_macvlan_up(struct interface *ifp);
+extern void zebra_vxlan_macvlan_down(struct interface *ifp);
#ifdef __cplusplus
}