dhcpv6: fix displaying IA info
[project/odhcp6c.git] / src / dhcpv6.c
index 56992968055bfed12d6625c388a5a93e6132619b..51b99924991e1ea46f06142a1f9e20bf3c65ff9e 100644 (file)
@@ -124,21 +124,71 @@ static uint32_t ntohl_unaligned(const uint8_t *data)
 
 static char *dhcpv6_msg_to_str(enum dhcpv6_msg msg)
 {
-       static char *dhcpv6_msg_str[] = {
-               "UNKNOWN",
-               "SOLICIT",
-               "ADVERTISE",
-               "REQUEST",
-               "RENEW",
-               "REBIND",
-               "REPLY",
-               "DECLINE",
-               "RECONFIGURE",
-               "INFORMATION REQUEST",
-       };
+       switch (msg) {
+       case DHCPV6_MSG_SOLICIT:
+               return "SOLICIT";
+
+       case DHCPV6_MSG_ADVERT:
+               return "ADVERTISE";
+
+       case DHCPV6_MSG_REQUEST:
+               return "REQUEST";
+
+       case DHCPV6_MSG_RENEW:
+               return "RENEW";
+
+       case DHCPV6_MSG_REBIND:
+               return "REBIND";
+
+       case DHCPV6_MSG_REPLY:
+               return "REPLY";
+
+       case DHCPV6_MSG_RELEASE:
+               return "RELEASE";
+
+       case DHCPV6_MSG_DECLINE:
+               return "DECLINE";
+
+       case DHCPV6_MSG_RECONF:
+               return "RECONFIGURE";
+
+       case DHCPV6_MSG_INFO_REQ:
+               return "INFORMATION REQUEST";
+
+       default:
+               break;
+       }
+
+       return "UNKNOWN";
+}
 
-       if (msg < _DHCPV6_MSG_MAX)
-               return dhcpv6_msg_str[msg];
+static char *dhcpv6_status_code_to_str(uint16_t code)
+{
+       switch (code) {
+       case DHCPV6_Success:
+               return "Success";
+
+       case DHCPV6_UnspecFail:
+               return "Unspecified Failure";
+
+       case DHCPV6_NoAddrsAvail:
+               return "No Address Available";
+
+       case DHCPV6_NoBinding:
+               return "No Binding";
+
+       case DHCPV6_NotOnLink:
+               return "Not On Link";
+
+       case DHCPV6_UseMulticast:
+               return "Use Multicast";
+
+       case DHCPV6_NoPrefixAvail:
+               return "No Prefix Available";
+
+       default:
+               break;
+       }
 
        return "Unknown";
 }
@@ -830,8 +880,21 @@ int dhcpv6_poll_reconfigure(void)
 {
        int ret = dhcpv6_request(DHCPV6_MSG_UNKNOWN);
 
-       if (ret != -1)
+       switch (ret) {
+       /*
+        * Only RENEW/REBIND/INFORMATION REQUEST
+        * message transmission can be requested
+        * by a RECONFIGURE
+        */
+       case DHCPV6_MSG_RENEW:
+       case DHCPV6_MSG_REBIND:
+       case DHCPV6_MSG_INFO_REQ:
                ret = dhcpv6_request(ret);
+               break;
+
+       default:
+               break;
+       }
 
        return ret;
 }
@@ -869,7 +932,7 @@ static int dhcpv6_handle_reconfigure(enum dhcpv6_msg orig, const int rc,
        if (msg != DHCPV6_MSG_UNKNOWN)
                dhcpv6_handle_reply(orig, rc, NULL, NULL, NULL);
 
-       return (msg == DHCPV6_MSG_UNKNOWN? -1: 1);
+       return (msg == DHCPV6_MSG_UNKNOWN? -1: (int)msg);
 }
 
 // Collect all advertised servers
@@ -1283,7 +1346,7 @@ static unsigned int dhcpv6_parse_ia(void *opt, void *end)
        if (t1 > t2)
                return 0;
 
-       syslog(LOG_INFO, "IAID %04x T1 %d T2 %d", htonl(ia_hdr->iaid), t1, t2);
+       syslog(LOG_INFO, "%s %04x T1 %d T2 %d", ntohs(ia_hdr->type) == DHCPV6_OPT_IA_PD ? "IA_PD" : "IA_NA", ntohl(ia_hdr->iaid), t1, t2);
 
        // Update address IA
        dhcpv6_for_each_option(&ia_hdr[1], end, otype, olen, odata) {
@@ -1455,8 +1518,8 @@ static void dhcpv6_log_status_code(const uint16_t code, const char *scope,
 
        *dst = 0;
 
-       syslog(LOG_WARNING, "Server returned %s status %i %s",
-               scope, code, buf);
+       syslog(LOG_WARNING, "Server returned %s status '%s %s'",
+               scope, dhcpv6_status_code_to_str(code), buf);
 }
 
 static void dhcpv6_handle_status_code(const enum dhcpv6_msg orig,