if ((rt = rt_new(ifp)) == NULL)
return -1;
- TAILQ_INSERT_TAIL(routes, rt, rt_next);
+ rt->rt_dflags |= RTDF_DHCP;
/* If we have ocets then we have a destination and netmask */
dest.s_addr = 0;
/* If CIDR is 32 then it's a host route. */
if (cidr == 32)
rt->rt_flags = RTF_HOST;
+
+ TAILQ_INSERT_TAIL(routes, rt, rt_next);
n++;
}
return n;
continue;
if ((rt = rt_new(ifp)) == NULL)
return -1;
+ rt->rt_dflags |= RTDF_DHCP;
/* A host route is normally set by having the
* gateway match the destination or assigned address */
while (p < e) {
if ((rt = rt_new(ifp)) == NULL)
return -1;
+ rt->rt_dflags |= RTDF_DHCP;
memcpy(&gateway.s_addr, p, sizeof(gateway.s_addr));
p += 4;
sa_in_init(&rt->rt_dest, &dest);
if (rt->rt_dflags & RTDF_RA)
nlm.rt.rtm_protocol = RTPROT_RA;
else
+#endif
+#ifdef RTPROT_DHCP
+ if (rt->rt_dflags & RTDF_DHCP)
+ nlm.rt.rtm_protocol = RTPROT_DHCP;
+ else
#endif
if (rt->rt_dflags & RTDF_IFA_ROUTE)
nlm.rt.rtm_protocol = RTPROT_KERNEL;
#ifdef HAVE_ROUTE_METRIC
rt->rt_metric = ifp->metric;
#endif
- if (rap != NULL) {
+ if (rap != NULL)
rt->rt_mtu = rap->mtu;
- rt->rt_dflags |= RTDF_RA;
- }
return rt;
}
if (addr->prefix_vltime == 0)
continue;
rt = inet6_makeprefix(rap->iface, rap, addr);
- if (rt)
+ if (rt) {
+ rt->rt_dflags |= RTDF_RA;
TAILQ_INSERT_TAIL(routes, rt, rt_next);
+ }
}
if (rap->lifetime) {
rt = inet6_makerouter(rap);
if (rt) {
+ rt->rt_dflags |= RTDF_RA;
TAILQ_INSERT_TAIL(routes, rt, rt_next);
if (have_default)
*have_default = true;
if (d6_state && d6_state->state == dstate) {
TAILQ_FOREACH(addr, &d6_state->addrs, next) {
rt = inet6_makeprefix(ifp, NULL, addr);
- if (rt)
+ if (rt) {
+ rt->rt_dflags |= RTDF_DHCP;
TAILQ_INSERT_TAIL(routes, rt, rt_next);
+ }
}
}
}
#define RTDF_IFA_ROUTE 0x02 /* Address generated route */
#define RTDF_FAKE 0x04 /* Maybe us on lease reboot */
#define RTDF_RA 0x08 /* Router Advertisement */
+#define RTDF_DHCP 0x10 /* DHCP route */
};
TAILQ_HEAD(rt_head, rt);