tap: fix the host mac address

Tap configuration code sets the host mac address
two time. This patch fixes it.

Type: fix

Change-Id: I7bebb9b7f25352a8a9a98bae6a0636757c0cea9c
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
diff --git a/src/vnet/devices/tap/cli.c b/src/vnet/devices/tap/cli.c
index 8d5e3b4..8d59210 100644
--- a/src/vnet/devices/tap/cli.c
+++ b/src/vnet/devices/tap/cli.c
@@ -57,7 +57,8 @@
 	  else if (unformat (line_input, "host-ns %s", &args.host_namespace))
 	    ;
 	  else if (unformat (line_input, "host-mac-addr %U",
-			     unformat_ethernet_address, args.host_mac_addr))
+			     unformat_ethernet_address,
+			     args.host_mac_addr.bytes))
 	    ;
 	  else if (unformat (line_input, "host-bridge %s", &args.host_bridge))
 	    ;
diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c
index a1cb69d..f47c1ea 100644
--- a/src/vnet/devices/tap/tap.c
+++ b/src/vnet/devices/tap/tap.c
@@ -170,10 +170,6 @@
   vif->num_rxqs = args->num_rx_queues;
   num_q_pairs = clib_max (vif->num_rxqs, vif->num_txqs);
 
-  if (ethernet_mac_address_is_zero (args->host_mac_addr.bytes))
-    ethernet_mac_address_generate (args->host_mac_addr.bytes);
-  clib_memcpy (vif->host_mac_addr, args->host_mac_addr.bytes, 6);
-
   if ((vif->tap_fd = tfd = open ("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0)
     {
       args->rv = VNET_API_ERROR_SYSCALL_ERROR_2;
@@ -245,13 +241,6 @@
   tap_log_dbg (vif, "TUNSETOFFLOAD: fd %d offload 0x%lx", tfd, offload);
   _IOCTL (tfd, TUNSETOFFLOAD, offload);
 
-  clib_memset (&ifr, 0, sizeof (ifr));
-  ifr.ifr_addr.sa_family = ARPHRD_ETHER;
-  clib_memcpy (ifr.ifr_hwaddr.sa_data, vif->host_mac_addr, 6);
-  tap_log_dbg (vif, "SIOCSIFHWADDR: fd %d hwaddr %U", tfd,
-	       format_hex_bytes, ifr.ifr_hwaddr.sa_data, 6);
-  _IOCTL (tfd, SIOCSIFHWADDR, (void *) &ifr);
-
   /* open vhost-net fd for each queue pair and set ownership */
   for (i = 0; i < num_q_pairs; i++)
     {
@@ -350,15 +339,14 @@
 	}
     }
 
-  if (!ethernet_mac_address_is_zero (args->host_mac_addr.bytes))
+  if (ethernet_mac_address_is_zero (args->host_mac_addr.bytes))
+    ethernet_mac_address_generate (args->host_mac_addr.bytes);
+  args->error = vnet_netlink_set_link_addr (vif->ifindex,
+					    args->host_mac_addr.bytes);
+  if (args->error)
     {
-      args->error = vnet_netlink_set_link_addr (vif->ifindex,
-						args->host_mac_addr.bytes);
-      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)
diff --git a/src/vnet/devices/virtio/virtio.c b/src/vnet/devices/virtio/virtio.c
index c0c163f..2b353a6 100644
--- a/src/vnet/devices/virtio/virtio.c
+++ b/src/vnet/devices/virtio/virtio.c
@@ -299,6 +299,8 @@
 	  if (vif->host_mtu_size)
 	    vlib_cli_output (vm, "  host-mtu-size \"%d\"",
 			     vif->host_mtu_size);
+	  vlib_cli_output (vm, "  host-mac-addr: %U",
+			   format_ethernet_address, vif->host_mac_addr);
 
 	  vec_foreach_index (i, vif->vhost_fds)
 	    str = format (str, " %d", vif->vhost_fds[i]);