Add an API call to set interface MAC addresses.

Change-Id: I316862e1d33e5d10c058317cc4827304e55ceba4
Signed-off-by: Jon Loeliger <jdl@netgate.com>
This commit is contained in:
Jon Loeliger
2017-03-30 08:39:33 -05:00
committed by Damjan Marion
parent fa5d198297
commit 10c273bc24
2 changed files with 59 additions and 2 deletions

View 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:
*/

View 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.