tap: misc fixes

Ticket: VPPSUPP-58

1) Previously, host mtu can't be set if tap interface is in namespace.
2) generate the host mac address, if it is not provided.
3) fix the parameters for tap_create_v2 in vat.
4) fix the pretty print of parameters for tap_create_v2 in custom dump.

Type: fix

Change-Id: I18898af90dbd37d773a40b6535dd9c03c9984679
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
This commit is contained in:
Mohsin Kazmi
2020-02-28 14:21:25 +01:00
committed by Andrew Yourtchenko
parent 03bcbd3621
commit 488e74adf4
4 changed files with 64 additions and 49 deletions

View File

@ -7336,14 +7336,19 @@ api_tap_create_v2 (vat_main_t * vam)
u8 random_mac = 1; u8 random_mac = 1;
u32 id = ~0; u32 id = ~0;
u8 *host_if_name = 0; u8 *host_if_name = 0;
u8 host_if_name_set = 0;
u8 *host_ns = 0; u8 *host_ns = 0;
u8 host_ns_set = 0;
u8 host_mac_addr[6]; u8 host_mac_addr[6];
u8 host_mac_addr_set = 0; u8 host_mac_addr_set = 0;
u8 *host_bridge = 0; u8 *host_bridge = 0;
u8 host_bridge_set = 0;
u8 host_ip4_addr_set = 0;
ip4_address_t host_ip4_addr; ip4_address_t host_ip4_addr;
ip4_address_t host_ip4_gw; ip4_address_t host_ip4_gw;
u8 host_ip4_gw_set = 0; u8 host_ip4_gw_set = 0;
u32 host_ip4_prefix_len = 0; u32 host_ip4_prefix_len = 0;
u8 host_ip6_addr_set = 0;
ip6_address_t host_ip6_addr; ip6_address_t host_ip6_addr;
ip6_address_t host_ip6_gw; ip6_address_t host_ip6_gw;
u8 host_ip6_gw_set = 0; u8 host_ip6_gw_set = 0;
@ -7365,31 +7370,31 @@ api_tap_create_v2 (vat_main_t * vam)
} }
else if (unformat (i, "id %u", &id)) else if (unformat (i, "id %u", &id))
; ;
else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
;
else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
;
else if (unformat (i, "host-if-name %s", &host_if_name)) else if (unformat (i, "host-if-name %s", &host_if_name))
; host_if_name_set = 1;
else if (unformat (i, "host-ns %s", &host_ns)) else if (unformat (i, "host-ns %s", &host_ns))
; host_ns_set = 1;
else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address, else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
host_mac_addr)) host_mac_addr))
host_mac_addr_set = 1; host_mac_addr_set = 1;
else if (unformat (i, "host-bridge %s", &host_bridge)) else if (unformat (i, "host-bridge %s", &host_bridge))
; host_bridge_set = 1;
else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address, else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
&host_ip4_addr, &host_ip4_prefix_len)) &host_ip4_addr, &host_ip4_prefix_len))
; host_ip4_addr_set = 1;
else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address, else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
&host_ip6_addr, &host_ip6_prefix_len)) &host_ip6_addr, &host_ip6_prefix_len))
; host_ip6_addr_set = 1;
else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address, else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
&host_ip4_gw)) &host_ip4_gw))
host_ip4_gw_set = 1; host_ip4_gw_set = 1;
else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address, else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
&host_ip6_gw)) &host_ip6_gw))
host_ip6_gw_set = 1; 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))
;
else if (unformat (i, "host-mtu-size %d", &host_mtu_size)) else if (unformat (i, "host-mtu-size %d", &host_mtu_size))
host_mtu_set = 1; host_mtu_set = 1;
else if (unformat (i, "no-gso")) else if (unformat (i, "no-gso"))
@ -7454,15 +7459,18 @@ api_tap_create_v2 (vat_main_t * vam)
/* Construct the API message */ /* Construct the API message */
M (TAP_CREATE_V2, mp); M (TAP_CREATE_V2, mp);
mp->use_random_mac = random_mac;
mp->id = ntohl (id); mp->id = ntohl (id);
mp->host_namespace_set = host_ns != 0; mp->use_random_mac = random_mac;
mp->host_bridge_set = host_bridge != 0;
mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
mp->rx_ring_sz = ntohs (rx_ring_sz); mp->rx_ring_sz = ntohs (rx_ring_sz);
mp->tx_ring_sz = ntohs (tx_ring_sz); mp->tx_ring_sz = ntohs (tx_ring_sz);
mp->host_if_name_set = host_if_name_set;
mp->host_namespace_set = host_ns_set;
mp->host_mac_addr_set = host_mac_addr_set;
mp->host_bridge_set = host_bridge_set;
mp->host_ip4_addr_set = host_ip4_addr_set;
mp->host_ip6_addr_set = host_ip6_addr_set;
mp->host_ip4_gw_set = host_ip4_gw_set;
mp->host_ip6_gw_set = host_ip6_gw_set;
mp->host_mtu_set = host_mtu_set; mp->host_mtu_set = host_mtu_set;
mp->host_mtu_size = ntohl (host_mtu_size); mp->host_mtu_size = ntohl (host_mtu_size);
mp->tap_flags = ntohl (tap_flags); mp->tap_flags = ntohl (tap_flags);
@ -7471,16 +7479,22 @@ api_tap_create_v2 (vat_main_t * vam)
clib_memcpy (mp->mac_address, mac_address, 6); clib_memcpy (mp->mac_address, mac_address, 6);
if (host_mac_addr_set) if (host_mac_addr_set)
clib_memcpy (mp->host_mac_addr, host_mac_addr, 6); clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
if (host_if_name) if (host_if_name_set)
clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name)); clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
if (host_ns) if (host_ns_set)
clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns)); clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
if (host_bridge) if (host_bridge_set)
clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge)); clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
if (host_ip4_prefix_len) if (host_ip4_addr_set)
clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4); {
if (host_ip6_prefix_len) clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16); mp->host_ip4_prefix_len = (u8) host_ip4_prefix_len;
}
if (host_ip6_addr_set)
{
clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
mp->host_ip6_prefix_len = (u8) host_ip4_prefix_len;
}
if (host_ip4_gw_set) if (host_ip4_gw_set)
clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4); clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
if (host_ip6_gw_set) if (host_ip6_gw_set)
@ -21705,7 +21719,7 @@ _(l2_flags, \
_(bridge_flags, \ _(bridge_flags, \
"bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \ "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
_(tap_create_v2, \ _(tap_create_v2, \
"id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>] [host-mtu-size <mtu>] [gso | no-gso]") \ "id <num> [hw-addr <mac-addr>] [rx-ring-size <num>] [tx-ring-size <num>] [host-if-name <name>] [host-mac-addr <host-mac-address>] [host-ns <name>] [host-bridge <bridge-name>] [host-ip4-addr <ip4addr/mask>] [host-ip6-addr <ip6-addr>] [host-ip4-gw <ip4-addr>] [host-ip6-gw <ip6-addr>] [host-mtu-size <mtu>] [gso | no-gso]") \
_(tap_delete_v2, \ _(tap_delete_v2, \
"<vpp-if-name> | sw_if_index <id>") \ "<vpp-if-name> | sw_if_index <id>") \
_(sw_interface_tap_v2_dump, "") \ _(sw_interface_tap_v2_dump, "") \

View File

@ -246,15 +246,14 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
} }
} }
if (!ethernet_mac_address_is_zero (args->host_mac_addr)) if (ethernet_mac_address_is_zero (args->host_mac_addr))
ethernet_mac_address_generate (args->host_mac_addr);
args->error = vnet_netlink_set_link_addr (vif->ifindex,
args->host_mac_addr);
if (args->error)
{ {
args->error = vnet_netlink_set_link_addr (vif->ifindex, args->rv = VNET_API_ERROR_NETLINK_ERROR;
args->host_mac_addr); goto error;
if (args->error)
{
args->rv = VNET_API_ERROR_NETLINK_ERROR;
goto error;
}
} }
if (args->host_bridge) if (args->host_bridge)
@ -320,18 +319,6 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
} }
} }
/* switch back to old net namespace */
if (args->host_namespace)
{
if (setns (old_netns_fd, CLONE_NEWNET) == -1)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_2;
args->error = clib_error_return_unix (0, "setns '%s'",
args->host_namespace);
goto error;
}
}
if (args->host_mtu_set) if (args->host_mtu_set)
{ {
args->error = args->error =
@ -355,6 +342,18 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
args->host_mtu_size = tm->host_mtu_size; args->host_mtu_size = tm->host_mtu_size;
} }
/* switch back to old net namespace */
if (args->host_namespace)
{
if (setns (old_netns_fd, CLONE_NEWNET) == -1)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_2;
args->error = clib_error_return_unix (0, "setns '%s'",
args->host_namespace);
goto error;
}
}
/* Set vhost memory table */ /* Set vhost memory table */
i = sizeof (struct vhost_memory) + sizeof (struct vhost_memory_region); i = sizeof (struct vhost_memory) + sizeof (struct vhost_memory_region);
vhost_mem = clib_mem_alloc (i); vhost_mem = clib_mem_alloc (i);

View File

@ -317,6 +317,8 @@ virtio_show (vlib_main_t * vm, u32 * hw_if_indices, u8 show_descr, u32 type)
vlib_cli_output (vm, " name \"%s\"", vif->host_if_name); vlib_cli_output (vm, " name \"%s\"", vif->host_if_name);
if (vif->net_ns) if (vif->net_ns)
vlib_cli_output (vm, " host-ns \"%s\"", vif->net_ns); vlib_cli_output (vm, " host-ns \"%s\"", vif->net_ns);
vlib_cli_output (vm, " host-mac-addr %U", format_ethernet_address,
vif->host_mac_addr);
if (vif->host_mtu_size) if (vif->host_mtu_size)
vlib_cli_output (vm, " host-mtu-size \"%d\"", vlib_cli_output (vm, " host-mtu-size \"%d\"",
vif->host_mtu_size); vif->host_mtu_size);

View File

@ -551,10 +551,14 @@ static void *vl_api_tap_create_v2_t_print
s = format (0, "SCRIPT: tap_create_v2 "); s = format (0, "SCRIPT: tap_create_v2 ");
s = format (s, "id %u ", ntohl (mp->id)); s = format (s, "id %u ", ntohl (mp->id));
if (memcmp (mp->mac_address, null_mac, 6)) if (mp->use_random_mac == 0)
s = format (s, "mac-address %U ", s = format (s, "mac-address %U ",
format_ethernet_address, mp->mac_address); format_ethernet_address, mp->mac_address);
if (memcmp (mp->host_mac_addr, null_mac, 6)) if (mp->tx_ring_sz)
s = format (s, "tx-ring-size %u ", ntohs (mp->tx_ring_sz));
if (mp->rx_ring_sz)
s = format (s, "rx-ring-size %u ", ntohs (mp->rx_ring_sz));
if (mp->host_mac_addr_set)
s = format (s, "host-mac-addr %U ", s = format (s, "host-mac-addr %U ",
format_ethernet_address, mp->host_mac_addr); format_ethernet_address, mp->host_mac_addr);
if (mp->host_if_name_set) if (mp->host_if_name_set)
@ -573,10 +577,6 @@ static void *vl_api_tap_create_v2_t_print
s = format (s, "host-ip4-gw %U ", format_ip4_address, mp->host_ip4_addr); s = format (s, "host-ip4-gw %U ", format_ip4_address, mp->host_ip4_addr);
if (mp->host_ip6_gw_set) if (mp->host_ip6_gw_set)
s = format (s, "host-ip6-gw %U ", format_ip6_address, mp->host_ip6_addr); 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 %u ", ntohs (mp->tx_ring_sz));
if (mp->rx_ring_sz)
s = format (s, "rx-ring-size %u ", ntohs (mp->rx_ring_sz));
if (mp->host_mtu_set) if (mp->host_mtu_set)
s = format (s, "host-mtu-size %u ", ntohl (mp->host_mtu_size)); s = format (s, "host-mtu-size %u ", ntohl (mp->host_mtu_size));
if (ntohl (mp->tap_flags) & 0x1) if (ntohl (mp->tap_flags) & 0x1)