tap: misc fixes 42/25542/2
authorMohsin Kazmi <sykazmi@cisco.com>
Fri, 28 Feb 2020 13:21:25 +0000 (14:21 +0100)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Wed, 4 Mar 2020 20:08:24 +0000 (20:08 +0000)
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>
src/vat/api_format.c
src/vnet/devices/tap/tap.c
src/vnet/devices/virtio/virtio.c
src/vpp/api/custom_dump.c

index 652fe03..a6f53df 100644 (file)
@@ -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 <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
 _(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,                                                        \
   "<vpp-if-name> | sw_if_index <id>")                                   \
 _(sw_interface_tap_v2_dump, "")                                         \
index f2903a9..7f0a0e9 100644 (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->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);
index 90adf97..88511d7 100644 (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);
          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);
index 16145a9..6ad0f9c 100644 (file)
@@ -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)