From: Roy Marples Date: Tue, 28 Oct 2008 09:25:26 +0000 (+0000) Subject: Explain why we decline the address in a message. X-Git-Tag: v4.0.3~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4816c6bcb94da81caa25dd210a12c3ffa88da005;p=thirdparty%2Fdhcpcd.git Explain why we decline the address in a message. --- diff --git a/dhcp.c b/dhcp.c index 40f09626..0f61e187 100644 --- a/dhcp.c +++ b/dhcp.c @@ -52,6 +52,8 @@ #define IPV4R IPV4 | REQUEST +#define DAD "Duplicate address detected" + /* Our aggregate option buffer. * We ONLY use this when options are split, which for most purposes is * practically never. See RFC3396 for details. */ @@ -762,6 +764,7 @@ make_message(struct dhcp_message **message, uint32_t ul; uint16_t sz; const struct dhcp_opt *opt; + size_t len; dhcp = xzalloc(sizeof (*dhcp)); m = (uint8_t *)dhcp; @@ -793,15 +796,18 @@ make_message(struct dhcp_message **message, case ARPHRD_IEEE1394: case ARPHRD_INFINIBAND: dhcp->hwlen = 0; - if (dhcp->ciaddr == 0) + if (dhcp->ciaddr == 0 && + type != DHCP_DECLINE && type != DHCP_RELEASE) dhcp->flags = htons(BROADCAST_FLAG); break; } - if (up < 0 || up > (time_t)UINT16_MAX) - dhcp->secs = htons((uint16_t)UINT16_MAX); - else - dhcp->secs = htons(up); + if (type != DHCP_DECLINE && type != DHCP_RELEASE) { + if (up < 0 || up > (time_t)UINT16_MAX) + dhcp->secs = htons((uint16_t)UINT16_MAX); + else + dhcp->secs = htons(up); + } dhcp->xid = xid; dhcp->cookie = htonl(MAGIC_COOKIE); @@ -827,6 +833,14 @@ make_message(struct dhcp_message **message, } } + if (type == DHCP_DECLINE) { + *p++ = DHO_MESSAGE; + len = strlen(DAD); + *p++ = len; + memcpy(p, DAD, len); + p += len; + } + if (type == DHCP_RELEASE) { if (lease->server.s_addr) PUTADDR(DHO_SERVERID, lease->server);