return ~sum;
}
-static ssize_t
-dhcp_makeudppacket(uint8_t **p, const uint8_t *data, size_t length,
+static struct udp_dhcp_packet *
+dhcp_makeudppacket(ssize_t *sz, const uint8_t *data, size_t length,
struct in_addr source, struct in_addr dest)
{
struct udp_dhcp_packet *udpp;
udpp = calloc(1, sizeof(*udpp));
if (udpp == NULL)
- return -1;
+ return NULL;
ip = &udpp->ip;
udp = &udpp->udp;
ip->ip_len = htons(sizeof(*ip) + sizeof(*udp) + length);
ip->ip_sum = checksum(ip, sizeof(*ip));
- *p = (uint8_t *)udpp;
- return sizeof(*ip) + sizeof(*udp) + length;
+ *sz = sizeof(*ip) + sizeof(*udp) + length;
+ return udpp;
}
static void
dhcp_close(iface);
}
} else {
- len = dhcp_makeudppacket(&udp, (uint8_t *)dhcp, len, from, to);
- if (len == -1)
- return;
- r = ipv4_sendrawpacket(iface, ETHERTYPE_IP, udp, len);
- free(udp);
+ r = 0;
+ udp = dhcp_makeudppacket(&r, (uint8_t *)dhcp, len, from, to);
+ if (udp == NULL) {
+ syslog(LOG_ERR, "dhcp_makeudppacket: %m");
+ } else {
+ r = ipv4_sendrawpacket(iface, ETHERTYPE_IP, udp, r);
+ free(udp);
+ }
/* If we failed to send a raw packet this normally means
* we don't have the ability to work beneath the IP layer
* for this interface.
iabuf, sizeof(iabuf));
snprintf(a->saddr, sizeof(a->saddr),
"%s/%d", ia, a->prefix_len);
- }
+ TAILQ_INSERT_TAIL(&state->addrs, a, next);
+ } else
+ a->flags &= ~IPV6_AF_STALE;
memcpy(&u32, p, sizeof(u32));
a->prefix_pltime = ntohl(u32);
p += sizeof(u32);
state->lowpl = a->prefix_pltime;
if (a->prefix_vltime && a->prefix_vltime > state->expire)
state->expire = a->prefix_vltime;
- if (a->flags & IPV6_AF_STALE)
- a->flags &= ~IPV6_AF_STALE;
- else
- TAILQ_INSERT_TAIL(&state->addrs, a, next);
i++;
}
return i;
iabuf, sizeof(iabuf));
snprintf(a->saddr, sizeof(a->saddr),
"%s/%d", ia, a->prefix_len);
- } else if (a->prefix_vltime != vltime)
- a->flags |= IPV6_AF_NEW;
+ TAILQ_INSERT_TAIL(&state->addrs, a, next);
+ } else {
+ a->flags &= ~IPV6_AF_STALE;
+ if (a->prefix_vltime != vltime)
+ a->flags |= IPV6_AF_NEW;
+ }
a->prefix_pltime = pltime;
a->prefix_vltime = vltime;
state->lowpl = a->prefix_pltime;
if (a->prefix_vltime && a->prefix_vltime > state->expire)
state->expire = a->prefix_vltime;
- if (a->flags & IPV6_AF_STALE)
- a->flags &= ~IPV6_AF_STALE;
- else
- TAILQ_INSERT_TAIL(&state->addrs, a, next);
i++;
}
return i;
rebind = ntohl(u32);
p += sizeof(u32);
ol -= sizeof(u32);
+ }
+ if (dhcp6_checkstatusok(ifp, NULL, p, ol) == -1)
+ continue;
+ if (ifo->ia_type == D6_OPTION_IA_PD) {
+ if (dhcp6_findpd(ifp, iaid, p, ol) == 0) {
+ syslog(LOG_WARNING,
+ "%s: %s: DHCPv6 REPLY missing Prefix",
+ ifp->name, sfrom);
+ continue;
+ }
+ } else {
+ if (dhcp6_findna(ifp, iaid, p, ol) == 0) {
+ syslog(LOG_WARNING,
+ "%s: %s: DHCPv6 REPLY missing IA Address",
+ ifp->name, sfrom);
+ continue;
+ }
+ }
+ if (ifo->ia_type != D6_OPTION_IA_TA) {
if (renew > rebind && rebind > 0) {
if (sfrom)
syslog(LOG_WARNING,
(rebind < state->rebind || state->rebind == 0))
state->rebind = rebind;
}
- if (dhcp6_checkstatusok(ifp, NULL, p, ol) == -1)
- return -1;
- if (ifo->ia_type == D6_OPTION_IA_PD) {
- if (dhcp6_findpd(ifp, iaid, p, ol) == 0) {
- syslog(LOG_ERR,
- "%s: %s: DHCPv6 REPLY missing Prefix",
- ifp->name, sfrom);
- return -1;
- }
- } else {
- if (dhcp6_findna(ifp, iaid, p, ol) == 0) {
- syslog(LOG_ERR,
- "%s: %s: DHCPv6 REPLY missing IA Address",
- ifp->name, sfrom);
- return -1;
- }
- }
i++;
}
TAILQ_FOREACH_SAFE(ap, &state->addrs, next, nap) {