On Thu, Jan 02, 2020 at 05:17:02PM +0100, Denis Fondras wrote: > Sync with ospfd's hello.c
ok remi@ > > Index: hello.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ospf6d/hello.c,v > retrieving revision 1.21 > diff -u -p -r1.21 hello.c > --- hello.c 23 Dec 2019 11:25:41 -0000 1.21 > +++ hello.c 2 Jan 2020 16:11:19 -0000 > @@ -41,8 +41,6 @@ send_hello(struct iface *iface) > struct hello_hdr hello; > struct nbr *nbr; > struct ibuf *buf; > - int ret; > - u_int32_t opts; > > switch (iface->type) { > case IF_TYPE_POINTOPOINT: > @@ -72,10 +70,8 @@ send_hello(struct iface *iface) > /* hello header */ > hello.iface_id = htonl(iface->ifindex); > LSA_24_SETHI(hello.opts, iface->priority); > - opts = area_ospf_options(iface->area); > - LSA_24_SETLO(hello.opts, opts); > + LSA_24_SETLO(hello.opts, area_ospf_options(iface->area)); > hello.opts = htonl(hello.opts); > - > hello.hello_interval = htons(iface->hello_interval); > hello.rtr_dead_interval = htons(iface->dead_interval); > > @@ -104,10 +100,11 @@ send_hello(struct iface *iface) > if (upd_ospf_hdr(buf, iface)) > goto fail; > > - ret = send_packet(iface, buf, &dst); > + if (send_packet(iface, buf, &dst) == -1) > + goto fail; > > ibuf_free(buf); > - return (ret); > + return (0); > fail: > log_warn("send_hello"); > ibuf_free(buf); > @@ -120,7 +117,6 @@ recv_hello(struct iface *iface, struct i > { > struct hello_hdr hello; > struct nbr *nbr = NULL, *dr; > - struct area *area; > u_int32_t nbr_id, opts; > int nbr_change = 0; > > @@ -148,12 +144,9 @@ recv_hello(struct iface *iface, struct i > return; > } > > - if ((area = iface->area) == NULL) > - fatalx("interface lost area"); > - > opts = LSA_24_GETLO(ntohl(hello.opts)); > - if ((opts & OSPF_OPTION_E && area->stub) || > - ((opts & OSPF_OPTION_E) == 0 && !area->stub)) { > + if ((opts & OSPF_OPTION_E && iface->area->stub) || > + ((opts & OSPF_OPTION_E) == 0 && !iface->area->stub)) { > log_warnx("recv_hello: ExternalRoutingCapability mismatch, " > "interface %s", iface->name); > return; > @@ -161,8 +154,15 @@ recv_hello(struct iface *iface, struct i > > /* match router-id */ > LIST_FOREACH(nbr, &iface->nbr_list, entry) { > - if (nbr == iface->self) > + if (nbr == iface->self) { > + if (nbr->id.s_addr == rtr_id) { > + log_warnx("recv_hello: Router-ID collision on " > + "interface %s neighbor IP %s", iface->name, > + log_in6addr(src)); > + return; > + } > continue; > + } > if (nbr->id.s_addr == rtr_id) > break; > } >