]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_vxlan.c
zebra: lookup link by ifindex
[mirror_frr.git] / zebra / zebra_vxlan.c
index 86c3ce1d00b7643f21d5f3d67bb94cc62febb5af..32c0e20a917b53e092cca0bc0f5ba7742a81943b 100644 (file)
@@ -1777,6 +1777,9 @@ static zebra_vni_t *zvni_map_svi(struct interface *ifp, struct interface *br_if)
        vlanid_t vid = 0;
        zebra_vni_t *zvni;
 
+       if (!br_if)
+               return NULL;
+
        /* Make sure the linked interface is a bridge. */
        if (!IS_ZEBRA_IF_BRIDGE(br_if))
                return NULL;
@@ -3886,7 +3889,11 @@ int zebra_vxlan_add_del_gw_macip(struct interface *ifp, struct prefix *p,
                if (!ifp_zif)
                        return -1;
 
-               svi_if = ifp_zif->link;
+               /*
+                * for a MACVLAN interface the link represents the svi_if
+                */
+               svi_if = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
+                                                  ifp_zif->link_ifindex);
                if (!svi_if) {
                        zlog_err("%u:MACVLAN %s(%u) without link information",
                                 ifp->vrf_id, ifp->name, ifp->ifindex);
@@ -3894,19 +3901,39 @@ int zebra_vxlan_add_del_gw_macip(struct interface *ifp, struct prefix *p,
                }
 
                if (IS_ZEBRA_IF_VLAN(svi_if)) {
+                       /*
+                        * If it is a vlan aware bridge then the link gives the
+                        * bridge information
+                        */
+                       struct interface *svi_if_link = NULL;
+
                        svi_if_zif = svi_if->info;
-                       if (svi_if_zif)
-                               zvni = zvni_map_svi(svi_if, svi_if_zif->link);
+                       if (svi_if_zif) {
+                               svi_if_link = if_lookup_by_index_per_ns(
+                                                       zebra_ns_lookup(
+                                                               NS_DEFAULT),
+                                                       svi_if_zif->link_ifindex);
+                               zvni = zvni_map_svi(svi_if, svi_if_link);
+                       }
                } else if (IS_ZEBRA_IF_BRIDGE(svi_if)) {
+                       /*
+                        * If it is a vlan unaware bridge then svi is the bridge
+                        * itself
+                        */
                        zvni = zvni_map_svi(svi_if, svi_if);
                }
        } else if (IS_ZEBRA_IF_VLAN(ifp)) {
                struct zebra_if *svi_if_zif =
-                       NULL; /* Zebra daemon specific info for SVI*/
+                       NULL; /* Zebra daemon specific info for SVI */
+               struct interface *svi_if_link =
+                       NULL; /* link info for the SVI = bridge info */
 
                svi_if_zif = ifp->info;
-               if (svi_if_zif)
-                       zvni = zvni_map_svi(ifp, svi_if_zif->link);
+               svi_if_link =
+                       if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT),
+                                                 svi_if_zif->link_ifindex);
+               if (svi_if_zif && svi_if_link)
+                       zvni = zvni_map_svi(ifp, svi_if_link);
        } else if (IS_ZEBRA_IF_BRIDGE(ifp)) {
                zvni = zvni_map_svi(ifp, ifp);
        }