Hi,

After ospfd here's a diff to make ospf6d refresh his view of an
interface's MTU at runtime.  This needs a fresh kernel.

The parent should pass the IFINFO message to its children first, and
then decide to react to a possible interface change.  Like for ospfd,
the engine runs the FSM only if the interface state has actually
changed.

ok?


Index: ospf6ctl/ospf6ctl.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/ospf6ctl/ospf6ctl.c,v
retrieving revision 1.43
diff -u -p -r1.43 ospf6ctl.c
--- ospf6ctl/ospf6ctl.c 5 Dec 2015 13:12:40 -0000       1.43
+++ ospf6ctl/ospf6ctl.c 5 Dec 2016 22:40:53 -0000
@@ -409,9 +409,10 @@ show_interface_detail_msg(struct imsg *i
                    iface->name, print_link(iface->flags));
                printf("  Internet address %s Area %s\n",
                    log_in6addr(&iface->addr), inet_ntoa(iface->area));
-               printf("  Link type %s, state %s",
+               printf("  Link type %s, state %s, mtu %d",
                    get_media_descr(get_ifms_type(iface->if_type)),
-                   get_linkstate(iface->if_type, iface->linkstate));
+                   get_linkstate(iface->if_type, iface->linkstate),
+                   iface->mtu);
                if (iface->linkstate != LINK_STATE_DOWN &&
                    iface->baudrate > 0) {
                    printf(", ");
Index: ospf6d/kroute.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/ospf6d/kroute.c,v
retrieving revision 1.48
diff -u -p -r1.48 kroute.c
--- ospf6d/kroute.c     17 Jul 2015 20:12:38 -0000      1.48
+++ ospf6d/kroute.c     20 Dec 2016 16:09:14 -0000
@@ -729,12 +729,6 @@ if_change(u_short ifindex, int flags, st
                return;
        }
 
-       isvalid = (iface->flags & IFF_UP) &&
-           LINK_STATE_IS_UP(iface->linkstate);
-
-       if (wasvalid == isvalid)
-               return;         /* nothing changed wrt validity */
-
        /* inform engine and rde about state change if interface is used */
        if (iface->cflags & F_IFACE_CONFIGURED) {
                main_imsg_compose_ospfe(IMSG_IFINFO, 0, iface,
@@ -742,6 +736,12 @@ if_change(u_short ifindex, int flags, st
                main_imsg_compose_rde(IMSG_IFINFO, 0, iface,
                    sizeof(struct iface));
        }
+
+       isvalid = (iface->flags & IFF_UP) &&
+           LINK_STATE_IS_UP(iface->linkstate);
+
+       if (wasvalid == isvalid)
+               return;         /* nothing changed wrt validity */
 
        /* update redistribute list */
        RB_FOREACH(kr, kroute_tree, &krt) {
Index: ospf6d/ospfe.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/ospf6d/ospfe.c,v
retrieving revision 1.49
diff -u -p -r1.49 ospfe.c
--- ospf6d/ospfe.c      3 Sep 2016 10:25:36 -0000       1.49
+++ ospf6d/ospfe.c      21 Dec 2016 10:55:11 -0000
@@ -260,7 +260,7 @@ ospfe_dispatch_main(int fd, short event,
        struct imsg              imsg;
        struct imsgev           *iev = bula;
        struct imsgbuf          *ibuf = &iev->ibuf;
-       int                      n, stub_changed, shut = 0;
+       int                      n, stub_changed, shut = 0, isvalid, wasvalid;
        unsigned int             ifindex;
 
        if (event & EV_READ) {
@@ -293,11 +293,19 @@ ospfe_dispatch_main(int fd, short event,
                        if (iface == NULL)
                                fatalx("interface lost in ospfe");
 
+                       wasvalid = (iface->flags & IFF_UP) &&
+                           LINK_STATE_IS_UP(iface->linkstate);
+
                        if_update(iface, ifp->mtu, ifp->flags, ifp->if_type,
                            ifp->linkstate, ifp->baudrate);
 
-                       if ((iface->flags & IFF_UP) &&
-                           LINK_STATE_IS_UP(iface->linkstate)) {
+                       isvalid = (iface->flags & IFF_UP) &&
+                           LINK_STATE_IS_UP(iface->linkstate);
+
+                       if (wasvalid == isvalid)
+                               break;
+
+                       if (isvalid) {
                                if_fsm(iface, IF_EVT_UP);
                                log_warnx("interface %s up", iface->name);
                        } else {


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to