i think this is ok
Jeremie Courreges-Anglas(j...@wxcvbn.org) on 2016.12.21 12:08:23 +0100:
>
> 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
>