Re: ospf6d: add reference to area in struct iface

2019-12-22 Thread Remi Locherer
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

ospf6d: add reference to area in struct iface

2019-12-22 Thread Denis Fondras
area is now part of struct iface

Code looks cleaner and more like ospfd.

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.c  28 Dec 2008 20:08:31 -  1.4
+++ area.c  22 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.c  11 Dec 2019 21:33:56 -  1.17
+++ database.c  22 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.c  9 Feb 2018 03:53:37 -   1.14
+++ neighbor.c  22 Dec 2019 17:18:49 -
@@ -202,8 +202,6 @@ nbr_fsm(struct nbr *nbr, enum nbr_event 
 * neighbor changed from/to FULL
 * originate new rtr and net LSA
 */
-