VPP-363: add ability to change mac address of the interface
[vpp.git] / vnet / vnet / ethernet / arp.c
index d08764a..7d61843 100644 (file)
@@ -1088,12 +1088,13 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
                    /*
                     * Rewind buffer, direct code above not to
                     * think too hard about it.
-                    * $$$ is the answer ever anything other than
-                    * vlib_buffer_reset(..)?
                     */
                    if_addr0 = &proxy_src;
                    is_unnum0 = 0;
-                   vlib_buffer_reset (p0);
+                   i32 ethernet_start =
+                     vnet_buffer (p0)->ethernet.start_of_ethernet_header;
+                   i32 rewind = p0->current_data - ethernet_start;
+                   vlib_buffer_advance (p0, -rewind);
                    n_proxy_arp_replies_sent++;
                    goto send_reply;
                  }
@@ -2342,6 +2343,43 @@ arp_term_init (vlib_main_t * vm)
 
 VLIB_INIT_FUNCTION (arp_term_init);
 
+void
+change_arp_mac (u32 sw_if_index, ethernet_arp_ip4_entry_t * e)
+{
+  if (e->sw_if_index == sw_if_index)
+    {
+
+      if (ADJ_INDEX_INVALID != e->adj_index[FIB_LINK_IP4])
+       {
+         // the update rewrite function takes the dst mac (which is not changing)
+         // the new source mac will be retrieved from the interface
+         // when the full rewrite is constructed.
+         adj_nbr_update_rewrite (e->adj_index[FIB_LINK_IP4],
+                                 e->ethernet_address);
+       }
+      if (ADJ_INDEX_INVALID != e->adj_index[FIB_LINK_MPLS])
+       {
+         adj_nbr_update_rewrite (e->adj_index[FIB_LINK_MPLS],
+                                 e->ethernet_address);
+       }
+
+    }
+}
+
+void
+ethernet_arp_change_mac (vnet_main_t * vnm, u32 sw_if_index)
+{
+  ethernet_arp_main_t *am = &ethernet_arp_main;
+  ethernet_arp_ip4_entry_t *e;
+
+  /* *INDENT-OFF* */
+  pool_foreach (e, am->ip4_entry_pool,
+    ({
+      change_arp_mac (sw_if_index, e);
+    }));
+  /* *INDENT-ON* */
+}
+
 /*
  * fd.io coding-style-patch-verification: ON
  *