Re: bgpd kroute_node cleanup

2022-06-22 Thread Theo Buehler
On Wed, Jun 22, 2022 at 06:17:30PM +0200, Claudio Jeker wrote:
> Diff is huge but mostly mechanical. Remove kroute_node, kroute6_node and
> use struct kroute and kroute6 directly. Also do a similar dance for
> struct knexthop_node.

Went over it three times carefully and can't spot anything wrong.

ok



bgpd kroute_node cleanup

2022-06-22 Thread Claudio Jeker
Diff is huge but mostly mechanical. Remove kroute_node, kroute6_node and
use struct kroute and kroute6 directly. Also do a similar dance for
struct knexthop_node.

I left kredist_node and kif_node for now since this diff is already large
enough.
-- 
:wq Claudio

Index: bgpd.h
===
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.435
diff -u -p -r1.435 bgpd.h
--- bgpd.h  22 Jun 2022 15:24:58 -  1.435
+++ bgpd.h  22 Jun 2022 15:25:15 -
@@ -656,13 +656,13 @@ enum suberr_rrefresh {
ERR_RR_INV_LEN = 1
 };
 
-struct kroute_node;
-struct kroute6_node;
-struct knexthop_node;
+struct kroute;
+struct kroute6;
+struct knexthop;
 struct kredist_node;
-RB_HEAD(kroute_tree, kroute_node);
-RB_HEAD(kroute6_tree, kroute6_node);
-RB_HEAD(knexthop_tree, knexthop_node);
+RB_HEAD(kroute_tree, kroute);
+RB_HEAD(kroute6_tree, kroute6);
+RB_HEAD(knexthop_tree, knexthop);
 RB_HEAD(kredist_tree, kredist_node);
 
 struct ktable {
Index: kroute.c
===
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
retrieving revision 1.264
diff -u -p -r1.264 kroute.c
--- kroute.c22 Jun 2022 15:24:58 -  1.264
+++ kroute.c22 Jun 2022 16:09:09 -
@@ -55,41 +55,33 @@ struct {
 } kr_state;
 
 struct kroute {
-   struct in_addr  prefix;
-   struct in_addr  nexthop;
-   uint32_tmplslabel;
-   uint16_tflags;
-   uint16_tlabelid;
-   u_short ifindex;
-   uint8_t prefixlen;
-   uint8_t priority;
+   RB_ENTRY(kroute) entry;
+   struct kroute   *next;
+   struct in_addr   prefix;
+   struct in_addr   nexthop;
+   uint32_t mplslabel;
+   uint16_t flags;
+   uint16_t labelid;
+   u_short  ifindex;
+   uint8_t  prefixlen;
+   uint8_t  priority;
 };
 
 struct kroute6 {
-   struct in6_addr prefix;
-   struct in6_addr nexthop;
-   uint32_tmplslabel;
-   uint16_tflags;
-   uint16_tlabelid;
-   u_short ifindex;
-   uint8_t prefixlen;
-   uint8_t priority;
-};
-
-struct kroute_node {
-   RB_ENTRY(kroute_node)entry;
-   struct krouter;
-   struct kroute_node  *next;
-};
-
-struct kroute6_node {
-   RB_ENTRY(kroute6_node)   entry;
-   struct kroute6   r;
-   struct kroute6_node *next;
+   RB_ENTRY(kroute6)entry;
+   struct kroute6  *next;
+   struct in6_addr  prefix;
+   struct in6_addr  nexthop;
+   uint32_t mplslabel;
+   uint16_t flags;
+   uint16_t labelid;
+   u_short  ifindex;
+   uint8_t  prefixlen;
+   uint8_t  priority;
 };
 
-struct knexthop_node {
-   RB_ENTRY(knexthop_node)  entry;
+struct knexthop {
+   RB_ENTRY(knexthop)   entry;
struct bgpd_addr nexthop;
void*kroute;
 };
@@ -104,12 +96,12 @@ struct kredist_node {
 
 struct kif_kr {
LIST_ENTRY(kif_kr)   entry;
-   struct kroute_node  *kr;
+   struct kroute   *kr;
 };
 
 struct kif_kr6 {
LIST_ENTRY(kif_kr6)  entry;
-   struct kroute6_node *kr;
+   struct kroute6  *kr;
 };
 
 LIST_HEAD(kif_kr_head, kif_kr);
@@ -143,57 +135,50 @@ void  kr_redistribute(int, struct ktable 
 void   kr_redistribute6(int, struct ktable *, struct kroute6 *);
 struct kroute_full *kr_tofull(struct kroute *);
 struct kroute_full *kr6_tofull(struct kroute6 *);
-intkroute_compare(struct kroute_node *, struct kroute_node *);
-intkroute6_compare(struct kroute6_node *, struct kroute6_node *);
-intknexthop_compare(struct knexthop_node *, struct knexthop_node *);
+intkroute_compare(struct kroute *, struct kroute *);
+intkroute6_compare(struct kroute6 *, struct kroute6 *);
+intknexthop_compare(struct knexthop *, struct knexthop *);
 intkredist_compare(struct kredist_node *, struct kredist_node *);
 intkif_compare(struct kif_node *, struct kif_node *);
 
-struct kroute_node *kroute_find(struct ktable *, const struct bgpd_addr *,
+struct kroute  *kroute_find(struct ktable *, const struct bgpd_addr *,
uint8_t, uint8_t);
-struct kroute_node *kroute_matchgw(struct kroute_node *,
-   struct bgpd_addr *);
-int kroute_insert(struct ktable *, struct kroute_node *);
-int kroute_remove(struct ktable *, struct kroute_node *);
-voidkroute_clear(struct ktable *);
+struct kroute  *kroute_matchgw(struct kroute *, struct bgpd_addr *);
+int 

Re: bgpd move struct kroute definition to kroute.c

2022-06-22 Thread Theo Buehler
On Wed, Jun 22, 2022 at 05:00:38PM +0200, Claudio Jeker wrote:
> Both struct kroute and struct kroute6 are no longer used outside of
> kroute.c. As a first step move the definitions over to that file. 
> More will follow :)

ok tb



bgpd move struct kroute definition to kroute.c

2022-06-22 Thread Claudio Jeker
Both struct kroute and struct kroute6 are no longer used outside of
kroute.c. As a first step move the definitions over to that file. 
More will follow :)

-- 
:wq Claudio

? obj
? test
? test.c
Index: bgpd.h
===
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.434
diff -u -p -r1.434 bgpd.h
--- bgpd.h  22 Jun 2022 14:56:12 -  1.434
+++ bgpd.h  22 Jun 2022 14:57:42 -
@@ -690,28 +690,6 @@ struct kroute_full {
uint8_t priority;
 };
 
-struct kroute {
-   struct in_addr  prefix;
-   struct in_addr  nexthop;
-   uint32_tmplslabel;
-   uint16_tflags;
-   uint16_tlabelid;
-   u_short ifindex;
-   uint8_t prefixlen;
-   uint8_t priority;
-};
-
-struct kroute6 {
-   struct in6_addr prefix;
-   struct in6_addr nexthop;
-   uint32_tmplslabel;
-   uint16_tflags;
-   uint16_tlabelid;
-   u_short ifindex;
-   uint8_t prefixlen;
-   uint8_t priority;
-};
-
 struct kroute_nexthop {
struct bgpd_addrnexthop;
struct bgpd_addrgateway;
Index: kroute.c
===
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
retrieving revision 1.263
diff -u -p -r1.263 kroute.c
--- kroute.c22 Jun 2022 14:56:12 -  1.263
+++ kroute.c22 Jun 2022 14:57:42 -
@@ -54,6 +54,28 @@ struct {
uint8_t fib_prio;
 } kr_state;
 
+struct kroute {
+   struct in_addr  prefix;
+   struct in_addr  nexthop;
+   uint32_tmplslabel;
+   uint16_tflags;
+   uint16_tlabelid;
+   u_short ifindex;
+   uint8_t prefixlen;
+   uint8_t priority;
+};
+
+struct kroute6 {
+   struct in6_addr prefix;
+   struct in6_addr nexthop;
+   uint32_tmplslabel;
+   uint16_tflags;
+   uint16_tlabelid;
+   u_short ifindex;
+   uint8_t prefixlen;
+   uint8_t priority;
+};
+
 struct kroute_node {
RB_ENTRY(kroute_node)entry;
struct krouter;



Re: bgpd use struct kroute_full for bgpd_filternexthop

2022-06-22 Thread Theo Buehler
On Wed, Jun 22, 2022 at 04:46:41PM +0200, Claudio Jeker wrote:
> Instead of passing either a struct kroute or struct kroute6 pointer
> use kr_tofull() and use struct kroute_full. This makes the code in
> bgpd_filternexthop() a lot cleaner.

Nice.

ok tb



bgpd use struct kroute_full for bgpd_filternexthop

2022-06-22 Thread Claudio Jeker
Instead of passing either a struct kroute or struct kroute6 pointer
use kr_tofull() and use struct kroute_full. This makes the code in
bgpd_filternexthop() a lot cleaner.

-- 
:wq Claudio

Index: bgpd.c
===
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
retrieving revision 1.246
diff -u -p -r1.246 bgpd.c
--- bgpd.c  15 Jun 2022 10:10:03 -  1.246
+++ bgpd.c  22 Jun 2022 14:18:21 -
@@ -1114,25 +1114,19 @@ send_network(int type, struct network_co
 }
 
 int
-bgpd_filternexthop(struct kroute *kr, struct kroute6 *kr6)
+bgpd_filternexthop(struct kroute_full *kf)
 {
/* kernel routes are never filtered */
-   if (kr && kr->flags & F_KERNEL && kr->prefixlen != 0)
-   return (0);
-   if (kr6 && kr6->flags & F_KERNEL && kr6->prefixlen != 0)
+   if (kf->flags & F_KERNEL && kf->prefixlen != 0)
return (0);
 
if (cflags & BGPD_FLAG_NEXTHOP_BGP) {
-   if (kr && kr->flags & F_BGPD)
-   return (0);
-   if (kr6 && kr6->flags & F_BGPD)
+   if (kf->flags & F_BGPD)
return (0);
}
 
if (cflags & BGPD_FLAG_NEXTHOP_DEFAULT) {
-   if (kr && kr->prefixlen == 0)
-   return (0);
-   if (kr6 && kr6->prefixlen == 0)
+   if (kf->prefixlen == 0)
return (0);
}
 
Index: bgpd.h
===
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.432
diff -u -p -r1.432 bgpd.h
--- bgpd.h  19 Jun 2022 10:30:09 -  1.432
+++ bgpd.h  22 Jun 2022 14:18:21 -
@@ -1268,7 +1268,7 @@ void   send_nexthop_update(struct kroute
 voidsend_imsg_session(int, pid_t, void *, uint16_t);
 int send_network(int, struct network_config *,
 struct filter_set_head *);
-int bgpd_filternexthop(struct kroute *, struct kroute6 *);
+int bgpd_filternexthop(struct kroute_full *);
 voidset_pollfd(struct pollfd *, struct imsgbuf *);
 int handle_pollfd(struct pollfd *, struct imsgbuf *);
 
Index: kroute.c
===
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
retrieving revision 1.260
diff -u -p -r1.260 kroute.c
--- kroute.c19 Jun 2022 10:30:09 -  1.260
+++ kroute.c22 Jun 2022 14:18:21 -
@@ -2494,8 +2494,9 @@ kroute_match(struct ktable *kt, struct b
for (i = 32; i >= 0; i--) {
applymask(, key, i);
if ((kr = kroute_find(kt, , i, RTP_ANY)) != NULL)
-   if (matchall || bgpd_filternexthop(>r, NULL) == 0)
-   return (kr);
+   if (matchall ||
+   bgpd_filternexthop(kr_tofull(>r)) == 0)
+   return (kr);
}
 
return (NULL);
@@ -2512,7 +2513,8 @@ kroute6_match(struct ktable *kt, struct 
for (i = 128; i >= 0; i--) {
applymask(, key, i);
if ((kr6 = kroute6_find(kt, , i, RTP_ANY)) != NULL)
-   if (matchall || bgpd_filternexthop(NULL, >r) == 0)
+   if (matchall ||
+   bgpd_filternexthop(kr6_tofull(>r)) == 0)
return (kr6);
}
 



Re: bgpd/bgpctl use struct kroute_full in nexthop messages

2022-06-22 Thread Claudio Jeker
On Wed, Jun 22, 2022 at 04:37:44PM +0200, Theo Buehler wrote:
> On Wed, Jun 22, 2022 at 04:13:43PM +0200, Claudio Jeker wrote:
> > Do not leak the address family specific struct kroute into bgpctl if there
> > is struct kroute_full which is address family independent.
> > The result is mostly minus because the code no longer needs address family
> > specific code paths.  This changes 'bgpctl show nexthop' but not its output.
> > 
> > OK?
> 
> This reads fine.
> 
> ok
> 
> One thing I noticed while comparing the code paths: should the KAME hack
> in log_in6addr() not be synced with route/show.c similar to the recent
> change in sa2addr()?
> 
> Index: util.c
> ===
> RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
> retrieving revision 1.66
> diff -u -p -r1.66 util.c
> --- util.c19 Jun 2022 10:30:10 -  1.66
> +++ util.c22 Jun 2022 14:32:39 -
> @@ -66,8 +66,10 @@ log_in6addr(const struct in6_addr *addr)
>  
>  #ifdef __KAME__
>   /* XXX thanks, KAME, for this ugliness... adopted from route/show.c */
> - if (IN6_IS_ADDR_LINKLOCAL(_in6.sin6_addr) ||
> - IN6_IS_ADDR_MC_LINKLOCAL(_in6.sin6_addr)) {
> + if ((IN6_IS_ADDR_LINKLOCAL(_in6.sin6_addr) ||
> + IN6_IS_ADDR_MC_LINKLOCAL(_in6.sin6_addr) ||
> + IN6_IS_ADDR_MC_INTFACELOCAL(_in6.sin6_addr)) &&
> + sa_in6.sin6_scope_id == 0) {
>   uint16_t tmp16;
>   memcpy(, _in6.sin6_addr.s6_addr[2], sizeof(tmp16));
>   sa_in6.sin6_scope_id = ntohs(tmp16);
> 

Probably a good idea. OK claudio@

-- 
:wq Claudio



Re: bgpd/bgpctl use struct kroute_full in nexthop messages

2022-06-22 Thread Theo Buehler
On Wed, Jun 22, 2022 at 04:13:43PM +0200, Claudio Jeker wrote:
> Do not leak the address family specific struct kroute into bgpctl if there
> is struct kroute_full which is address family independent.
> The result is mostly minus because the code no longer needs address family
> specific code paths.  This changes 'bgpctl show nexthop' but not its output.
> 
> OK?

This reads fine.

ok

One thing I noticed while comparing the code paths: should the KAME hack
in log_in6addr() not be synced with route/show.c similar to the recent
change in sa2addr()?

Index: util.c
===
RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
retrieving revision 1.66
diff -u -p -r1.66 util.c
--- util.c  19 Jun 2022 10:30:10 -  1.66
+++ util.c  22 Jun 2022 14:32:39 -
@@ -66,8 +66,10 @@ log_in6addr(const struct in6_addr *addr)
 
 #ifdef __KAME__
/* XXX thanks, KAME, for this ugliness... adopted from route/show.c */
-   if (IN6_IS_ADDR_LINKLOCAL(_in6.sin6_addr) ||
-   IN6_IS_ADDR_MC_LINKLOCAL(_in6.sin6_addr)) {
+   if ((IN6_IS_ADDR_LINKLOCAL(_in6.sin6_addr) ||
+   IN6_IS_ADDR_MC_LINKLOCAL(_in6.sin6_addr) ||
+   IN6_IS_ADDR_MC_INTFACELOCAL(_in6.sin6_addr)) &&
+   sa_in6.sin6_scope_id == 0) {
uint16_t tmp16;
memcpy(, _in6.sin6_addr.s6_addr[2], sizeof(tmp16));
sa_in6.sin6_scope_id = ntohs(tmp16);



Bug in iked

2022-06-22 Thread Sibar Soumi
Dear OpenBSD developers

 

I would like to report an error in iked.

 

The error occurs with the processing logic in case of simultaneous Child SA 
rekeying. That is, by simultaneous rekeying, two Child SAs are created and “the 
SA created with the lowest of the four nonces used in the two exchanges SHOULD 
be closed by the endpoint that created it” (RFC7296 section 2.8.1).

 

This decision is made in the iked implementation in ikev2.c in the if block 
from L4390 

  until L4407 

 .

 

But nr is not set to the minimum nonce for exchange initiated by peer but by 
us, and ni which comes from sa->sa_simulat is already set to the minimum nonce 
for exchange initiated by peer.

 

Therefore, the comment in line 4393 shall be corrected and the comparison in 
line 4402 shall be “ikev2_nonce_cmp(nr, ni) < 0” instead of 
“ikev2_nonce_cmp(ni, nr) < 0” because the SA that has just been created by us 
shall be deleted, if nrmailto:sibar.so...@achelos.de>  | www.achelos.de 
  | www.iot.achelos.com  
 | Follow us: LinkedIn   | XING 
   | YouTube 
 

 

Die achelos GmbH ist nach ISO 9001 und ISO 27001 zertifiziert. | achelos GmbH 
is certified according to ISO 9001 and ISO 27001.

Geschäftsführung | Executive Board: Kathrin Asmuth, Thomas Freitag

Registergericht | register court: Paderborn, HRB 8817 | USt-IdNr. | VAT ID 
number: DE260414872

 

Diese Mitteilung ist vertraulich. Wenn Sie nicht der beabsichtigte Empfänger 
sind, ist jegliche Verwendung, Beeinträchtigung, 

Offenlegung oder Vervielfältigung dieses Materials unautorisiert und verboten. 
Bitte informieren Sie uns umgehend und 

vernichten Sie die E-Mail. | This communication is confidential. If you are not 
the intended recipient, any use, interference with, 

disclosure or copying of this material is unauthorised and prohibited. Please 
inform us immediately and destroy the email.

 

 


openpgp-digital-signature.asc
Description: PGP signature


bgpd/bgpctl use struct kroute_full in nexthop messages

2022-06-22 Thread Claudio Jeker
Do not leak the address family specific struct kroute into bgpctl if there
is struct kroute_full which is address family independent.
The result is mostly minus because the code no longer needs address family
specific code paths.  This changes 'bgpctl show nexthop' but not its output.

OK?
-- 
:wq Claudio

Index: bgpctl/output.c
===
RCS file: /cvs/src/usr.sbin/bgpctl/output.c,v
retrieving revision 1.21
diff -u -p -r1.21 output.c
--- bgpctl/output.c 15 Jun 2022 10:10:50 -  1.21
+++ bgpctl/output.c 22 Jun 2022 14:04:35 -
@@ -480,8 +480,6 @@ show_fib_table(struct ktable *kt)
 static void
 show_nexthop(struct ctl_show_nexthop *nh)
 {
-   struct kroute   *k;
-   struct kroute6  *k6;
char*s;
 
printf("%s %-15s ", nh->valid ? "*" : " ", log_addr(>addr));
@@ -489,33 +487,15 @@ show_nexthop(struct ctl_show_nexthop *nh
printf("\n");
return;
}
-   switch (nh->addr.aid) {
-   case AID_INET:
-   k = >kr.kr4;
-   if (asprintf(, "%s/%u", inet_ntoa(k->prefix),
-   k->prefixlen) == -1)
-   err(1, NULL);
-   printf("%-20s", s);
-   free(s);
-   printf("%3i %-15s ", k->priority,
-   k->flags & F_CONNECTED ? "connected" :
-   inet_ntoa(k->nexthop));
-   break;
-   case AID_INET6:
-   k6 = >kr.kr6;
-   if (asprintf(, "%s/%u", log_in6addr(>prefix),
-   k6->prefixlen) == -1)
-   err(1, NULL);
-   printf("%-20s", s);
-   free(s);
-   printf("%3i %-15s ", k6->priority,
-   k6->flags & F_CONNECTED ? "connected" :
-   log_in6addr(>nexthop));
-   break;
-   default:
-   printf("unknown address family\n");
-   return;
-   }
+   if (asprintf(, "%s/%u", log_addr(>kr.prefix),
+   nh->kr.prefixlen) == -1)
+   err(1, NULL);
+   printf("%-20s", s);
+   free(s);
+   printf("%3i %-15s ", nh->kr.priority,
+   nh->kr.flags & F_CONNECTED ? "connected" :
+   log_addr(>kr.nexthop));
+
if (nh->iface.ifname[0]) {
printf("%s (%s, %s)", nh->iface.ifname,
nh->iface.is_up ? "UP" : "DOWN",
Index: bgpctl/output_json.c
===
RCS file: /cvs/src/usr.sbin/bgpctl/output_json.c,v
retrieving revision 1.15
diff -u -p -r1.15 output_json.c
--- bgpctl/output_json.c15 Jun 2022 10:10:50 -  1.15
+++ bgpctl/output_json.c22 Jun 2022 14:06:05 -
@@ -414,9 +414,6 @@ json_do_interface(struct ctl_show_interf
 static void
 json_nexthop(struct ctl_show_nexthop *nh)
 {
-   struct kroute *k;
-   struct kroute6 *k6;
-
json_do_array("nexthops");
 
json_do_object("nexthop");
@@ -427,27 +424,11 @@ json_nexthop(struct ctl_show_nexthop *nh
if (!nh->krvalid)
goto done;
 
-   switch (nh->addr.aid) {
-   case AID_INET:
-   k = >kr.kr4;
-   json_do_printf("prefix", "%s/%u", inet_ntoa(k->prefix),
-   k->prefixlen);
-   json_do_uint("priority", k->priority);
-   json_do_bool("connected", k->flags & F_CONNECTED);
-   json_do_printf("nexthop", "%s", inet_ntoa(k->nexthop));
-   break;
-   case AID_INET6:
-   k6 = >kr.kr6;
-   json_do_printf("prefix", "%s/%u", log_in6addr(>prefix),
-   k6->prefixlen);
-   json_do_uint("priority", k6->priority);
-   json_do_bool("connected", k6->flags & F_CONNECTED);
-   json_do_printf("nexthop", "%s", log_in6addr(>nexthop));
-   break;
-   default:
-   warnx("nexthop: unknown address family");
-   goto done;
-   }
+   json_do_printf("prefix", "%s/%u", log_addr(>kr.prefix),
+   nh->kr.prefixlen);
+   json_do_uint("priority", nh->kr.priority);
+   json_do_bool("connected", nh->kr.flags & F_CONNECTED);
+   json_do_printf("nexthop", "%s", log_addr(>kr.nexthop));
if (nh->iface.ifname[0])
json_do_interface(>iface);
 done:
Index: bgpd/bgpd.h
===
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.432
diff -u -p -r1.432 bgpd.h
--- bgpd/bgpd.h 19 Jun 2022 10:30:09 -  1.432
+++ bgpd/bgpd.h 22 Jun 2022 14:01:53 -
@@ -769,10 +769,7 @@ struct ctl_show_interface {
 struct ctl_show_nexthop {
struct bgpd_addraddr;
struct ctl_show_interface   iface;
-   union {
-   struct kroute   kr4;
-   struct kroute6  kr6;
-   } kr;
+   struct 

Re: pipex(4): protect global lists with mutex(9)

2022-06-22 Thread Vitaliy Makkoveev
Please drop previous diff. counters_read(9) could sleep, so we can't
call it with mutex(9) held.

The diff below still uses `pipex_list_mtx' mutex(9) for pipex(4) lists
protection, but for safe `session' dereference it user reference
counters.

Index: sys/net/if_ethersubr.c
===
RCS file: /cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.279
diff -u -p -r1.279 if_ethersubr.c
--- sys/net/if_ethersubr.c  22 Apr 2022 12:10:57 -  1.279
+++ sys/net/if_ethersubr.c  22 Jun 2022 11:41:05 -
@@ -547,9 +547,11 @@ ether_input(struct ifnet *ifp, struct mb
 
if ((session = pipex_pppoe_lookup_session(m)) != NULL) {
pipex_pppoe_input(m, session);
+   pipex_rele_session(session);
KERNEL_UNLOCK();
return;
}
+   pipex_rele_session(session);
}
 #endif
if (etype == ETHERTYPE_PPPOEDISC)
Index: sys/net/if_gre.c
===
RCS file: /cvs/src/sys/net/if_gre.c,v
retrieving revision 1.171
diff -u -p -r1.171 if_gre.c
--- sys/net/if_gre.c10 Mar 2021 10:21:47 -  1.171
+++ sys/net/if_gre.c22 Jun 2022 11:41:05 -
@@ -974,9 +974,15 @@ gre_input_1(struct gre_tunnel *key, stru
struct pipex_session *session;
 
session = pipex_pptp_lookup_session(m);
-   if (session != NULL &&
-   pipex_pptp_input(m, session) == NULL)
-   return (NULL);
+   if (session != NULL) {
+   struct mbuf *m0;
+
+   m0 = pipex_pptp_input(m, session);
+   pipex_rele_session(session);
+
+   if (m0 == NULL)
+   return (NULL);
+   }
}
 #endif
break;
Index: sys/net/if_pppx.c
===
RCS file: /cvs/src/sys/net/if_pppx.c,v
retrieving revision 1.114
diff -u -p -r1.114 if_pppx.c
--- sys/net/if_pppx.c   22 Feb 2022 01:15:02 -  1.114
+++ sys/net/if_pppx.c   22 Jun 2022 11:41:05 -
@@ -1322,9 +1322,7 @@ pppacclose(dev_t dev, int flags, int mod
splx(s);
 
pool_put(_session_pool, sc->sc_multicast_session);
-   NET_LOCK();
pipex_destroy_all_sessions(sc);
-   NET_UNLOCK();
 
LIST_REMOVE(sc, sc_entry);
free(sc, M_DEVBUF, sizeof(*sc));
@@ -1384,13 +1382,19 @@ pppac_del_session(struct pppac_softc *sc
 {
struct pipex_session *session;
 
-   session = pipex_lookup_by_session_id(req->pcr_protocol,
+   mtx_enter(_list_mtx);
+
+   session = pipex_lookup_by_session_id_locked(req->pcr_protocol,
req->pcr_session_id);
-   if (session == NULL || session->ownersc != sc)
+   if (session == NULL || session->ownersc != sc) {
+   mtx_leave(_list_mtx);
return (EINVAL);
-   pipex_unlink_session(session);
+   }
+   pipex_unlink_session_locked(session);
pipex_rele_session(session);
 
+   mtx_leave(_list_mtx);
+
return (0);
 }
 
@@ -1461,6 +1465,7 @@ pppac_qstart(struct ifqueue *ifq)
session = pipex_lookup_by_ip_address(ip.ip_dst);
if (session != NULL) {
pipex_ip_output(m, session);
+   pipex_rele_session(session);
m = NULL;
}
}
Index: sys/net/pipex.c
===
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.136
diff -u -p -r1.136 pipex.c
--- sys/net/pipex.c 2 Jan 2022 22:36:04 -   1.136
+++ sys/net/pipex.c 22 Jun 2022 11:41:05 -
@@ -40,6 +40,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -79,6 +80,8 @@
 #include 
 #include "pipex_local.h"
 
+struct mutex pipex_list_mtx = MUTEX_INITIALIZER(IPL_SOFTNET);
+
 struct pool pipex_session_pool;
 struct pool mppe_key_pool;
 
@@ -88,17 +91,18 @@ struct pool mppe_key_pool;
  *   A   atomic operation
  *   I   immutable after creation
  *   N   net lock
+ *   L   pipex_list_mtx
  */
 
 intpipex_enable = 0;   /* [N] */
 struct pipex_hash_head
-pipex_session_list,/* [N] master session 
list */
-pipex_close_wait_list, /* [N] expired session list */
-pipex_peer_addr_hashtable[PIPEX_HASH_SIZE],/* [N] peer's address 
hash */
-pipex_id_hashtable[PIPEX_HASH_SIZE];  

Re: netstart(8): don't lie

2022-06-22 Thread Klemens Nanni
On Tue, Jun 21, 2022 at 07:07:25AM +0100, Stuart Henderson wrote:
> any comments? does it need a "does not clear things" caveat? ok?

OK kn as-is