]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixed processing of !krt_capable() routes. Converted device route decisions
authorMartin Mares <mj@ucw.cz>
Thu, 4 Mar 1999 19:00:31 +0000 (19:00 +0000)
committerMartin Mares <mj@ucw.cz>
Thu, 4 Mar 1999 19:00:31 +0000 (19:00 +0000)
to the krt_capable mechanism as well.

sysdep/linux/netlink/netlink.c
sysdep/unix/krt-set.c
sysdep/unix/krt.c

index 64e3aa2f138fbc7c6fd51f5a9d211f2fbcbeb8eb..4aadc859d7f6200de566f8ab222b89df2fa14bae 100644 (file)
@@ -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)
     {
index 2165255eeebce5604fd30d86f50a00597cb7d97f..ca00a2cdd79580bbeede93571bb6a254213fbc08 100644 (file)
@@ -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)
index aa875ccf00392e005c334732a807dc3616def774..9ad4237953167c5893357d3777d0470cb2b3920e 100644 (file)
@@ -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);