if (rtm.hdr.rtm_addrs & RTA_NETMASK)
ADDADDR(&rt->net);
- /* IFP here if we need it */
+ if (rtm.hdr.rtm_addrs & RTA_IFP) {
+ /* Make us a link layer socket for the host gateway */
+ memset(&su, 0, sizeof(su));
+ su.sdl.sdl_len = sizeof(struct sockaddr_dl);
+ link_addr(rt->iface->name, &su.sdl);
+ ADDSU;
+ }
if (rtm.hdr.rtm_addrs & RTA_IFA)
ADDADDR(&state->addr);
#endif
rtm.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
-// if (action >= 0)
-// rtm.hdr.rtm_addrs |= RTA_IFA;
+ if (action >= 0)
+ rtm.hdr.rtm_addrs |= RTA_IFP | RTA_IFA;
ADDADDR(&rt->dest);
if (!(rtm.hdr.rtm_flags & RTF_GATEWAY)) {
if (lla == NULL) /* unlikely as we need a LL to get here */
return -1;
ADDADDRS(&lla->addr, rt->iface->index);
- } else
+ } else {
+ lla = NULL;
ADDADDRS(&rt->gate, rt->iface->index);
+ }
if (rtm.hdr.rtm_addrs & RTA_NETMASK) {
if (rtm.hdr.rtm_flags & RTF_GATEWAY) {
ADDADDR(&rt->net);
}
- /* IFP here if we need it */
- /* IFA here if we need it */
+ if (rtm.hdr.rtm_addrs & RTA_IFP) {
+ /* Make us a link layer socket for the host gateway */
+ memset(&su, 0, sizeof(su));
+ su.sdl.sdl_len = sizeof(struct sockaddr_dl);
+ link_addr(rt->iface->name, &su.sdl);
+ ADDSU;
+ }
+
+ if (rtm.hdr.rtm_addrs & RTA_IFA) {
+ if (lla == NULL) {
+ lla = ipv6_linklocal(rt->iface);
+ if (lla == NULL) /* unlikely */
+ return -1;
+ }
+ ADDADDRS(&lla->addr, rt->iface->index);
+ }
#undef ADDADDR
#undef ADDSU
ap->flags |= IPV6_AF_ADDED;
if (ap->delegating_iface)
ap->flags |= IPV6_AF_DELEGATED;
-#if HAVE_ROUTE_METRIC
if (ap->iface->options->options & DHCPCD_IPV6RA_OWN &&
ipv6_removesubnet(ap->iface, ap) == -1)
syslog(LOG_ERR,"ipv6_removesubnet %m");
-#endif
if (ap->prefix_pltime == ND6_INFINITE_LIFETIME &&
ap->prefix_vltime == ND6_INFINITE_LIFETIME)
syslog(LOG_DEBUG,
return r;
}
-#if HAVE_ROUTE_METRIC
int
ipv6_removesubnet(const struct interface *ifp, struct ipv6_addr *addr)
{
}
return r;
}
-#endif
#define RT_IS_DEFAULT(rtp) \
(IN6_ARE_ADDR_EQUAL(&((rtp)->dest), &in6addr_any) && \
syslog(LOG_ERR, "IPV6CTL_ACCEPT_RTADV: %m");
}
-#if 0
static int
ipv6_ra_flush(void)
{
strcpy(dummy, "lo0");
if (ioctl(s, SIOCSRTRFLUSH_IN6, (caddr_t)&dummy) == -1)
syslog(LOG_ERR, "SIOSRTRFLUSH_IN6: %m");
- if (ioctl(s, SIOCSPFXFLUSH_IN6, (caddr_t)&dummy) == -1)
- syslog(LOG_ERR, "SIOSPFXFLUSH_IN6: %m");
+// if (ioctl(s, SIOCSPFXFLUSH_IN6, (caddr_t)&dummy) == -1)
+// syslog(LOG_ERR, "SIOSPFXFLUSH_IN6: %m");
close(s);
return 0;
}
-#endif
int
check_ipv6(const char *ifname)
return 0;
}
-#if 0
- /* I am not convinced this is right as it sometimes makes our own
- * added routes disappear. */
+ /* Flush the kernel knowledge of advertised routers */
ipv6_ra_flush();
-#endif
return 1;
}