diff options
-rw-r--r-- | sysdep/linux/netlink/netlink.c | 6 | ||||
-rw-r--r-- | sysdep/unix/krt-set.c | 25 | ||||
-rw-r--r-- | sysdep/unix/krt.c | 11 |
3 files changed, 17 insertions, 25 deletions
diff --git a/sysdep/linux/netlink/netlink.c b/sysdep/linux/netlink/netlink.c index 64e3aa2..4aadc85 100644 --- a/sysdep/linux/netlink/netlink.c +++ b/sysdep/linux/netlink/netlink.c @@ -430,6 +430,8 @@ krt_capable(rte *e) if (a->cast != RTC_UNICAST) /* FIXME: For IPv6, we might support anycasts as well */ return 0; + if (a->source == RTS_DEVICE) /* Kernel takes care of device routes itself */ + return 0; switch (a->dest) { case RTD_ROUTER: @@ -501,9 +503,9 @@ nl_send_route(rte *e, int new) void krt_set_notify(struct proto *p, net *n, rte *new, rte *old) { - if (old && old->attrs->source == RTS_DEVICE) /* Device routes are left to the kernel */ + if (old && !krt_capable(old)) old = NULL; - if (new && new->attrs->source == RTS_DEVICE) + if (new && !krt_capable(new)) new = NULL; if (old && new && old->attrs->tos == new->attrs->tos) { diff --git a/sysdep/unix/krt-set.c b/sysdep/unix/krt-set.c index 2165255..ca00a2c 100644 --- a/sysdep/unix/krt-set.c +++ b/sysdep/unix/krt-set.c @@ -26,6 +26,10 @@ krt_capable(rte *e) { rta *a = e->attrs; +#ifdef CONFIG_AUTO_ROUTES + if (a->source == RTS_DEVICE) + return 0; +#endif return a->cast == RTC_UNICAST && (a->dest == RTD_ROUTER @@ -37,18 +41,6 @@ krt_capable(rte *e) !a->tos; } -static inline int -krt_capable_op(rte *e) -{ - rta *a = e->attrs; - -#ifdef CONFIG_AUTO_ROUTES - if (a->source == RTS_DEVICE) - return 0; -#endif - return krt_capable(e); -} - static void krt_ioctl(int ioc, rte *e, char *name) { @@ -84,12 +76,12 @@ krt_ioctl(int ioc, rte *e, char *name) log(L_ERR "%s(%I/%d): %m", name, net->n.prefix, net->n.pxlen); } -static void +static inline void krt_remove_route(rte *old) { net *net = old->net; - if (!krt_capable_op(old)) + if (!krt_capable(old)) { DBG("krt_remove_route(ignored %I/%d)\n", net->n.prefix, net->n.pxlen); return; @@ -98,12 +90,12 @@ krt_remove_route(rte *old) krt_ioctl(SIOCDELRT, old, "SIOCDELRT"); } -static void +static inline void krt_add_route(rte *new) { net *net = new->net; - if (!krt_capable_op(new)) + if (!krt_capable(new)) { DBG("krt_add_route(ignored %I/%d)\n", net->n.prefix, net->n.pxlen); return; @@ -115,7 +107,6 @@ krt_add_route(rte *new) void krt_set_notify(struct proto *x, net *net, rte *new, rte *old) { - /* FIXME: Fold remove/add route here */ if (old) krt_remove_route(old); if (new) diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index aa875cc..9ad4237 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -88,12 +88,11 @@ krt_got_route(struct krt_proto *p, rte *e) return; } - old = net->routes; - if (old && !krt_capable(old)) - old = NULL; - if (old) + if (old = net->routes) { - if (krt_uptodate(e, net->routes)) + if (!krt_capable(old)) + verdict = krt_capable(e) ? KRF_DELETE : KRF_SEEN; + else if (krt_uptodate(e, net->routes)) verdict = KRF_SEEN; else verdict = KRF_UPDATE; @@ -156,7 +155,7 @@ krt_prune(struct krt_proto *p) DBG("krt_prune: removing inherited %I/%d\n", n->n.prefix, n->n.pxlen); rte_update(n, pp, NULL); } - else + else if (krt_capable(new)) { DBG("krt_prune: reinstalling %I/%d\n", n->n.prefix, n->n.pxlen); krt_set_notify(pp, n, new, NULL); |