SuSE machine broadcasts for dhcp lease before link becomes ready

dhcpopensuse

The machine is running SuSE 11.2.
I configured it to connect use DHCP by using the YaST2 graphical networking interface.

When I dhcpcd -k eth0 and then dhcpcd eth0 then I get a lease almost instantaneously and everything is good. However, if I ifdown eth0 and then ifup eth0 I don't get an IP address for about 20 seconds.
Looking at network packet flow reveals that in the ifdown/up scenario, a dhcp request is broadcast successfully, but no response ever comes.
EDIT: The same thing happens during boot. A broadcast packet is sent before the link becomes active.

/var/log/messages reveals the following:

Dec 6 14:21:50 olm ifup: eth0 device: Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express (rev 21)
Dec 6 14:21:51 olm kernel: [ 3389.717366] tg3 0000:02:00.0: PME# disabled
Dec 6 14:21:51 olm kernel: [ 3389.936570] ADDRCONF(NETDEV_UP): eth0: link is not ready
Dec 6 14:21:51 olm ifup-dhcp: Starting DHCP4 client on eth0
Dec 6 14:21:51 olm dhcpcd[11807]: eth0: dhcpcd 3.2.3 starting
Dec 6 14:21:51 olm dhcpcd[11807]: eth0: hardware address = 00:10:18:30:60:3c
Dec 6 14:21:51 olm dhcpcd[11807]: eth0: broadcasting for a lease
Dec 6 14:21:51 olm ifup-dhcp: .
Dec 6 14:21:53 olm kernel: [ 3392.126437] tg3: eth0: Link is up at 1000 Mbps, full duplex.
Dec 6 14:21:53 olm kernel: [ 3392.126441] tg3: eth0: Flow control is on for TX and on for RX.
Dec 6 14:21:53 olm kernel: [ 3392.127000] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Dec 6 14:21:54 olm ifup-dhcp: .
Dec 6 14:21:55 olm avahi-daemon[3414]: Registering new address record for fe80::210:18ff:fe30:603c on eth0.*.
Dec 6 14:21:57 olm ifup-dhcp: .
Dec 6 14:21:59 olm ifup-dhcp:
Dec 6 14:21:59 olm ifup-dhcp: eth0 DHCP4 continues in background
Dec 6 14:22:04 olm kernel: [ 3403.004015] eth0: no IPv6 routers present
Dec 6 14:22:11 olm dhcpcd[11807]: eth0: timed out
Dec 6 14:22:11 olm dhcpcd[11807]: eth0: trying to use old lease in `/var/lib/dhcpcd/dhcpcd-eth0.info'
Dec 6 14:22:11 olm dhcpcd[11807]: eth0: adding IP address 172.26.59.123/26
Dec 6 14:22:11 olm dhcpcd[11807]: eth0: adding default route via 172.26.59.65 metric 0

Of particular note is that dhcpcd broadcasts for a lease before the eth0 link becomes ready. It never gets a response because the broadcast never actually went anywhere.

So my question is, Why does ifup-dhcp start the DHCP process before the link is ready? and how do I make it wait properly?

Best Answer

I found out the reason why it asks for a lease before the link is ready. It is because ifup-dhcp does try to wait until the interface is ready before calling dhcpcd, but it uses the function is_iface_up which is defined in /etc/sysconfig/network/scripts/functions, and that function only checks to see if eth0 exists before returning a positive result.

I also found a (slightly) more long term solution. ifup-dhcp waits for a positive result from is_iface_up and then it waits an additional amount of seconds as defined by DHCLIENT_SLEEP which can be found in /etc/sysconfig/network/dhcp. By setting DHCLIENT_SLEEP="3", the interface now has time to become ready before dhcpcd is called, despite the fact that is_iface_up returns too soon. This is also less likely to be clobbered by updates.