get_addrs(rtm->rtm_addrs, cp, rti_info);
memset(rt, 0, sizeof(*rt));
+ rt->flags = rtm->rtm_flags;
COPYOUT(rt->dest, rti_info[RTAX_DST]);
if (rtm->rtm_addrs & RTA_NETMASK)
COPYOUT(rt->net, rti_info[RTAX_NETMASK]);
get_addrs(rtm->rtm_addrs, cp, rti_info);
memset(rt, 0, sizeof(*rt));
+ rt->flags = rtm->rtm_flags;
COPYOUT6(rt->dest, rti_info[RTAX_DST]);
if (rtm->rtm_addrs & RTA_NETMASK) {
/*
return -1;
memset(rt, 0, sizeof(*rt));
+ ipv6_mask(&rt->net, rtm->rtm_dst_len);
+ if (rtm->rtm_type == RTN_UNREACHABLE)
+ rt->flags = RTF_REJECT;
+
rta = (struct rtattr *)RTM_RTA(rtm);
len = RTM_PAYLOAD(nlm);
while (RTA_OK(rta, len)) {
rta = RTA_NEXT(rta, len);
}
- ipv6_mask(&rt->net, rtm->rtm_dst_len);
return 0;
}
#endif
add_attr_32(&nlm.hdr, sizeof(nlm),
RTA_PRIORITY, rt->metric);
}
-
if (cmd == RTM_ADD && rt->mtu) {
char metricsbuf[32];
struct rtattr *metrics = (void *)metricsbuf;
if (ort == NULL) {
ort = ipv4_findrt(nrt->iface->ctx, nrt, 0);
- if (ort && ort->iface == nrt->iface &&
+ if (ort &&
+ ((ort->flags & RTF_REJECT && nrt->flags & RTF_REJECT) ||
+ (ort->iface == nrt->iface &&
#ifdef HAVE_ROUTE_METRIC
ort->metric == nrt->metric &&
#endif
- ort->gate.s_addr == nrt->gate.s_addr)
+ IN6_ARE_ADDR_EQUAL(&ort->gate, &nrt->gate))))
return 0;
} else if (ort->flags & STATE_FAKE && !(nrt->flags & STATE_FAKE) &&
ort->iface == nrt->iface &&
TAILQ_FOREACH(r, &ctx->ipv6->kroutes, next) {
if (IN6_ARE_ADDR_EQUAL(&rt->dest, &r->dest) &&
- (!flags || rt->iface == r->iface) &&
#ifdef HAVE_ROUTE_METRIC
- rt->iface == r->iface &&
+ (rt->iface == r->iface ||
+ (rt->flags & RTF_REJECT && r->flags & RTF_REJECT)) &&
(!flags || rt->metric == r->metric) &&
#else
- (!flags || rt->iface == r->iface) &&
+ (!flags || rt->iface == r->iface ||
+ (rt->flags & RTF_REJECT && r->flags & RTF_REJECT)) &&
#endif
IN6_ARE_ADDR_EQUAL(&rt->net, &r->net))
return r;
if (ort == NULL) {
ort = ipv6_findrt(nrt->iface->ctx, nrt, 0);
- if (ort && ort->iface == nrt->iface &&
+ if (ort &&
+ ((ort->flags & RTF_REJECT && nrt->flags & RTF_REJECT) ||
+ (ort->iface == nrt->iface &&
#ifdef HAVE_ROUTE_METRIC
ort->metric == nrt->metric &&
#endif
- IN6_ARE_ADDR_EQUAL(&ort->gate, &nrt->gate))
+ IN6_ARE_ADDR_EQUAL(&ort->gate, &nrt->gate))))
return 0;
}