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";
}
.msg_iov = &iov, .msg_iovlen = 1, .msg_control = cmsg_buf.buf,
.msg_controllen = sizeof(cmsg_buf)};
struct in6_pktinfo *pktinfo = NULL;
+ const struct dhcpv6_header *hdr = (const struct dhcpv6_header *)buf;
// Check for pending signal
if (odhcp6c_signal_process())
round_start = odhcp6c_get_milli_time();
elapsed = round_start - start;
- syslog(LOG_NOTICE, "Got a valid reply after %"PRIu64"ms",
- elapsed);
+ syslog(LOG_NOTICE, "Got a valid %s after %"PRIu64"ms",
+ dhcpv6_msg_to_str(hdr->msg_type), elapsed);
if (retx->handler_reply)
len = retx->handler_reply(type, rc, opt, opt_end, &addr);
{
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;
}
{
uint16_t otype, olen;
uint8_t *odata;
- int msg = -1;
+ enum dhcpv6_msg msg = DHCPV6_MSG_UNKNOWN;
dhcpv6_for_each_option(opt, end, otype, olen, odata) {
if (otype == DHCPV6_OPT_RECONF_MESSAGE && olen == 1) {
// Fall through
case DHCPV6_MSG_INFO_REQ:
msg = odata[0];
- syslog(LOG_NOTICE, "Got a %s (msg-type %s)",
- dhcpv6_msg_to_str(otype),
- dhcpv6_msg_to_str(msg));
+ syslog(LOG_NOTICE, "Need to respond with %s in reply to %s",
+ dhcpv6_msg_to_str(msg), dhcpv6_msg_to_str(DHCPV6_MSG_RECONF));
break;
default:
}
}
- dhcpv6_handle_reply(orig, rc, NULL, NULL, NULL);
+ if (msg != DHCPV6_MSG_UNKNOWN)
+ dhcpv6_handle_reply(orig, rc, NULL, NULL, NULL);
- return msg;
+ return (msg == DHCPV6_MSG_UNKNOWN? -1: (int)msg);
}
// Collect all advertised servers
if (t1 > t2)
return 0;
- syslog(LOG_INFO, "IAID %04x T1 %d T2 %d", 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) {
*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,