[vbox-dev] Setting the hardware MAC address on a virtual Ethernet interface is not working correctly

David Garrod dgarrod at extremenetworks.com
Fri Aug 19 20:53:28 UTC 2016

I am running two Ubuntu Linux Guests on a Windows 7 Host.

I've set up Internal Networking between them. This all works fine if I let VirtualBox pick and use the MACs on the virtual interfaces.

But in my case my Linux Guests set the Hardware MAC address on the virtual interfaces.

The first Linux Guest (call it A) has the NIC configured as follows:

NIC 2: MAC: 080027823BE6, Attachment: Internal Network 'intnet1', Cable connected: on, Trace: on (file: foobar.pcap
), Type: virtio, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: allow-all, Bandwidth group: none

The second Linux Guest (call it B) has the NIC configured as follows:

NIC 2: MAC: 0800278B0F78, Attachment: Internal Network 'intnet1', Cable connected: on, Trace: on (
p), Type: virtio, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: allow-all, Bandwidth group: none

In other words I'm using "virtio" and I've configured the promiscuous policy to "Allow All". (Allow VMs doesn't work either).

I set up IP addresses in this interface (it's called "eth1" in each of the Linux systems). As I said for reasons that I don't have to go into here the Linux system wants to set its own MAC on the interface. So for purposes of this discussion call it MACA on system A and MACB on system B.

This is done from my Linux guest system using the ioctl() SIOCSIFHWADDR. Specifically:

    if (ioctl(sock, SIOCSIFHWADDR, &ifr) < 0) {
        VLOG_ERR("netdev_set_macaddr (%s) MAC (%s) ioctl failed '%s'\n",
                  intf, macaddr, strerror(errno));

What I'm finding is that once this is done indeed the guest is now sending packets with an SRCMAC of the specified MAC

If I now ping from system A to system B here is what happens.

System A sends a Broadcast ARP to resolve the MAC address for B. This packet is received by system B and of course a UNICAST reply is sent back with the resolution for MAC B.

System B then sends a unicast ARP packet (source MACB dest MACA) asking for the resolution of systemA's MAC.

The pcap trace file I've put on System B's NIC (foobar2.pcap) shows all of these packets. But the pcap trace file on system A (foobar.pcap) only shows the original ARP broadcast packet from system A to system B. It does NOT show either of the Unicast replies. So of course they don't make it into the System A Libux system and hence the ping doesn't work.

This is the behavior I'd expect had I not set promiscuous mode on the virtual NICs inside VirtualBox. But I have set promiscuous mode and I cannot understand why it is not working.

Various web searches led me to one post that said that PROMISC mode in VirtualBox has no effect unless the guest has set the interface into promiscuous mode. Indeed I found this to be true. Once I set promiscuous mode on the guest the Unicast packets got through.

But this isn't really the essence of my question. I would have expected that setting the MAC address from the guest would CHANGEW the MAC address inside VirtualBox. It appears that it doesn't. Using VBoxManage shows that VirtualBox still thinks that the MAC is the original MAC that was set by VirtualBox. This is no doubt the reason why Unicast packets with a MACDA of MACA are not delivered to guest system A. Inside VirtualBox it no doubt still considers the MAC to address to be the original MAC address.

What I've also found is weird is that if I "reboot" the guest by typing reboot the guest comes up thinking the MAC is MACA, i.e. the MAC that got set on the last run NOT the MAC that VirtualBox has internally. If instead I power off the guest or do a shutdown when it comes up again it comes up with a MAC of theMAC that VirtyalBox says it has.

This says to me that VirtualBox is keeping the programmed MAC inside its simulated PCI through a guest reboot but that when the guest is powered off or shutdown this simulated PCI is also getting reset.

But in NEITHER case is VirtualBox truly using the programmed MAC. I'm trying to understand if this is the desired behaviour for VirtualBox and if so why. Why can't I program the MAC and have it used? If I could I'd expect I wouldn't even need to set Promiscuous Mode inside VirtualBox.

I've tried looking at the code but got rather lost. The best I can come up with is that programming of the virtual hardware in the host is not being read by the host driver inside VirtualBox when the guest programs the MAC value.

Any comments would be most appreciated.



PS I put an earlier version of this question in one of the forums. https://forums.virtualbox.org/viewtopic.php?f=6&t=79239, but I didn't get any replies hence the real question here.


This e-mail and any attachments to it may contain confidential and proprietary material and is solely for the use of the intended recipient. Any review, use, disclosure, distribution or copying of this transmittal is prohibited except by or on behalf of the intended recipient. If you have received this transmittal in error, please notify the sender and destroy this e-mail and any attachments and all copies, whether electronic or printed.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.virtualbox.org/pipermail/vbox-dev/attachments/20160819/1e9e619c/attachment.html>

More information about the vbox-dev mailing list