#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. */
uint32_t ul;
uint16_t sz;
const struct dhcp_opt *opt;
+ size_t len;
dhcp = xzalloc(sizeof (*dhcp));
m = (uint8_t *)dhcp;
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);
}
}
+ 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);