On Sun, Dec 22, 2019 at 06:35:47PM +0100, Denis Fondras wrote:
> area is now part of struct iface
>
> Code looks cleaner and more like ospfd.
ok remi@
>
> Index: area.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/area.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 area.c
> --- area.c28 Dec 2008 20:08:31 - 1.4
> +++ area.c22 Dec 2019 17:18:49 -
> @@ -88,19 +88,24 @@ area_find(struct ospfd_conf *conf, struc
> }
>
> void
> -area_track(struct area *area, int state)
> +area_track(struct area *area)
> {
> - int old = area->active;
> + int old = area->active;
> + struct iface*iface;
>
> - if (state & NBR_STA_FULL)
> - area->active++;
> - else if (area->active == 0)
> - fatalx("area_track: area already inactive");
> - else
> - area->active--;
> -
> - if (area->active == 0 || old == 0)
> + area->active = 0;
> + LIST_FOREACH(iface, &area->iface_list, entry) {
> + if (iface->state & IF_STA_DOWN)
> + continue;
> + area->active = 1;
> + break;
> + }
> +
> + if (area->active != old) {
> + ospfe_imsg_compose_rde(IMSG_AREA_CHANGE, area->id.s_addr, 0,
> + &area->active, sizeof(area->active));
> ospfe_demote_area(area, old == 0);
> + }
> }
>
> int
> @@ -110,7 +115,7 @@ area_border_router(struct ospfd_conf *co
> int active = 0;
>
> LIST_FOREACH(area, &conf->area_list, entry)
> - if (area->active > 0)
> + if (area->active)
> active++;
>
> return (active > 1);
> @@ -124,5 +129,5 @@ area_ospf_options(struct area *area)
> if (area && !area->stub)
> opt |= OSPF_OPTION_E;
>
> - return opt;
> + return (opt);
> }
> Index: database.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/database.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 database.c
> --- database.c11 Dec 2019 21:33:56 - 1.17
> +++ database.c22 Dec 2019 17:18:49 -
> @@ -134,8 +134,7 @@ send_db_description(struct nbr *nbr)
> fatalx("send_db_description: unknown interface type");
> }
>
> - dd_hdr.opts = htonl(area_ospf_options(area_find(oeconf,
> - nbr->iface->area_id)));
> + dd_hdr.opts = htonl(area_ospf_options(nbr->iface->area));
> dd_hdr.bits = bits;
> dd_hdr.dd_seq_num = htonl(nbr->dd_seq_num);
>
> Index: hello.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/hello.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 hello.c
> --- hello.c 11 Dec 2019 21:33:56 - 1.19
> +++ hello.c 22 Dec 2019 17:18:49 -
> @@ -72,7 +72,7 @@ send_hello(struct iface *iface)
> /* hello header */
> hello.iface_id = htonl(iface->ifindex);
> LSA_24_SETHI(hello.opts, iface->priority);
> - opts = area_ospf_options(area_find(oeconf, iface->area_id));
> + opts = area_ospf_options(iface->area);
> LSA_24_SETLO(hello.opts, opts);
> hello.opts = htonl(hello.opts);
>
> @@ -148,7 +148,7 @@ recv_hello(struct iface *iface, struct i
> return;
> }
>
> - if ((area = area_find(oeconf, iface->area_id)) == NULL)
> + if ((area = iface->area) == NULL)
> fatalx("interface lost area");
>
> opts = LSA_24_GETLO(ntohl(hello.opts));
> Index: interface.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/interface.c,v
> retrieving revision 1.26
> diff -u -p -r1.26 interface.c
> --- interface.c 22 Dec 2019 15:34:52 - 1.26
> +++ interface.c 22 Dec 2019 17:18:49 -
> @@ -143,6 +143,7 @@ if_fsm(struct iface *iface, enum iface_e
> iface->state = new_state;
>
> if (iface->state != old_state) {
> + area_track(iface->area);
> orig_rtr_lsa(iface);
> orig_link_lsa(iface);
>
> @@ -649,7 +650,7 @@ if_to_ctl(struct iface *iface)
> memcpy(ictl.name, iface->name, sizeof(ictl.name));
> memcpy(&ictl.addr, &iface->addr, sizeof(ictl.addr));
> ictl.rtr_id.s_addr = ospfe_router_id();
> - memcpy(&ictl.area, &iface->area_id, sizeof(ictl.area));
> + memcpy(&ictl.area, &iface->area->id, sizeof(ictl.area));
> if (iface->dr) {
> memcpy(&ictl.dr_id, &iface->dr->id, sizeof(ictl.dr_id));
> memcpy(&ictl.dr_addr, &iface->dr->addr, sizeof(ictl.dr_addr));
> Index: neighbor.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/neighbor.c,v
> retrieving revision 1.14
> diff -u -p -r1.14 neighbor.c
> --- neighbor.c9 Feb 2018 03:53:37 - 1.14
> +++ neighbor.c22 De