The patch below extends dhclient to mimic this logic from ISC DHCP's
linux script:

        if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then
          route add -host $router dev $interface
        fi
        route add default gw $router $metric_arg dev $interface

With this change, dhclient is able to successfully configure the
network via DHCP on Compute Engine:

$ ifconfig vio0
vio0: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu 
1500
        lladdr 42:01:0a:f0:8f:56
        priority: 0
        groups: egress
        media: Ethernet autoselect
        status: active
        inet6 fe80::4001:aff:fef0:8f56%vio0 prefixlen 64 scopeid 0x1
        inet 10.240.143.86 netmask 0xffffffff
$ netstat -r -n -f inet
Routing tables

Internet:
Destination        Gateway            Flags   Refs      Use   Mtu  Prio Iface
default            10.240.0.1         UGS        1      183     -     8 vio0 
10.240.0.1         42:01:0a:f0:00:01  UHLc       1        0     -    56 vio0 
10.240.0.1/32      link#1             UC         1        0     -    56 vio0 
10.240.143.86/32   link#1             UC         0        0     -     4 vio0 
127/8              127.0.0.1          UGRS       0        0 33144     8 lo0  
127.0.0.1          127.0.0.1          UH         1        0 33144     4 lo0  
224/4              127.0.0.1          URS        0        0 33144     8 lo0  

ok?

Index: dhclient.c
===================================================================
RCS file: /cvs/src/sbin/dhclient/dhclient.c,v
retrieving revision 1.268
diff -u -p -r1.268 dhclient.c
--- dhclient.c  20 Nov 2013 17:22:46 -0000      1.268
+++ dhclient.c  4 Dec 2013 00:06:08 -0000
@@ -879,6 +879,21 @@ bind_lease(void)
                        /* XXX Only use FIRST router address for now. */
                        memcpy(&gateway.s_addr, options[DHO_ROUTERS].data,
                            options[DHO_ROUTERS].len);
+
+                       /*
+                        * If we were given a /32 IP assignment, then make sure
+                        * the gateway address is routable with equivalent of
+                        *
+                        *     route add -net $gw -netmask 255.255.255.255 \
+                        *         -cloning -iface $addr
+                        */
+                       if (mask.s_addr == INADDR_BROADCAST) {
+                               add_route(ifi->rdomain, gateway, mask,
+                                   client->new->address,
+                                   RTA_DST | RTA_NETMASK | RTA_GATEWAY,
+                                   RTF_CLONING | RTF_STATIC);
+                       }
+
                        add_default_route(ifi->rdomain, client->new->address,
                            gateway);
                }

Reply via email to