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);
}