tapv2: add option to set host-side default gw

Change-Id: I76fd655ecd9445299b94b3b5af10e7b1588584e4
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2018-01-18 13:35:11 +01:00
committed by Neale Ranns
parent 929fb9d750
commit 7866c4595b
9 changed files with 115 additions and 3 deletions

View File

@ -7772,8 +7772,12 @@ api_tap_create_v2 (vat_main_t * vam)
u8 host_mac_addr_set = 0;
u8 *host_bridge = 0;
ip4_address_t host_ip4_addr;
ip4_address_t host_ip4_gw;
u8 host_ip4_gw_set = 0;
u32 host_ip4_prefix_len = 0;
ip6_address_t host_ip6_addr;
ip6_address_t host_ip6_gw;
u8 host_ip6_gw_set = 0;
u32 host_ip6_prefix_len = 0;
int ret;
int rx_ring_sz = 0, tx_ring_sz = 0;
@ -7804,6 +7808,12 @@ api_tap_create_v2 (vat_main_t * vam)
else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
&host_ip6_addr, &host_ip6_prefix_len))
;
else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
&host_ip4_gw))
host_ip4_gw_set = 1;
else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
&host_ip6_gw))
host_ip6_gw_set = 1;
else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
;
else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
@ -7885,7 +7895,10 @@ api_tap_create_v2 (vat_main_t * vam)
clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
if (host_ip4_prefix_len)
clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
if (host_ip4_gw_set)
clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
if (host_ip6_gw_set)
clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
vec_free (host_ns);
vec_free (host_if_name);

View File

@ -245,6 +245,48 @@ vnet_netlink_add_ip6_addr (int ifindex, void *addr, int pfx_len)
return vnet_netlink_msg_send (&m);
}
clib_error_t *
vnet_netlink_add_ip4_route (void *dst, u8 dst_len, void *gw)
{
vnet_netlink_msg_t m;
struct rtmsg rtm = { 0 };
u8 dflt[4] = { 0 };
rtm.rtm_family = AF_INET;
rtm.rtm_table = RT_TABLE_MAIN;
rtm.rtm_type = RTN_UNICAST;
rtm.rtm_dst_len = dst_len;
vnet_netlink_msg_init (&m, RTM_NEWROUTE,
NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL,
&rtm, sizeof (struct rtmsg));
vnet_netlink_msg_add_rtattr (&m, RTA_GATEWAY, gw, 4);
vnet_netlink_msg_add_rtattr (&m, RTA_DST, dst ? dst : dflt, 4);
return vnet_netlink_msg_send (&m);
}
clib_error_t *
vnet_netlink_add_ip6_route (void *dst, u8 dst_len, void *gw)
{
vnet_netlink_msg_t m;
struct rtmsg rtm = { 0 };
u8 dflt[16] = { 0 };
rtm.rtm_family = AF_INET6;
rtm.rtm_table = RT_TABLE_MAIN;
rtm.rtm_type = RTN_UNICAST;
rtm.rtm_dst_len = dst_len;
vnet_netlink_msg_init (&m, RTM_NEWROUTE,
NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL,
&rtm, sizeof (struct rtmsg));
vnet_netlink_msg_add_rtattr (&m, RTA_GATEWAY, gw, 16);
vnet_netlink_msg_add_rtattr (&m, RTA_DST, dst ? dst : dflt, 16);
return vnet_netlink_msg_send (&m);
}
/*
* fd.io coding-style-patch-verification: ON
*

View File

@ -26,6 +26,8 @@ clib_error_t *vnet_netlink_add_ip4_addr (int ifindex, void *addr,
int pfx_len);
clib_error_t *vnet_netlink_add_ip6_addr (int ifindex, void *addr,
int pfx_len);
clib_error_t *vnet_netlink_add_ip4_route (void *dst, u8 dst_len, void *gw);
clib_error_t *vnet_netlink_add_ip6_route (void *dst, u8 dst_len, void *gw);
#endif /* included_vnet_device_netlink_h */

View File

