]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Explain why we decline the address in a message.
authorRoy Marples <roy@marples.name>
Tue, 28 Oct 2008 09:25:26 +0000 (09:25 +0000)
committerRoy Marples <roy@marples.name>
Tue, 28 Oct 2008 09:25:26 +0000 (09:25 +0000)
dhcp.c

diff --git a/dhcp.c b/dhcp.c
index 40f09626f64d5984f9bcb2e8b8f8aeb5391967f8..0f61e1876abbee73bb01839bc07f9266cb09c871 100644 (file)
--- 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);