Hi tech,

ospfd detects and removes routes in the kernel routing table with priority
RTP_OSPF (or the configured fib-priority) that have been inserted by another
program.

Below diff adds the same behaviour to ospf6d.

OK?

Remi


Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/kroute.c,v
retrieving revision 1.59
diff -u -p -r1.59 kroute.c
--- kroute.c    29 Dec 2018 16:04:31 -0000      1.59
+++ kroute.c    2 Jan 2019 12:37:25 -0000
@@ -1347,6 +1347,7 @@ dispatch_rtmsg(void)
        int                      flags, mpath;
        unsigned int             scope;
        u_short                  ifindex = 0;
+       int                      rv;
 
        if ((n = read(kr_state.fd, &buf, sizeof(buf))) == -1) {
                if (errno == EAGAIN || errno == EINTR)
@@ -1512,15 +1513,27 @@ add:
                                kr->r.ifindex = ifindex;
                                kr->r.priority = prio;
 
-                               if ((label = (struct sockaddr_rtlabel *)
-                                   rti_info[RTAX_LABEL]) != NULL) {
-                                       kr->r.rtlabel =
-                                           rtlabel_name2id(label->sr_label);
-                                       kr->r.ext_tag =
-                                           rtlabel_id2tag(kr->r.rtlabel);
-                               }
+                               if (rtm->rtm_priority == kr_state.fib_prio) {
+                                       log_warnx("alien OSPF route %s/%d",
+                                           log_in6addr(&prefix), prefixlen);
+                                       rv = send_rtmsg(kr_state.fd,
+                                           RTM_DELETE, &kr->r);
+                                       free(kr);
+                                       if (rv == -1)
+                                               return (-1);
+                               } else {
+                                       if ((label = (struct sockaddr_rtlabel *)
+                                           rti_info[RTAX_LABEL]) != NULL) {
+                                               kr->r.rtlabel =
+                                                   rtlabel_name2id(
+                                                   label->sr_label);
+                                               kr->r.ext_tag =
+                                                   rtlabel_id2tag(
+                                                   kr->r.rtlabel);
+                                       }
 
-                               kroute_insert(kr);
+                                       kroute_insert(kr);
+                               }
                        }
                        break;
                case RTM_DELETE:


Reply via email to