@ -61,10 +61,16 @@ tap_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
unformat_ip4_address, &args.host_ip4_addr,
&args.host_ip4_prefix_len))
ip_addr_set = 1;
else if (unformat (line_input, "host-ip4-gw %U",
unformat_ip4_address, &args.host_ip4_gw))
args.host_ip4_gw_set = 1;
else if (unformat (line_input, "host-ip6-addr %U/%d",
unformat_ip6_address, &args.host_ip6_addr,
&args.host_ip6_prefix_len))
ip_addr_set = 1;
else if (unformat (line_input, "host-ip6-gw %U",
unformat_ip6_address, &args.host_ip6_gw))
args.host_ip6_gw_set = 1;
else if (unformat (line_input, "rx-ring-size %d", &args.rx_ring_sz))
;
else if (unformat (line_input, "tx-ring-size %d", &args.tx_ring_sz))
@ -102,7 +108,8 @@ VLIB_CLI_COMMAND (tap_create_command, static) = {
.short_help = "create tap {id <if-id>} [hw-addr <mac-address>] "
"[rx-ring-size <size>] [tx-ring-size <size>] [host-ns <netns>] "
"[host-bridge <bridge-name>] [host-ip4-addr <ip4addr/mask>] "
"[host-ip6-addr <ip6-addr] [host-if-name <name>]",
"[host-ip6-addr <ip6-addr>] [host-ip4-gw <ip4-addr>] "
"[host-ip6-gw <ip6-addr>] [host-if-name <name>]",
.function = tap_create_command_fn,
};
/* *INDENT-ON* */

View File

@ -292,6 +292,26 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
goto error;
}
if (args->host_ip4_gw_set)
{
args->error = vnet_netlink_add_ip4_route (0, 0, &args->host_ip4_gw);
if (args->error)
{
args->rv = VNET_API_ERROR_NETLINK_ERROR;
goto error;
}
}
if (args->host_ip6_gw_set)
{
args->error = vnet_netlink_add_ip6_route (0, 0, &args->host_ip6_gw);
if (args->error)
{
args->rv = VNET_API_ERROR_NETLINK_ERROR;
goto error;
}
}
/* switch back to old net namespace */
if (args->host_namespace)
{

View File

@ -35,8 +35,12 @@ typedef struct
u8 *host_bridge;
ip4_address_t host_ip4_addr;
u8 host_ip4_prefix_len;
ip4_address_t host_ip4_gw;
u8 host_ip4_gw_set;
ip6_address_t host_ip6_addr;
u8 host_ip6_prefix_len;
ip6_address_t host_ip6_gw;
u8 host_ip6_gw_set;
/* return */
u32 sw_if_index;
int rv;

View File

@ -19,7 +19,7 @@
the Linux kernel TAP device driver
*/
vl_api_version 1.0.0
vl_api_version 1.1.0
/** \brief Initialize a new tap interface with the given paramters
@param client_index - opaque cookie to identify the sender
@ -43,6 +43,10 @@ vl_api_version 1.0.0
@param host_ip6_addr_set - host IPv6 ip address should be set
@param host_ip6_addr - host IPv6 ip address
@param host_ip6_prefix_len - host IPv6 ip address prefix length
@param host_ip4_gw_set - host IPv4 default gateway should be set
@param host_ip4_gw - host IPv4 default gateway
@param host_ip6_gw_set - host IPv6 default gateway should be set
@param host_ip6_gw - host IPv6 default gateway
*/
define tap_create_v2
{
@ -67,6 +71,10 @@ define tap_create_v2
u8 host_ip6_addr_set;
u8 host_ip6_addr[16];
u8 host_ip6_prefix_len;
u8 host_ip4_gw_set;
u8 host_ip4_gw[4];
u8 host_ip6_gw_set;
u8 host_ip6_gw[16];
};
/** \brief Reply for tap create reply

View File

@ -96,6 +96,18 @@ vl_api_tap_create_v2_t_handler (vl_api_tap_create_v2_t * mp)
ap->host_ip6_prefix_len = mp->host_ip6_prefix_len;
}
if (mp->host_ip4_gw_set)
{
clib_memcpy (&ap->host_ip4_gw, mp->host_ip4_gw, 4);
ap->host_ip4_gw_set = 1;
}
if (mp->host_ip6_gw_set)
{
clib_memcpy (&ap->host_ip6_gw, mp->host_ip6_gw, 16);
ap->host_ip6_gw_set = 1;
}
tap_create_if (vm, ap);
reg = vl_api_client_index_to_registration (mp->client_index);

View File

@ -576,6 +576,10 @@ static void *vl_api_tap_create_v2_t_print
if (mp->host_ip6_addr_set)
s = format (s, "host-ip6-addr %U/%d ", format_ip6_address,
mp->host_ip6_addr, mp->host_ip6_prefix_len);
if (mp->host_ip4_gw_set)
s = format (s, "host-ip4-gw %U ", format_ip4_address, mp->host_ip4_addr);
if (mp->host_ip6_gw_set)
s = format (s, "host-ip6-gw %U ", format_ip6_address, mp->host_ip6_addr);
if (mp->tx_ring_sz)
s = format (s, "tx-ring-size %d ", mp->tx_ring_sz);
if (mp->rx_ring_sz)