--- trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/dhcp_proto.c 2009/04/24 18:09:28 814 +++ trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/dhcp_proto.c 2009/04/24 18:32:46 815 @@ -71,9 +71,14 @@ /* * Parse a DHCP response packet + * Returns: + * 0 = Not handled + * 2 = DHCPOFFER (from dhcp_proto.h) + * 5 = DHCPACK + * 6 = DHCPNACK */ -static int -dhcp_parse(struct netdev *dev, struct bootp_hdr *hdr, uint8_t * exts, int extlen) +static int dhcp_parse(struct netdev *dev, struct bootp_hdr *hdr, + uint8_t * exts, int extlen) { uint8_t type = 0; uint32_t serverid = INADDR_NONE; @@ -101,19 +106,19 @@ switch (type) { case DHCPOFFER: - ret = bootp_parse(dev, hdr, exts, extlen); - if (ret == 1 && serverid != INADDR_NONE) + ret = bootp_parse(dev, hdr, exts, extlen) ? DHCPOFFER : 0; + if (ret == DHCPOFFER && serverid != INADDR_NONE) dev->serverid = serverid; DEBUG(("\n dhcp offer\n")); break; case DHCPACK: - ret = bootp_parse(dev, hdr, exts, extlen); + ret = bootp_parse(dev, hdr, exts, extlen) ? DHCPACK : 0; DEBUG(("\n dhcp ack\n")); break; case DHCPNAK: - ret = 2; + ret = DHCPNAK; DEBUG(("\n dhcp nak\n")); break; } @@ -122,6 +127,12 @@ /* * Receive and parse a DHCP packet + * Returns: + *-1 = Error in packet_recv + * 0 = Not handled + * 2 = DHCPOFFER (from dhcp_proto.h) + * 5 = DHCPACK + * 6 = DHCPNACK */ static int dhcp_recv(struct netdev *dev) { @@ -140,8 +151,8 @@ DEBUG(("\n dhcp xid %08x ", dev->bootp.xid)); - if (ret < sizeof(struct bootp_hdr) || bootp.op != BOOTP_REPLY || /* RFC951 7.5 */ - bootp.xid != dev->bootp.xid || + if (ret < sizeof(struct bootp_hdr) || bootp.op != BOOTP_REPLY || + /* RFC951 7.5 */ bootp.xid != dev->bootp.xid || memcmp(bootp.chaddr, dev->hwaddr, 16)) return 0; @@ -161,7 +172,7 @@ bootp.hlen = dev->hwlen; bootp.xid = dev->bootp.xid; bootp.ciaddr = dev->ip_addr; - bootp.giaddr = dev->bootp.gateway; + bootp.giaddr = INADDR_ANY; bootp.secs = htons(time(NULL) - dev->open_time); memcpy(bootp.chaddr, dev->hwaddr, 16);