vmm: net: use the MAC to signal the networking style
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 12 Jun 2019 21:07:33 +0000 (17:07 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 11 Jul 2019 18:29:21 +0000 (14:29 -0400)
Our NAT has the ability to emulate the 10.0.2.x network, where the guest
is .15 and the host/router is .2.  It can also use 'real addresses',
where the guest thinks it has the host's IP.

It's hard for the guest to know which type of network it is on until it
gets a DHCP response.  Those can be slow (relatively), and VM appliances
that use networking at all want to use a static config.

This commit uses the lowest byte of our synthetic virtio-net MAC address
to tell the guest which style of networking is present.  Suitably
coupled guest startup scripts can check the MAC address, detect the
10.0.2.x network, and statically configure themselves.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/nat.c

index 1a837df..6cdf164 100644 (file)
@@ -175,7 +175,8 @@ uint8_t guest_v4_mask[IPV4_ADDR_LEN];
 uint8_t guest_v4_router[IPV4_ADDR_LEN];
 uint8_t guest_v4_dns[IPV4_ADDR_LEN];
 
-/* We'll use this in all our eth headers with the guest. */
+/* We'll use this in all our eth headers with the guest.
+ * Note when using vnet_real_ip_addrs, the guest's MAC ends in 'c'. */
 uint8_t host_eth_addr[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x0a};
 uint8_t guest_eth_addr[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x0b};
 const char dhcp_hostname[] = "host";
@@ -725,6 +726,8 @@ static void ev_handle_diag(struct event_msg *ev_msg, unsigned int ev_type,
 void vnet_init(struct virtual_machine *vm, struct virtio_vq_dev *vqdev)
 {
        set_ip_addrs();
+       if (vnet_real_ip_addrs)
+               guest_eth_addr[5] = 0xc;
        virtio_net_set_mac(vqdev, guest_eth_addr);
        rx_mtx = uth_mutex_alloc();
        rx_cv = uth_cond_var_alloc();