l2-rw: Packet rewrite feature for L2 bridges
[vpp.git] / vnet / vnet / l2 / l2_input.c
index 31744f5..a42fcae 100644 (file)
@@ -39,6 +39,11 @@ ethernet_arp_hw_interface_link_up_down (vnet_main_t * vnm,
                                         u32 hw_if_index,
                                         u32 flags);
 
+extern clib_error_t *
+ip6_discover_neighbor_hw_interface_link_up_down (vnet_main_t * vnm,
+                                                 u32 hw_if_index,
+                                                 u32 flags);
+
 // Feature graph node names
 static char * l2input_feat_names[] = {
 #define _(sym,name) name,
@@ -502,7 +507,16 @@ u32 l2input_intf_bitmap_enable (u32 sw_if_index,
   return config->feature_bitmap;
 }
 
-
+u32 l2input_set_bridge_features(u32 bd_index,
+                                 u32 feat_mask, u32 feat_value)
+{
+  l2_bridge_domain_t * bd_config;
+  vec_validate (l2input_main.bd_configs, bd_index);
+  bd_config = vec_elt_at_index(l2input_main.bd_configs, bd_index);
+  bd_validate (bd_config);
+  bd_config->feature_bitmap = (bd_config->feature_bitmap & ~feat_mask) | feat_value;
+  return bd_config->feature_bitmap;
+}
 
 // Set the subinterface to run in l2 or l3 mode.
 // for L3 mode, just the sw_if_index is specified
@@ -552,6 +566,10 @@ u32 set_int_l2_mode (vlib_main_t * vm,
       // delete the l2fib entry for the bvi interface
       mac = *((u64 *)hi->hw_address);
       l2fib_del_entry (mac, config->bd_index);
+
+      // Let ARP and NDP know that the output node index changed
+      ethernet_arp_hw_interface_link_up_down(vnet_main, hi->hw_if_index, 0);
+      ip6_discover_neighbor_hw_interface_link_up_down(vnet_main, hi->hw_if_index, 0);
     } 
     l2_if_adjust--;
   } else if (config->xconnect) {
@@ -635,10 +653,10 @@ u32 set_int_l2_mode (vlib_main_t * vm,
         // Disable learning by default. no use since l2fib entry is static.
         config->feature_bitmap &= ~L2INPUT_FEAT_LEARN;
 
-        // Add BVI to arp_input_next_index_by_hw_if_index table so arp-input
-        // node can send out ARP response via BVI to BD
+        // Let ARP and NDP know that the output_index_node changed so they
+        // can send requests via BVI to BD
         ethernet_arp_hw_interface_link_up_down(vnet_main, hi->hw_if_index, 0);
+        ip6_discover_neighbor_hw_interface_link_up_down(vnet_main, hi->hw_if_index, 0);
       }
 
       // Add interface to bridge-domain flood vector