diff options
-rw-r--r-- | src/vnet/interface.api | 26 | ||||
-rw-r--r-- | src/vnet/interface_api.c | 35 |
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. |