vmm: Allow the VM to boot without full networking
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 Jan 2017 23:26:15 +0000 (18:26 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 Jan 2017 15:00:03 +0000 (10:00 -0500)
Depending on the level of networking available, the guest may be able to do
some things.  For instance, if there is an IP address, but no DNS, then the
guest can get by with IP only.  The guest should be able to get away with
statically setting its nameservers, too, since the host's DNS server only
matters for DHCP responses.

If the network is disconnected and you use QEMU style networking, the guest
can still reach the host via 10.0.2.2.  All bets are off if you use
real-addr mode and don't have a real IP address.

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

index 825136b..a089271 100644 (file)
@@ -542,20 +542,32 @@ static void get_host_ip_addrs(void)
        register_printf_specifier('M', printf_ipmask, printf_ipmask_info);
 
        lifc = get_first_noloop_iplifc(NULL, &to_free);
-       parlib_assert_perror(lifc);
+       if (!lifc) {
+               fprintf(stderr, "IP addr lookup failed (%r), no VM networking\n");
+               return;
+       }
        snprintf(my_ip_str, sizeof(my_ip_str), "%i", lifc->ip);
        snprintf(buf, sizeof(buf), "%i%M", lifc->ip, lifc->mask);
        v4parsecidr(host_v4_addr, host_v4_mask, buf);
        free_ipifc(to_free);
 
        ret = my_router_addr(router_ip, NULL);
-       parlib_assert_perror(!ret);
+       if (ret) {
+               fprintf(stderr, "Router lookup failed (%r), no VM networking\n");
+               return;
+       }
        v6tov4(host_v4_router, router_ip);
 
        ndb = ndbopen("/net/ndb");
-       parlib_assert_perror(ndb);
+       if (!ndb) {
+               fprintf(stderr, "NDB open failed (%r), no VM networking\n");
+               return;
+       }
        nt = ndbipinfo(ndb, "ip", my_ip_str, &dns, 1);
-       assert(nt);
+       if (!nt) {
+               fprintf(stderr, "DNS server lookup failed (%r), no VM networking\n");
+               return;
+       }
        v4parseip(host_v4_dns, nt->val);
        ndbfree(nt);
        ndbclose(ndb);