Remi Locherer <[email protected]> writes:
> Hi,
>
> I ran into problems with mtu sizes on interfaces (gif in my case) and
> ospfd. mtu was not the same on both sites so adjacency could not be
> formed. The mtu mismatch is also logged by ospfd.
>
> Just changing the MTU with ifconfig is not enough in such a case. I did
> not want to restart ospfd since that produces an outage. What I did:
>
> * ifconfig gif1 down
> * vi /etc/ospfd.conf -> remove gif1
> * ospfctl reload
> * ifconfig gif1 mtu 1380 up
> * vi /etc/ospfd.conf -> add gif1
> * ospfctl reload
>
> To make this a bit easier I propose the below two patches.
>
> The first displays the mtu currently known by ospd with ospfctl. Eg:
>
> -----
> remi@mistral:~% doas /usr/src/usr.sbin/ospfctl/obj/ospfctl sho int iwm0
>
> Interface iwm0, line protocol is UP
> Internet address 172.18.35.224/24, Area 0.0.0.0
> Linkstate active, MTU 1500
> ^^^^^^^^
> Router ID 10.10.10.1, network type BROADCAST, cost: 10
> Transmit delay is 1 sec(s), state DR, priority 1
> Designated Router (ID) 10.10.10.1, interface address 172.18.35.224
> Backup Designated Router (ID) 0.0.0.0, interface address 0.0.0.0
> Timer intervals configured, hello 10, dead 40, wait 40, retransmit 5
> Hello timer due in 00:00:06+345msec
> Uptime 00:00:44
> Neighbor count is 0, adjacent neighbor count is 0
> -----
Makes sense.
>
> The second patch allows ospfd to learn about a changed mtu value (or other
> interface configs) with a "ospfctl reload".
>
> Would it be better if an mtu change generates a route message that is
> picked up by ospfd the same way as other changes to interfaces configs?
I think so. Does the diff below work for you?
Index: sys/net/if.c
===================================================================
RCS file: /d/cvs/src/sys/net/if.c,v
retrieving revision 1.462
diff -u -p -r1.462 if.c
--- sys/net/if.c 21 Nov 2016 09:09:06 -0000 1.462
+++ sys/net/if.c 26 Nov 2016 08:26:08 -0000
@@ -1886,6 +1886,8 @@ ifioctl(struct socket *so, u_long cmd, c
if (ifp->if_ioctl == NULL)
return (EOPNOTSUPP);
error = (*ifp->if_ioctl)(ifp, cmd, data);
+ if (!error)
+ rt_ifmsg(ifp);
break;
case SIOCSIFPHYADDR:
Index: usr.sbin/ospfctl/ospfctl.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/ospfctl/ospfctl.c,v
retrieving revision 1.63
diff -u -p -r1.63 ospfctl.c
--- usr.sbin/ospfctl/ospfctl.c 3 Dec 2015 11:42:14 -0000 1.63
+++ usr.sbin/ospfctl/ospfctl.c 26 Nov 2016 08:23:52 -0000
@@ -434,8 +434,9 @@ show_interface_detail_msg(struct imsg *i
inet_ntoa(iface->addr),
mask2prefixlen(iface->mask.s_addr));
printf("Area %s\n", inet_ntoa(iface->area));
- printf(" Linkstate %s\n",
+ printf(" Linkstate %s,",
get_linkstate(iface->if_type, iface->linkstate));
+ printf(" MTU %d\n", iface->mtu);
printf(" Router ID %s, network type %s, cost: %d\n",
inet_ntoa(iface->rtr_id),
if_type_name(iface->type), iface->metric);
Index: usr.sbin/ospfd/ospfe.c
===================================================================
RCS file: /d/cvs/src/usr.sbin/ospfd/ospfe.c,v
retrieving revision 1.96
diff -u -p -r1.96 ospfe.c
--- usr.sbin/ospfd/ospfe.c 3 Sep 2016 10:22:57 -0000 1.96
+++ usr.sbin/ospfd/ospfe.c 26 Nov 2016 08:30:34 -0000
@@ -318,6 +318,7 @@ ospfe_dispatch_main(int fd, short event,
iface->flags = kif->flags;
iface->linkstate =
kif->link_state;
+ iface->mtu = kif->mtu;
if (link_ok) {
if_fsm(iface,
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE