On Mon, Jun 25 2018, Remi Locherer <[email protected]> wrote:
> On Fri, Jun 22, 2018 at 12:25:40AM +0200, Jeremie Courreges-Anglas wrote:
>> On Tue, Jun 19 2018, Remi Locherer <[email protected]> wrote:
>> > On Tue, Jun 19, 2018 at 03:59:24PM +0100, Stuart Henderson wrote:
>> >> On 2018/06/18 08:53, Remi Locherer wrote:
>> >> > Index: ospfd.h
>> >> > ===================================================================
>> >> > RCS file: /cvs/src/usr.sbin/ospfd/ospfd.h,v
>> >> > retrieving revision 1.100
>> >> > diff -u -p -r1.100 ospfd.h
>> >> > --- ospfd.h 11 Feb 2018 02:27:33 -0000 1.100
>> >> > +++ ospfd.h 12 Jun 2018 20:41:43 -0000
>> >> ...
>> >> > -struct ifaddrdel {
>> >> > +struct ifaddr {
>> >> > struct in_addr addr;
>> >> > + struct in_addr mask;
>> >> > + struct in_addr dst;
>> >> > unsigned int ifindex;
>> >> > };
>> >>
>> >> I think it would be better to use a different name.
>> >>
>> >> Even if there's no actual conflict as if_var.h isn't pulled in, this is
>> >> renaming this struct to "struct ifaddr" is at least confusing.
>> >
>> > Oh yes, that is unfortunate.
>> >
>> > What would be a better name for this struct?
>> > iface_addr maybe? Or if_addrmask?
>>
>> ospf6d uses struct ifaddrchange.
>
> Updated diff with "struct ifaddrchage" instead of "struct ifaddr".
>
> OK?
Seems to work fine on my dumb test setup. ok jca@
> Index: kroute.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/kroute.c,v
> retrieving revision 1.109
> diff -u -p -r1.109 kroute.c
> --- kroute.c 11 Feb 2018 02:27:33 -0000 1.109
> +++ kroute.c 25 Jun 2018 06:23:41 -0000
> @@ -1072,8 +1072,9 @@ void
> if_newaddr(u_short ifindex, struct sockaddr_in *ifa, struct sockaddr_in
> *mask,
> struct sockaddr_in *brd)
> {
> - struct kif_node *kif;
> - struct kif_addr *ka;
> + struct kif_node *kif;
> + struct kif_addr *ka;
> + struct ifaddrchange ifn;
>
> if (ifa == NULL || ifa->sin_family != AF_INET)
> return;
> @@ -1094,15 +1095,21 @@ if_newaddr(u_short ifindex, struct socka
> ka->dstbrd.s_addr = INADDR_NONE;
>
> TAILQ_INSERT_TAIL(&kif->addrs, ka, entry);
> +
> + ifn.addr = ka->addr;
> + ifn.mask = ka->mask;
> + ifn.dst = ka->dstbrd;
> + ifn.ifindex = ifindex;
> + main_imsg_compose_ospfe(IMSG_IFADDRADD, 0, &ifn, sizeof(ifn));
> }
>
> void
> if_deladdr(u_short ifindex, struct sockaddr_in *ifa, struct sockaddr_in
> *mask,
> struct sockaddr_in *brd)
> {
> - struct kif_node *kif;
> - struct kif_addr *ka, *nka;
> - struct ifaddrdel ifc;
> + struct kif_node *kif;
> + struct kif_addr *ka, *nka;
> + struct ifaddrchange ifc;
>
> if (ifa == NULL || ifa->sin_family != AF_INET)
> return;
> Index: ospfd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/ospfd.h,v
> retrieving revision 1.100
> diff -u -p -r1.100 ospfd.h
> --- ospfd.h 11 Feb 2018 02:27:33 -0000 1.100
> +++ ospfd.h 25 Jun 2018 06:19:23 -0000
> @@ -132,6 +132,7 @@ enum imsg_type {
> IMSG_RECONF_REDIST,
> IMSG_RECONF_END,
> IMSG_DEMOTE,
> + IMSG_IFADDRADD,
> IMSG_IFADDRDEL
> };
>
> @@ -363,8 +364,10 @@ struct iface {
> u_int8_t passive;
> };
>
> -struct ifaddrdel {
> +struct ifaddrchange {
> struct in_addr addr;
> + struct in_addr mask;
> + struct in_addr dst;
> unsigned int ifindex;
> };
>
> Index: ospfe.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/ospfe.c,v
> retrieving revision 1.100
> diff -u -p -r1.100 ospfe.c
> --- ospfe.c 5 Feb 2018 12:11:28 -0000 1.100
> +++ ospfe.c 25 Jun 2018 06:24:24 -0000
> @@ -275,7 +275,7 @@ ospfe_dispatch_main(int fd, short event,
> {
> static struct area *narea;
> static struct iface *niface;
> - struct ifaddrdel *ifc;
> + struct ifaddrchange *ifc;
> struct imsg imsg;
> struct imsgev *iev = bula;
> struct imsgbuf *ibuf = &iev->ibuf;
> @@ -361,9 +361,38 @@ ospfe_dispatch_main(int fd, short event,
> }
> }
> break;
> + case IMSG_IFADDRADD:
> + if (imsg.hdr.len != IMSG_HEADER_SIZE +
> + sizeof(struct ifaddrchange))
> + fatalx("IFADDRADD imsg with wrong len");
> + ifc = imsg.data;
> +
> + LIST_FOREACH(area, &oeconf->area_list, entry) {
> + LIST_FOREACH(iface, &area->iface_list, entry) {
> + if (ifc->ifindex == iface->ifindex &&
> + ifc->addr.s_addr ==
> + iface->addr.s_addr) {
> + iface->mask = ifc->mask;
> + iface->dst = ifc->dst;
> + /*
> + * Previous down event might
> + * have failed if the address
> + * was not present at that
> + * time.
> + */
> + if_fsm(iface, IF_EVT_DOWN);
> + if_fsm(iface, IF_EVT_UP);
> + log_warnx("interface %s:%s "
> + "returned", iface->name,
> + inet_ntoa(iface->addr));
> + break;
> + }
> + }
> + }
> + break;
> case IMSG_IFADDRDEL:
> if (imsg.hdr.len != IMSG_HEADER_SIZE +
> - sizeof(struct ifaddrdel))
> + sizeof(struct ifaddrchange))
> fatalx("IFADDRDEL imsg with wrong len");
> ifc = imsg.data;
>
>
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE