From 488e74adf48406441434ba5ea7e03339e9c09751 Mon Sep 17 00:00:00 2001 From: Mohsin Kazmi Date: Fri, 28 Feb 2020 14:21:25 +0100 Subject: 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 --- src/vat/api_format.c | 60 +++++++++++++++++++++++++--------------- src/vnet/devices/tap/tap.c | 39 +++++++++++++------------- src/vnet/devices/virtio/virtio.c | 2 ++ src/vpp/api/custom_dump.c | 12 ++++---- 4 files changed, 64 insertions(+), 49 deletions(-) diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 652fe0310c2..a6f53dff557 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -7336,14 +7336,19 @@ api_tap_create_v2 (vat_main_t * vam) u8 random_mac = 1; u32 id = ~0; u8 *host_if_name = 0; + u8 host_if_name_set = 0; u8 *host_ns = 0; + u8 host_ns_set = 0; u8 host_mac_addr[6]; u8 host_mac_addr_set = 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_gw; u8 host_ip4_gw_set = 0; u32 host_ip4_prefix_len = 0; + u8 host_ip6_addr_set = 0; ip6_address_t host_ip6_addr; ip6_address_t host_ip6_gw; 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, "host-if-name %s", &host_if_name)) + else if (unformat (i, "rx-ring-size %d", &rx_ring_sz)) ; - else if (unformat (i, "host-ns %s", &host_ns)) + else if (unformat (i, "tx-ring-size %d", &tx_ring_sz)) ; + 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)) + host_ns_set = 1; else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address, host_mac_addr)) host_mac_addr_set = 1; 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, &host_ip4_addr, &host_ip4_prefix_len)) - ; + host_ip4_addr_set = 1; else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address, &host_ip6_addr, &host_ip6_prefix_len)) - ; + host_ip6_addr_set = 1; 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)) - ; else if (unformat (i, "host-mtu-size %d", &host_mtu_size)) host_mtu_set = 1; else if (unformat (i, "no-gso")) @@ -7454,15 +7459,18 @@ api_tap_create_v2 (vat_main_t * vam) /* Construct the API message */ M (TAP_CREATE_V2, mp); - mp->use_random_mac = random_mac; - mp->id = ntohl (id); - mp->host_namespace_set = host_ns != 0; - 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->use_random_mac = random_mac; mp->rx_ring_sz = ntohs (rx_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_size = ntohl (host_mtu_size); 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); if (host_mac_addr_set) 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)); - if (host_ns) + if (host_ns_set) 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)); - if (host_ip4_prefix_len) - clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4); - if (host_ip6_prefix_len) - clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16); + if (host_ip4_addr_set) + { + clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4); + 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) clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4); if (host_ip6_gw_set) @@ -21705,7 +21719,7 @@ _(l2_flags, \ _(bridge_flags, \ "bd_id [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \ _(tap_create_v2, \ - "id [hw-addr ] [host-ns ] [rx-ring-size [tx-ring-size ] [host-mtu-size ] [gso | no-gso]") \ + "id [hw-addr ] [rx-ring-size ] [tx-ring-size ] [host-if-name ] [host-mac-addr ] [host-ns ] [host-bridge ] [host-ip4-addr ] [host-ip6-addr ] [host-ip4-gw ] [host-ip6-gw ] [host-mtu-size ] [gso | no-gso]") \ _(tap_delete_v2, \ " | sw_if_index ") \ _(sw_interface_tap_v2_dump, "") \ diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index f2903a95adc..7f0a0e9943d 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -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->host_mac_addr); - if (args->error) - { - args->rv = VNET_API_ERROR_NETLINK_ERROR; - goto error; - } + args->rv = VNET_API_ERROR_NETLINK_ERROR; + goto error; } 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) { 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; } + /* 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 */ i = sizeof (struct vhost_memory) + sizeof (struct vhost_memory_region); vhost_mem = clib_mem_alloc (i); diff --git a/src/vnet/devices/virtio/virtio.c b/src/vnet/devices/virtio/virtio.c index 90adf97dc3c..88511d74411 100644 --- a/src/vnet/devices/virtio/virtio.c +++ b/src/vnet/devices/virtio/virtio.c @@ -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); if (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) vlib_cli_output (vm, " host-mtu-size \"%d\"", vif->host_mtu_size); diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c index 16145a9287d..6ad0f9ce9c7 100644 --- a/src/vpp/api/custom_dump.c +++ b/src/vpp/api/custom_dump.c @@ -551,10 +551,14 @@ static void *vl_api_tap_create_v2_t_print s = format (0, "SCRIPT: tap_create_v2 "); 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 ", 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 ", format_ethernet_address, mp->host_mac_addr); 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); 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 %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) s = format (s, "host-mtu-size %u ", ntohl (mp->host_mtu_size)); if (ntohl (mp->tap_flags) & 0x1) -- cgit 1.2.3-korg