Remi Locherer(remi.loche...@relo.ch) on 2019.01.02 20:00:19 +0100:
> 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?

ok benno@

 
> 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