]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Signal problems with route installation to kernel tables.
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 6 Oct 2011 20:48:49 +0000 (22:48 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 6 Oct 2011 20:48:49 +0000 (22:48 +0200)
nest/route.h
nest/rt-table.c
proto/ospf/packet.c
sysdep/bsd/krt-sock.c
sysdep/linux/netlink/netlink.c
sysdep/unix/krt.h

index 641b9248007d2d1b9b610ed71d64c186d635c49b..a4c015489ca09cb1f78d62988b954dd8c4a482bd 100644 (file)
@@ -321,6 +321,10 @@ typedef struct rta {
 #define RTD_MULTIPATH 5                        /* Multipath route (nexthops != NULL) */
 #define RTD_NONE 6                     /* Invalid RTD */
 
+                                       /* Flags for net->n.flags, used by kernel syncer */
+#define KRF_INSTALLED 0x80             /* This route should be installed in the kernel */
+#define KRF_SYNC_ERROR 0x40            /* Error during kernel table synchronization */
+
 #define RTAF_CACHED 1                  /* This is a cached rta */
 
 #define IGP_METRIC_UNKNOWN 0x80000000  /* Default igp_metric used when no other
index 3ff53ff4d411abafea67d01f47feeae17e1dfb1d..e20d2f6dca651f7983983cb5792fdcafdc08f4b1 100644 (file)
@@ -1645,6 +1645,7 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, ea_list *tm
   byte tm[TM_DATETIME_BUFFER_SIZE], info[256];
   rta *a = e->attrs;
   int primary = (e->net->routes == e);
+  int sync_error = (e->net->n.flags & KRF_SYNC_ERROR);
   struct mpnh *nh;
 
   rt_format_via(e, via);
@@ -1667,7 +1668,7 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, ea_list *tm
   else
     bsprintf(info, " (%d)", e->pref);
   cli_printf(c, -1007, "%-18s %s [%s %s%s]%s%s", ia, via, a->proto->name,
-            tm, from, primary ? " *" : "", info);
+            tm, from, primary ? (sync_error ? " !" : " *") : "", info);
   for (nh = a->nexthops; nh; nh = nh->next)
     cli_printf(c, -1007, "\tvia %I on %s weight %d", nh->gw, nh->iface->name, nh->weight + 1);
   if (d->verbose)
index 307629722fdb76c6ea1e8ae3957c2a4d8a54244d..df67d5a0a46e9c0f4d32a80c10a3a6f50cb337e2 100644 (file)
@@ -499,7 +499,7 @@ ospf_err_hook(sock * sk, int err)
 {
 //  struct ospf_iface *ifa= (struct ospf_iface *) (sk->data);
 //  struct proto *p = (struct proto *) (ifa->oa->po);
-  log(L_ERR "OSPF: Socket error: %m", err);
+  log(L_ERR "OSPF: Socket error: %M", err);
 }
 
 void
index f6bc4a2caf3eb1f4f87dc329ceb907ff587d322d..72295906d4242eaed3dbee1dc399604343b2ee27 100644 (file)
@@ -68,7 +68,7 @@ krt_capable(rte *e)
     memcpy(p, body, (l > sizeof(*p) ? sizeof(*p) : l));\
     body += l;}
 
-static void
+static int
 krt_sock_send(int cmd, rte *e)
 {
   net *net = e->net;
@@ -160,7 +160,7 @@ krt_sock_send(int cmd, rte *e)
 
         if(!i->addr) {
           log(L_ERR "KRT: interface %s has no IP addess", i->name);
-          return;
+          return -1;
         }
 
         fill_in_sockaddr(&gate, i->addr->ip, 0);
@@ -182,22 +182,27 @@ krt_sock_send(int cmd, rte *e)
 
   if ((l = write(rt_sock, (char *)&msg, l)) < 0) {
     log(L_ERR "KRT: Error sending route %I/%d to kernel", net->n.prefix, net->n.pxlen);
+    return -1;
   }
+
+  return 0;
 }
 
 void
