BRIDGE-DOMAIN:enable arp term,mac/ip learning on local ints 34/5934/2
authorEyal Bari <ebari@cisco.com>
Thu, 30 Mar 2017 00:05:06 +0000 (03:05 +0300)
committerEyal Bari <ebari@cisco.com>
Thu, 30 Mar 2017 00:23:37 +0000 (03:23 +0300)
we should not suppress arps on remote interface instead we should  flood them to the local one
used shg != 0 to identify packets from remote interfaces and disable arp term l2 input feature for them

Change-Id: I701537c05df7451a25ccb5bfc9e2b03ea70cff20
Signed-off-by: Eyal Bari <ebari@cisco.com>
src/vnet/ethernet/arp.c
src/vnet/ip/ip6.h
src/vnet/ip/ip6_neighbor.c

index 2f81da3..711b786 100644 (file)
@@ -2222,6 +2222,10 @@ arp_term_l2bd (vlib_main_t * vm,
          n_left_to_next -= 1;
 
          p0 = vlib_get_buffer (vm, pi0);
+         // Terminate only local (SHG == 0) ARP
+         if (vnet_buffer (p0)->l2.shg != 0)
+           goto next_l2_feature;
+
          eth0 = vlib_buffer_get_current (p0);
          l3h0 = (u8 *) eth0 + vnet_buffer (p0)->l2.l2_len;
          ethertype0 = clib_net_to_host_u16 (*(u16 *) (l3h0 - 2));
@@ -2273,8 +2277,8 @@ arp_term_l2bd (vlib_main_t * vm,
            pending_resolution_t *mc;
            ethernet_arp_main_t *am = &ethernet_arp_main;
            uword *p = hash_get (am->mac_changes_by_address, 0);
-           if (p && (vnet_buffer (p0)->l2.shg == 0))
-             {                 // Only SHG 0 interface which is more likely local
+           if (p)
+             {
                u32 next_index = p[0];
                while (next_index != (u32) ~ 0)
                  {
@@ -2335,11 +2339,6 @@ arp_term_l2bd (vlib_main_t * vm,
          /* Send ARP/ND reply back out input interface through l2-output */
          vnet_buffer (p0)->sw_if_index[VLIB_TX] = sw_if_index0;
          next0 = ARP_TERM_NEXT_L2_OUTPUT;
-         /* Note that output to VXLAN tunnel will fail due to SHG which
-            is probably desireable since ARP termination is not intended
-            for ARP requests from other hosts. If output to VXLAN tunnel is
-            required, however, can just clear the SHG in packet as follows:
-            vnet_buffer(p0)->l2.shg = 0;         */
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
                                           to_next, n_left_to_next, pi0,
                                           next0);
@@ -2357,7 +2356,7 @@ arp_term_l2bd (vlib_main_t * vm,
              sw_if_index0 = vnet_buffer (p0)->sw_if_index[VLIB_RX];
              if (vnet_ip6_nd_term
                  (vm, node, p0, eth0, iph0, sw_if_index0,
-                  vnet_buffer (p0)->l2.bd_index, vnet_buffer (p0)->l2.shg))
+                  vnet_buffer (p0)->l2.bd_index))
                goto output_response;
            }
 
index f402b01..8fa9a47 100644 (file)
@@ -373,8 +373,7 @@ int vnet_ip6_nd_term (vlib_main_t * vm,
                      vlib_node_runtime_t * node,
                      vlib_buffer_t * p0,
                      ethernet_header_t * eth,
-                     ip6_header_t * ip,
-                     u32 sw_if_index, u16 bd_index, u8 shg);
+                     ip6_header_t * ip, u32 sw_if_index, u16 bd_index);
 
 u8 *format_ip6_forward_next_trace (u8 * s, va_list * args);
 
index 9b61663..3d48c40 100644 (file)
@@ -3987,12 +3987,11 @@ vnet_ip6_nd_term (vlib_main_t * vm,
                  vlib_node_runtime_t * node,
                  vlib_buffer_t * p0,
                  ethernet_header_t * eth,
-                 ip6_header_t * ip, u32 sw_if_index, u16 bd_index, u8 shg)
+                 ip6_header_t * ip, u32 sw_if_index, u16 bd_index)
 {
   ip6_neighbor_main_t *nm = &ip6_neighbor_main;
   icmp6_neighbor_solicitation_or_advertisement_header_t *ndh;
   pending_resolution_t *mc;
-  uword *p;
 
   ndh = ip6_next_header (ip);
   if (ndh->icmp.type != ICMP6_neighbor_solicitation &&
@@ -4008,9 +4007,8 @@ vnet_ip6_nd_term (vlib_main_t * vm,
     }
 
   /* Check if anyone want ND events for L2 BDs */
-  p = mhash_get (&nm->mac_changes_by_address, &ip6a_zero);
-  if (p && shg == 0 &&         /* Only SHG 0 interface which is more likely local */
-      !ip6_address_is_link_local_unicast (&ip->src_address))
+  uword *p = mhash_get (&nm->mac_changes_by_address, &ip6a_zero);
+  if (p && !ip6_address_is_link_local_unicast (&ip->src_address))
     {
       u32 next_index = p[0];
       while (next_index != (u32) ~ 0)