MAC addresses to use for BHyve VM's running under FreeBSD?

Kurt Lidl lidl at pix.net
Wed Feb 5 17:46:20 UTC 2014


> On Feb 5, 2014, at 3:33 , Kai Gallasch <k at free.de> wrote:
>
>> Am 05.02.2014 um 08:03 schrieb Craig Rodrigues:
>>> Hi,
>>>
>>> I am running many BHyve VM's and am using tap interfaces
>>> with a single bridge.  I am configuring the IP addresses
>>> of these VM's via DHCP.
>>>
>>> I need to have separate MAC addresses for each VM.
>>>
>>> Can anyone recommend a range of MAC addresses to use?
>>>
>>> I seem to recall that at the 2013 FreeBSD Vendor Summit in
>>> Sunnyvale, California, that George mentioned that
>>> there might be a Organizational Unique Identifier (OUI) for the FreeBSD
>>> project that we can use for BHyve VM's.  Is that right?
>>>
>>> If not, can people recommend a range of addresses to use?
>>
>> http://standards.ieee.org/develop/regauth/oui/public.html
>>
>> Using "Search the Public MA-L Listing" with search term FreeBSD reveals..
>>
>> --- snip ---
>>
>> Here are the results of your search through the public section of the IEEE Standards OUI database report for freebsd:
>>
>>  58-9C-FC   (hex)		FreeBSD
>> Foundation
>>  589CFC     (base 16)		
>> FreeBSD
>> Foundation
>>  				P.O. Box 20247
>> 				Boulder CO  80308-3247
>> 				UNITED STATES
>> --- snap ---
>>
>>
>
> Correct, that is an address that the Foundation has registered with the IEEE.
>
> If you look at sys/net/ieee_oui.h you will see that I’ve allocated a range to bhyve already.

At work, we modified the bhyverun command to seed the hostname
of them machine running the hypervisor as part of the "generate a MAC
address" routine.  That means that for virtual machine "foo",
you now get different MACs on server "bar" and server "baz".
Without this patch, you're likely to get identical MAC addresses
for virtual machine "foo" on different servers.

I personally also have my virtual machines set bit 2 in
the first octet of the MAC address, so it falls into the
"locally administered" catagory of MAC addresses.  My gut feel
is that using the FreeBSD OUI bhyve range, *AND* setting the
locally administered bit in the MAC address is the way to go.

-Kurt


-------------- next part --------------
diff --git a/usr.sbin/bhyve/pci_virtio_net.c b/usr.sbin/bhyve/pci_virtio_net.c
--- a/usr.sbin/bhyve/pci_virtio_net.c
+++ b/usr.sbin/bhyve/pci_virtio_net.c
@@ -579,27 +579,36 @@ pci_vtnet_init(struct vmctx *ctx, struct
 				close(sc->vsc_tapfd);
 				sc->vsc_tapfd = -1;
 			}
 		}		
 	}
 
 	/*
 	 * The default MAC address is the standard NetApp OUI of 00-a0-98,
-	 * followed by an MD5 of the PCI slot/func number and dev name
+	 * followed by an MD5 of the PCI slot/func number, hostname, and
+	 * vmname.  The "locally administered" bit is also set in the
+	 * resulting MAC address.
 	 */
 	if (!mac_provided) {
-		snprintf(nstr, sizeof(nstr), "%d-%d-%s", pi->pi_slot,
-		    pi->pi_func, vmname);
+		char hostname[MAXHOSTNAMELEN];
+		int rc;
+
+		rc = gethostname(hostname, sizeof hostname - 1);
+		if (rc < 0)
+			hostname[0] = 0;
+		hostname[MAXHOSTNAMELEN-1] = 0;
+		snprintf(nstr, sizeof(nstr), "%d-%d-%s-%s", pi->pi_slot,
+		    pi->pi_func, hostname, vmname);
 
 		MD5Init(&mdctx);
 		MD5Update(&mdctx, nstr, strlen(nstr));
 		MD5Final(digest, &mdctx);
 
-		sc->vsc_config.mac[0] = 0x00;
+		sc->vsc_config.mac[0] = 0x00 | 0x2; /* locally administered */
 		sc->vsc_config.mac[1] = 0xa0;
 		sc->vsc_config.mac[2] = 0x98;
 		sc->vsc_config.mac[3] = digest[0];
 		sc->vsc_config.mac[4] = digest[1];
 		sc->vsc_config.mac[5] = digest[2];
 	}
 
 	/* initialize config space */


More information about the freebsd-virtualization mailing list