Add an API call to set interface MAC addresses. 44/5844/6
authorJon Loeliger <jdl@netgate.com>
Thu, 30 Mar 2017 13:39:33 +0000 (08:39 -0500)
committerDamjan Marion <dmarion.lists@gmail.com>
Mon, 3 Apr 2017 08:47:08 +0000 (08:47 +0000)
Change-Id: I316862e1d33e5d10c058317cc4827304e55ceba4
Signed-off-by: Jon Loeliger <jdl@netgate.com>
src/vnet/interface.api
src/vnet/interface_api.c

index afa8bb5..85fd73f 100644 (file)
@@ -346,9 +346,33 @@ define sw_interface_tag_add_del_reply
     u32 context;
     i32 retval;
 };
+
+/** \brief Set an interface's MAC address
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+    @param sw_if_index - the interface whose MAC will be set
+    @param mac_addr - the new MAC address
+*/
+define sw_interface_set_mac_address
+{
+    u32 client_index;
+    u32 context;
+    u32 sw_if_index;
+    u8 mac_address[6];
+};
+
+/** \brief Reply to setting an interface MAC address request
+    @param context - sender context which was passed in the request
+    @param retval - return code for the request
+*/
+define sw_interface_set_mac_address_reply
+{
+    u32 context;
+    i32 retval;
+};
+
 /*
  * Local Variables:
  * eval: (c-set-style "gnu")
  * End:
  */
-
index 0b4fa81..ab0b255 100644 (file)
@@ -58,7 +58,8 @@ _(SW_INTERFACE_SET_TABLE, sw_interface_set_table)               \
 _(SW_INTERFACE_GET_TABLE, sw_interface_get_table)               \
 _(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered)     \
 _(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats)           \
-_(SW_INTERFACE_TAG_ADD_DEL, sw_interface_tag_add_del)
+_(SW_INTERFACE_TAG_ADD_DEL, sw_interface_tag_add_del)           \
+_(SW_INTERFACE_SET_MAC_ADDRESS, sw_interface_set_mac_address)
 
 static void
 vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
@@ -726,6 +727,38 @@ out:
   REPLY_MACRO (VL_API_SW_INTERFACE_TAG_ADD_DEL_REPLY);
 }
 
+static void vl_api_sw_interface_set_mac_address_t_handler
+  (vl_api_sw_interface_set_mac_address_t * mp)
+{
+  vl_api_sw_interface_set_mac_address_reply_t *rmp;
+  vnet_main_t *vnm = vnet_get_main ();
+  u32 sw_if_index = ntohl (mp->sw_if_index);
+  u64 mac;
+  clib_error_t *error;
+  int rv = 0;
+
+  VALIDATE_SW_IF_INDEX (mp);
+
+  mac = ((u64) mp->mac_address[0] << (8 * 0)
+        | (u64) mp->mac_address[1] << (8 * 1)
+        | (u64) mp->mac_address[2] << (8 * 2)
+        | (u64) mp->mac_address[3] << (8 * 3)
+        | (u64) mp->mac_address[4] << (8 * 4)
+        | (u64) mp->mac_address[5] << (8 * 5));
+
+  error = vnet_hw_interface_change_mac_address (vnm, sw_if_index, mac);
+  if (error)
+    {
+      rv = VNET_API_ERROR_UNIMPLEMENTED;
+      clib_error_report (error);
+      goto out;
+    }
+
+  BAD_SW_IF_INDEX_LABEL;
+out:
+  REPLY_MACRO (VL_API_SW_INTERFACE_SET_MAC_ADDRESS_REPLY);
+}
+
 /*
  * vpe_api_hookup
  * Add vpe's API message handlers to the table.