-krt_set_notify(struct krt_proto *p UNUSED, net *net, rte *new, rte *old)
+krt_set_notify(struct krt_proto *p UNUSED, net *n, rte *new, rte *old)
 {
+  int err = 0;
+
   if (old)
-    {
-      DBG("krt_remove_route(%I/%d)\n", net->n.prefix, net->n.pxlen);
-      krt_sock_send(RTM_DELETE, old);
-    }
+    krt_sock_send(RTM_DELETE, old);
+
   if (new)
-    {
-      DBG("krt_add_route(%I/%d)\n", net->n.prefix, net->n.pxlen);
-      krt_sock_send(RTM_ADD, new);
-    }
+    err = krt_sock_send(RTM_ADD, new);
+
+  if (err < 0)
+    n->n.flags |= KRF_SYNC_ERROR;
+  else
+    n->n.flags &= ~KRF_SYNC_ERROR;
 }
 
 static int
index 0830097a10e0ba01acc3e5544cc8e04d6abbfabb..f8a5d6329b372e0efeb58c4240bcd0062c1c7449 100644 (file)
@@ -198,7 +198,7 @@ nl_exchange(struct nlmsghdr *pkt)
        break;
       log(L_WARN "nl_exchange: Unexpected reply received");
     }
-  return nl_error(h);
+  return nl_error(h) ? -1 : 0;
 }
 
 /*
@@ -616,7 +616,7 @@ nh_bufsize(struct mpnh *nh)
   return rv;
 }
 
-static void
+static int
 nl_send_route(struct krt_proto *p, rte *e, int new)
 {
   eattr *ea;
@@ -663,7 +663,7 @@ nl_send_route(struct krt_proto *p, rte *e, int new)
       break;
     case RTD_DEVICE:
       if (!a->iface)
-       return;
+       return -1;
       r.r.rtm_type = RTN_UNICAST;
       nl_add_attr_u32(&r.h, sizeof(r), RTA_OIF, a->iface->index);
       break;
@@ -684,17 +684,24 @@ nl_send_route(struct krt_proto *p, rte *e, int new)
       bug("krt_capable inconsistent with nl_send_route");
     }
 
-  nl_exchange(&r.h);
+  return nl_exchange(&r.h);
 }
 
 void
-krt_set_notify(struct krt_proto *p, net *n UNUSED, rte *new, rte *old)
+krt_set_notify(struct krt_proto *p, net *n, rte *new, rte *old)
 {
+  int err = 0;
+
   if (old)
     nl_send_route(p, old, 0);
 
   if (new)
-    nl_send_route(p, new, 1);
+    err = nl_send_route(p, new, 1);
+
+  if (err < 0)
+    n->n.flags |= KRF_SYNC_ERROR;
+  else
+    n->n.flags &= ~KRF_SYNC_ERROR;
 }
 
 
index c88bc4848fde8552a22ade1ad8ac0812da0153fa..f83e6ee67a6c63778d902dfe95f6310135198cb5 100644 (file)
@@ -19,7 +19,7 @@ struct kif_proto;
 #include "lib/krt-set.h"
 #include "lib/krt-iface.h"
 
-/* Flags stored in net->n.flags */
+/* Flags stored in net->n.flags, rest are in nest/route.h */
 
 #define KRF_VERDICT_MASK 0x0f
 #define KRF_CREATE 0                   /* Not seen in kernel table */
@@ -28,9 +28,6 @@ struct kif_proto;
 #define KRF_DELETE 3                   /* Should be deleted */
 #define KRF_IGNORE 4                   /* To be ignored */
 
-#define KRF_INSTALLED 0x80             /* This route should be installed in the kernel */
-
-
 #define EA_KRT_PREFSRC EA_CODE(EAP_KRT, 0)
 #define EA_KRT_REALM EA_CODE(EAP_KRT, 1)