sr: fix srv6/srv6-ad/srv6-as promisc mode switch 29/27029/3
authorJohn Lo <loj@cisco.com>
Wed, 13 May 2020 05:38:12 +0000 (01:38 -0400)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Wed, 13 May 2020 19:02:46 +0000 (19:02 +0000)
Calling ethernet_set_flags() to switch interface to/from promiscuous
mode must use use hw_if_index instead of sw_if_index.

Type: fix

Signed-off-by: John Lo <loj@cisco.com>
Change-Id: I72da286b913893227e32193ee11fbbc56e04804d

src/plugins/srv6-ad/ad.c
src/plugins/srv6-as/as.c
src/vnet/srv6/sr_steering.c

index 1b11037..045ddeb 100644 (file)
@@ -105,8 +105,12 @@ srv6_ad_localsid_creation_fn (ip6_sr_localsid_t * localsid)
 
       /* Set interface in promiscuous mode */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_set_flags (vnm, ls_mem->sw_if_index_in,
-                         ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
+      vnet_hw_interface_t *hi =
+       vnet_get_sup_hw_interface (vnm, ls_mem->sw_if_index_in);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == ls_mem->sw_if_index_in)
+       ethernet_set_flags (vnm, hi->hw_if_index,
+                           ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
 
       /* Associate local SID index to this interface (resize vector if needed) */
       if (ls_mem->sw_if_index_in >= vec_len (sm->sw_iface_localsid2))
@@ -196,7 +200,11 @@ srv6_ad_localsid_removal_fn (ip6_sr_localsid_t * localsid)
 
       /* Disable promiscuous mode on the interface */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_set_flags (vnm, ls_mem->sw_if_index_in, 0);
+      vnet_hw_interface_t *hi =
+       vnet_get_sup_hw_interface (vnm, ls_mem->sw_if_index_in);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == ls_mem->sw_if_index_in)
+       ethernet_set_flags (vnm, hi->hw_if_index, 0);
 
       /* Remove local SID index from interface table */
       sm->sw_iface_localsid2[ls_mem->sw_if_index_in] = ~(u32) 0;
index 1876765..d9dbd8a 100644 (file)
@@ -177,8 +177,12 @@ srv6_as_localsid_creation_fn (ip6_sr_localsid_t * localsid)
 
       /* Set interface in promiscuous mode */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_set_flags (vnm, ls_mem->sw_if_index_in,
-                         ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
+      vnet_hw_interface_t *hi =
+       vnet_get_sup_hw_interface (vnm, ls_mem->sw_if_index_in);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == ls_mem->sw_if_index_in)
+       ethernet_set_flags (vnm, hi->hw_if_index,
+                           ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
 
       /* Prepare rewrite string */
       ls_mem->rewrite = prepare_rewrite (ls_mem->src_addr, ls_mem->sid_list,
@@ -278,7 +282,11 @@ srv6_as_localsid_removal_fn (ip6_sr_localsid_t * localsid)
 
       /* Disable promiscuous mode on the interface */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_set_flags (vnm, ls_mem->sw_if_index_in, 0);
+      vnet_hw_interface_t *hi =
+       vnet_get_sup_hw_interface (vnm, ls_mem->sw_if_index_in);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == ls_mem->sw_if_index_in)
+       ethernet_set_flags (vnm, hi->hw_if_index, 0);
 
       /* Remove local SID index from interface table */
       sm->sw_iface_localsid2[ls_mem->sw_if_index_in] = ~(u32) 0;
index 566ba1f..aa98a45 100755 (executable)
@@ -146,14 +146,11 @@ sr_steering_policy (int is_del, ip6_address_t * bsid, u32 sr_policy_index,
 
              /* Remove promiscous mode from interface */
              vnet_main_t *vnm = vnet_get_main ();
-             ethernet_main_t *em = &ethernet_main;
-             ethernet_interface_t *eif =
-               ethernet_get_interface (em, sw_if_index);
-
-             if (!eif)
-               goto cleanup_error_redirection;
-
-             ethernet_set_flags (vnm, sw_if_index, 0);
+             vnet_hw_interface_t *hi =
+               vnet_get_sup_hw_interface (vnm, sw_if_index);
+             /* Make sure it is main interface */
+             if (hi->sw_if_index == sw_if_index)
+               ethernet_set_flags (vnm, hi->hw_if_index, 0);
            }
 
          /* Delete SR steering policy entry */
@@ -289,14 +286,11 @@ sr_steering_policy (int is_del, ip6_address_t * bsid, u32 sr_policy_index,
 
       /* Set promiscous mode on interface */
       vnet_main_t *vnm = vnet_get_main ();
-      ethernet_main_t *em = &ethernet_main;
-      ethernet_interface_t *eif = ethernet_get_interface (em, sw_if_index);
-
-      if (!eif)
-       goto cleanup_error_redirection;
-
-      ethernet_set_flags (vnm, sw_if_index,
-                         ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
+      vnet_hw_interface_t *hi = vnet_get_sup_hw_interface (vnm, sw_if_index);
+      /* Make sure it is main interface */
+      if (hi->sw_if_index == sw_if_index)
+       ethernet_set_flags (vnm, hi->hw_if_index,
+                           ETHERNET_INTERFACE_FLAG_ACCEPT_ALL);
     }
   else if (traffic_type == SR_STEER_IPV4)
     if (!sr_policy->is_encap)