Ensure that handleifa is always passed brd.
If brd does not match existing broadcast address on an existing inet address,
delete it and add our new one.
continue;
}
if (ifp->flags & IFF_POINTOPOINT &&
- state->dst.s_addr != from.s_addr)
+ state->brd.s_addr != from.s_addr)
{
logger(ifp->ctx, LOG_WARNING,
"%s: server %s is not destination",
dhcp_handleifa(int cmd, struct interface *ifp,
const struct in_addr *addr,
const struct in_addr *net,
- const struct in_addr *dst,
+ const struct in_addr *brd,
int flags)
{
struct dhcp_state *state;
state->new = dhcp_message_new(addr, net);
if (state->new == NULL)
return;
- state->dst.s_addr = dst ? dst->s_addr : INADDR_ANY;
- if (dst) {
+ state->brd = *brd;
+ if (ifp->flags & IFF_POINTOPOINT) {
for (i = 1; i < 255; i++)
if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i))
- dhcp_message_add_addr(state->new, i, *dst);
+ dhcp_message_add_addr(state->new, i, *brd);
}
state->reason = "STATIC";
ipv4_buildroutes(ifp->ctx);
if (ifo->options & DHCPCD_INFORM) {
state->state = DHS_INFORM;
state->xid = dhcp_xid(ifp);
- state->lease.server.s_addr = dst ? dst->s_addr : INADDR_ANY;
+ state->lease.server = *brd;
state->addr = *addr;
state->net = *net;
dhcp_inform(ifp);
int raw_fd;
struct in_addr addr;
struct in_addr net;
- struct in_addr dst;
+ struct in_addr brd;
uint8_t added;
char leasefile[sizeof(LEASEFILE) + IF_NAMESIZE + (IF_SSIDLEN * 4)];
struct ifaddrmsg *ifa;
struct priv *priv;
#ifdef INET
- struct in_addr addr, net, dest;
+ struct in_addr addr, net, brd;
#endif
#ifdef INET6
struct in6_addr addr6;
switch (ifa->ifa_family) {
#ifdef INET
case AF_INET:
- addr.s_addr = dest.s_addr = INADDR_ANY;
- dest.s_addr = INADDR_ANY;
+ addr.s_addr = dest.s_addr = brd.s_addr = INADDR_ANY;
inet_cidrtoaddr(ifa->ifa_prefixlen, &net);
while (RTA_OK(rta, len)) {
switch (rta->rta_type) {
case IFA_ADDRESS:
if (ifp->flags & IFF_POINTOPOINT) {
- memcpy(&dest.s_addr, RTA_DATA(rta),
- sizeof(addr.s_addr));
+ memcpy(&brd.s_addr, RTA_DATA(rta),
+ sizeof(brd.s_addr));
}
break;
+ case IFA_BROADCAST:
+ memcpy(&brd.s_addr, RTA_DATA(rta),
+ sizeof(brd.s_addr));
+ break;
case IFA_LOCAL:
memcpy(&addr.s_addr, RTA_DATA(rta),
- sizeof(addr.s_addr));
+ sizeof(addr.s_addr));
break;
}
rta = RTA_NEXT(rta, len);
}
ipv4_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name,
- &addr, &net, &dest, ifa->ifa_flags);
+ &addr, &net, &brd, ifa->ifa_flags);
break;
#endif
#ifdef INET6
struct ifaddrs *ifa;
struct interface *ifp;
#ifdef INET
- const struct sockaddr_in *addr, *net, *dst;
+ const struct sockaddr_in *addr, *net, *brd;
#endif
#ifdef INET6
struct sockaddr_in6 *sin6, *net6;
addr = (void *)ifa->ifa_addr;
net = (void *)ifa->ifa_netmask;
if (ifa->ifa_flags & IFF_POINTOPOINT)
- dst = (const struct sockaddr_in *)
+ brd = (const struct sockaddr_in *)
(void *)ifa->ifa_dstaddr;
else
- dst = NULL;
+ brd = (void *)ifa->ifa_broadaddr;
ifa_flags = if_addrflags(&addr->sin_addr, ifp);
ipv4_handleifa(ctx, RTM_NEWADDR, ifs, ifa->ifa_name,
- &addr->sin_addr,
- &net->sin_addr,
- dst ? &dst->sin_addr : NULL, ifa_flags);
+ &addr->sin_addr, &net->sin_addr, &brd->sin_addr,
+ ifa_flags);
break;
#endif
#ifdef INET6
}
r->dest.s_addr = INADDR_ANY;
r->net.s_addr = INADDR_ANY;
- r->gate.s_addr = state->dst.s_addr;
+ r->gate.s_addr = state->brd.s_addr;
r->mtu = dhcp_get_mtu(ifp);
r->src = state->addr;
TAILQ_INSERT_HEAD(rt, r, next);
ia->iface = ifp;
ia->addr = *addr;
ia->net = *mask;
+ ia->brd = *bcast;
#ifdef IN_IFF_TENTATIVE
ia->addr_flags = IN_IFF_TENTATIVE;
#endif
}
}
- /* If the netmask is different, delete the addresss */
+ /* If the netmask or broadcast is different, delete the addresss */
ap = ipv4_iffindaddr(ifp, &lease->addr, NULL);
- if (ap && ap->net.s_addr != lease->net.s_addr)
+ if (ap && (ap->net.s_addr != lease->net.s_addr ||
+ ap->brd.s_addr != lease->brd.s_addr))
ipv4_deladdr(ifp, &ap->addr, &ap->net, 0);
if (ipv4_iffindaddr(ifp, &lease->addr, &lease->net))
ipv4_handleifa(struct dhcpcd_ctx *ctx,
int cmd, struct if_head *ifs, const char *ifname,
const struct in_addr *addr, const struct in_addr *net,
- const struct in_addr *dst, int flags)
+ const struct in_addr *brd, int flags)
{
struct interface *ifp;
struct ipv4_state *state;
ap->iface = ifp;
ap->addr = *addr;
ap->net = *net;
- if (dst)
- ap->dst.s_addr = dst->s_addr;
- else
- ap->dst.s_addr = INADDR_ANY;
+ ap->brd = *brd;
TAILQ_INSERT_TAIL(&state->addrs, ap, next);
}
ap->addr_flags = flags;
}
arp_handleifa(cmd, ifp, addr, flags);
- dhcp_handleifa(cmd, ifp, addr, net, dst, flags);
+ dhcp_handleifa(cmd, ifp, addr, net, brd, flags);
}
void
TAILQ_ENTRY(ipv4_addr) next;
struct in_addr addr;
struct in_addr net;
- struct in_addr dst;
+ struct in_addr brd;
struct interface *iface;
int addr_flags;
};