to the krt_capable mechanism as well.
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:
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)
{
{
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
!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)
{
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;
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;
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)
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;
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);