if_vke
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Sat, 29 Dec 2012 17:07:56 +0000 (18:07 +0100)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Sat, 29 Dec 2012 17:11:29 +0000 (18:11 +0100)
sys/dev/virtual/vkernel/net/if_vke.c
sys/platform/vkernel64/include/md_var.h
sys/platform/vkernel64/platform/init.c

index 106dfb3..b7935c4 100644 (file)
@@ -698,13 +698,17 @@ vke_attach(const struct vknetif_info *info, int unit)
                        return ENXIO;
                }
        } else {
-               int fd = open("/dev/urandom", O_RDONLY);
-               if (fd >= 0) {
-                       read(fd, enaddr + 2, 4);
-                       close(fd);
+               if (info->hwaddr != 0)
+                       enaddr = info->hwaddr.octet;
+               else {
+                       int fd = open("/dev/urandom", O_RDONLY);
+                       if (fd >= 0) {
+                               read(fd, enaddr + 2, 4);
+                               close(fd);
+                       }
+                       enaddr[4] = (int)getpid() >> 8;
+                       enaddr[5] = (int)getpid() & 255;
                }
-               enaddr[4] = (int)getpid() >> 8;
-               enaddr[5] = (int)getpid() & 255;
 
        }
        enaddr[1] += 1;
index 286b2fb..d72e35f 100644 (file)
 #ifndef _SYS_TYPES_H_
 #include <sys/types.h>
 #endif
+
+#ifndef _NET_ETHERNET_H_
+#include <net/ethernet.h>
+#endif
+
 #ifndef _SYS_VKERNEL_H_
 #include <sys/vkernel.h>
 #endif
@@ -52,6 +57,7 @@ struct vknetif_info {
        int             tap_unit;
        in_addr_t       netif_addr;
        in_addr_t       netif_mask;
+       struct ether_addr hwaddr;
 };
 
 struct vkdisk_info {
index 2b0ca2d..f2bead5 100644 (file)
@@ -1062,11 +1062,12 @@ unix_connect(const char *path)
  */
 static
 int
-netif_init_tap(int tap_unit, in_addr_t *addr, in_addr_t *mask, int s)
+netif_init_tap(int tap_unit, in_addr_t *addr, in_addr_t *mask, char *macstr, int s)
 {
        in_addr_t tap_addr, netmask, netif_addr;
        int next_netif_addr;
-       char *tok, *masklen_str, *ifbridge;
+       char *tok, *masklen_str, *ifbridge, *mactmp;
+       int n;
 
        *addr = 0;
        *mask = 0;
@@ -1127,7 +1128,7 @@ netif_init_tap(int tap_unit, in_addr_t *addr, in_addr_t *mask, int s)
                 * Current token is pseudo netif address, if there is next token
                 * it must be netmask len
                 */
-               masklen_str = strtok(NULL, "/");
+               masklen_str = strtok(NULL, ":/");
        }
 
        /* Calculate netmask */
@@ -1144,6 +1145,20 @@ netif_init_tap(int tap_unit, in_addr_t *addr, in_addr_t *mask, int s)
                }
        }
 
+       /* Check whether we were passed a MAC address */
+       mactmp = strtok(NULL, ":/");
+       if (mactmp != NULL) {
+               n = snprintf(macstr, 18, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
+                   mactmp[0], mactmp[1], mactmp[2], mactmp[3], mactmp[4],
+                   mactmp[5], mactmp[6], mactmp[7], mactmp[8], mactmp[9],
+                   mactmp[10], mactmp[11]);
+
+               if (n != 17) {
+                       warnx("Invalid MAC address passed, %d args passed", n);
+                       macstr = NULL;
+               }
+       }
+
        /* Make sure there is no more token left */
        if (strtok(NULL, ":/") != NULL) {
                warnx("Invalid argument to '-I'");
@@ -1178,6 +1193,8 @@ void
 init_netif(char *netifExp[], int netifExpNum)
 {
        int i, s;
+       char macstr[18];
+       struct ether_addr *hwaddr;
 
        if (netifExpNum == 0)
                return;
@@ -1213,7 +1230,7 @@ init_netif(char *netifExp[], int netifExpNum)
                 * NB: Rest part of netifExp[i] is passed
                 *     to netif_init_tap() implicitly.
                 */
-               if (netif_init_tap(tap_unit, &netif_addr, &netif_mask, s) < 0) {
+               if (netif_init_tap(tap_unit, &netif_addr, &netif_mask, macstr, s) < 0) {
                        /*
                         * NB: Closing tap(4) device file will bring
                         *     down the corresponding interface
@@ -1223,10 +1240,19 @@ init_netif(char *netifExp[], int netifExpNum)
                }
 
                info = &NetifInfo[NetifNum];
+               bzero(info, sizeof(*info));
                info->tap_fd = tap_fd;
                info->tap_unit = tap_unit;
                info->netif_addr = netif_addr;
                info->netif_mask = netif_mask;
+               /*
+                * Set our MAC in the case it was correctly passed.
+                */
+#ifdef _KERNEL
+#error KERNEL defined
+#endif
+               if ((hwaddr = ether_aton(macstr)) != NULL)
+                       bcopy(hwaddr, &info->hwaddr.octet, sizeof(*hwaddr));
 
                NetifNum++;
                if (NetifNum >= VKNETIF_MAX)    /* XXX will this happen? */