summaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/interface.api26
-rw-r--r--src/vnet/interface_api.c35
2 files changed, 59 insertions, 2 deletions
diff --git a/src/vnet/interface.api b/src/vnet/interface.api
index afa8bb5e7c4..85fd73fb280 100644
--- a/src/vnet/interface.api
+++ b/src/vnet/interface.api
@@ -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:
*/
-
diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c
index 0b4fa81a767..ab0b255ab5a 100644
--- a/src/vnet/interface_api.c
+++ b/src/vnet/interface_api.c
@@ -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.