summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2015-07-13 16:15:52 +0200
committerSteven Barth <steven@midlink.org>2015-07-13 16:15:52 +0200
commit024525798c5f6aba3af9b2ef7b3af2f3c14f1db8 (patch)
treea14a412db070a98aa47017943181e99e53d01775
parent523431acff2f8afc2309c2e17b3add83d03125dc (diff)
parentb30bce275255b48de02783e85b8cb3e0ba9dea2e (diff)
downloadodhcp6c-024525798c5f6aba3af9b2ef7b3af2f3c14f1db8.tar.gz
Merge pull request #37 from themiron/master
Avoid solicit for zero-length prefix
-rw-r--r--src/dhcpv6.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/dhcpv6.c b/src/dhcpv6.c
index cc28627..cfa3f29 100644
--- a/src/dhcpv6.c
+++ b/src/dhcpv6.c
@@ -272,17 +272,21 @@ static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs)
for (size_t i = 0; i < n_prefixes; i++) {
struct dhcpv6_ia_hdr hdr_ia_pd = {
htons(DHCPV6_OPT_IA_PD),
- htons(sizeof(hdr_ia_pd) - 4 + sizeof(struct dhcpv6_ia_prefix)),
+ htons(sizeof(hdr_ia_pd) - 4 +
+ sizeof(struct dhcpv6_ia_prefix) * !!request_prefixes[i].length),
request_prefixes[i].iaid, 0, 0
};
struct dhcpv6_ia_prefix pref = {
.type = htons(DHCPV6_OPT_IA_PREFIX),
- .len = htons(25), .prefix = request_prefixes[i].length
+ .len = htons(sizeof(pref) - 4),
+ .prefix = request_prefixes[i].length
};
memcpy(ia_pd + ia_pd_len, &hdr_ia_pd, sizeof(hdr_ia_pd));
ia_pd_len += sizeof(hdr_ia_pd);
- memcpy(ia_pd + ia_pd_len, &pref, sizeof(pref));
- ia_pd_len += sizeof(pref);
+ if (request_prefixes[i].length) {
+ memcpy(ia_pd + ia_pd_len, &pref, sizeof(pref));
+ ia_pd_len += sizeof(pref);
+ }
}
} else {
struct odhcp6c_entry *e = odhcp6c_get_state(STATE_IA_PD, &ia_pd_entries);