-/* $OpenBSD: kern_sysctl.c,v 1.400 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.401 2022/03/14 22:38:43 tb Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
struct inpcb *inp;
NET_LOCK();
- mtx_enter(&tcbtable.inpt_mtx);
TAILQ_FOREACH(inp, &tcbtable.inpt_queue, inp_queue)
FILLSO(inp->inp_socket);
- mtx_leave(&tcbtable.inpt_mtx);
- mtx_enter(&udbtable.inpt_mtx);
TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue)
FILLSO(inp->inp_socket);
- mtx_leave(&udbtable.inpt_mtx);
- mtx_enter(&rawcbtable.inpt_mtx);
TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue)
FILLSO(inp->inp_socket);
- mtx_leave(&rawcbtable.inpt_mtx);
#ifdef INET6
- mtx_enter(&rawin6pcbtable.inpt_mtx);
TAILQ_FOREACH(inp, &rawin6pcbtable.inpt_queue,
inp_queue)
FILLSO(inp->inp_socket);
- mtx_leave(&rawin6pcbtable.inpt_mtx);
#endif
NET_UNLOCK();
}
-/* $OpenBSD: in_pcb.c,v 1.260 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: in_pcb.c,v 1.261 2022/03/14 22:38:43 tb Exp $ */
/* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */
/*
struct baddynamicports rootonlyports;
struct pool inpcb_pool;
-void in_pcbrehash_locked(struct inpcb *);
-int in_pcbresize(struct inpcbtable *, int);
+int in_pcbresize (struct inpcbtable *, int);
#define INPCBHASH_LOADFACTOR(_x) (((_x) * 3) / 4)
void
in_pcbinit(struct inpcbtable *table, int hashsize)
{
- mtx_init(&table->inpt_mtx, IPL_SOFTNET);
+
TAILQ_INIT(&table->inpt_queue);
table->inpt_hashtbl = hashinit(hashsize, M_PCB, M_WAITOK,
&table->inpt_mask);
inp->inp_cksum6 = -1;
#endif /* INET6 */
- mtx_enter(&table->inpt_mtx);
if (table->inpt_count++ > INPCBHASH_LOADFACTOR(table->inpt_size))
(void)in_pcbresize(table, table->inpt_size * 2);
TAILQ_INSERT_HEAD(&table->inpt_queue, inp, inp_queue);
&inp->inp_faddr, inp->inp_fport,
&inp->inp_laddr, inp->inp_lport);
LIST_INSERT_HEAD(head, inp, inp_hash);
- mtx_leave(&table->inpt_mtx);
-
so->so_pcb = inp;
return (0);
in_pcbdetach(struct inpcb *inp)
{
struct socket *so = inp->inp_socket;
- struct inpcbtable *table = inp->inp_table;
NET_ASSERT_LOCKED();
pf_inp_unlink(inp);
}
#endif
- mtx_enter(&table->inpt_mtx);
LIST_REMOVE(inp, inp_lhash);
LIST_REMOVE(inp, inp_hash);
- TAILQ_REMOVE(&table->inpt_queue, inp, inp_queue);
- table->inpt_count--;
- mtx_leave(&table->inpt_mtx);
-
+ TAILQ_REMOVE(&inp->inp_table->inpt_queue, inp, inp_queue);
+ inp->inp_table->inpt_count--;
in_pcbunref(inp);
}
in_pcbnotifyall(struct inpcbtable *table, struct sockaddr *dst, u_int rtable,
int errno, void (*notify)(struct inpcb *, int))
{
- SIMPLEQ_HEAD(, inpcb) inpcblist;
- struct inpcb *inp;
+ struct inpcb *inp, *ninp;
struct in_addr faddr;
u_int rdomain;
- NET_ASSERT_WLOCKED();
+ NET_ASSERT_LOCKED();
if (dst->sa_family != AF_INET)
return;
faddr = satosin(dst)->sin_addr;
if (faddr.s_addr == INADDR_ANY)
return;
- if (notify == NULL)
- return;
- SIMPLEQ_INIT(&inpcblist);
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
- TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
+ TAILQ_FOREACH_SAFE(inp, &table->inpt_queue, inp_queue, ninp) {
#ifdef INET6
if (inp->inp_flags & INP_IPV6)
continue;
inp->inp_socket == NULL) {
continue;
}
- in_pcbref(inp);
- SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify);
- }
- mtx_leave(&table->inpt_mtx);
-
- while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) {
- SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify);
- (*notify)(inp, errno);
- in_pcbunref(inp);
+ if (notify)
+ (*notify)(inp, errno);
}
}
u_int rdomain;
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
head = in_pcblhash(table, rdomain, lport);
LIST_FOREACH(inp, head, inp_lhash) {
if (rtable_l2(inp->inp_rtableid) != rdomain)
break;
}
}
- mtx_leave(&table->inpt_mtx);
-
return (match);
}
void
in_pcbrehash(struct inpcb *inp)
-{
- struct inpcbtable *table = inp->inp_table;
-
- mtx_enter(&table->inpt_mtx);
- in_pcbrehash_locked(inp);
- mtx_leave(&table->inpt_mtx);
-}
-
-void
-in_pcbrehash_locked(struct inpcb *inp)
{
struct inpcbtable *table = inp->inp_table;
struct inpcbhead *head;
NET_ASSERT_LOCKED();
- MUTEX_ASSERT_LOCKED(&table->inpt_mtx);
LIST_REMOVE(inp, inp_lhash);
head = in_pcblhash(table, inp->inp_rtableid, inp->inp_lport);
void *nhashtbl, *nlhashtbl, *ohashtbl, *olhashtbl;
struct inpcb *inp;
- MUTEX_ASSERT_LOCKED(&table->inpt_mtx);
-
ohashtbl = table->inpt_hashtbl;
olhashtbl = table->inpt_lhashtbl;
osize = table->inpt_size;
arc4random_buf(&table->inpt_lkey, sizeof(table->inpt_lkey));
TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
- in_pcbrehash_locked(inp);
+ in_pcbrehash(inp);
}
hashfree(ohashtbl, osize, M_PCB);
hashfree(olhashtbl, osize, M_PCB);
u_int rdomain;
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
head = in_pcbhash(table, rdomain, &faddr, fport, &laddr, lport);
LIST_FOREACH(inp, head, inp_hash) {
#ifdef INET6
break;
}
}
- mtx_leave(&table->inpt_mtx);
#ifdef DIAGNOSTIC
if (inp == NULL && in_pcbnotifymiss) {
printf("%s: faddr=%08x fport=%d laddr=%08x lport=%d rdom=%u\n",
#endif
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
head = in_pcbhash(table, rdomain, &zeroin_addr, 0, key1, lport);
LIST_FOREACH(inp, head, inp_hash) {
#ifdef INET6
LIST_REMOVE(inp, inp_hash);
LIST_INSERT_HEAD(head, inp, inp_hash);
}
- mtx_leave(&table->inpt_mtx);
#ifdef DIAGNOSTIC
if (inp == NULL && in_pcbnotifymiss) {
printf("%s: laddr=%08x lport=%d rdom=%u\n",
-/* $OpenBSD: in_pcb.h,v 1.124 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: in_pcb.h,v 1.125 2022/03/14 22:38:43 tb Exp $ */
/* $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $ */
/*
#include <crypto/siphash.h>
-/*
- * Locks used to protect struct members in this file:
- * I immutable after creation
- * N net lock
- * t inpt_mtx pcb table mutex
- */
-
struct pf_state_key;
union inpaddru {
* control block.
*/
struct inpcb {
- LIST_ENTRY(inpcb) inp_hash; /* [t] local and foreign hash */
- LIST_ENTRY(inpcb) inp_lhash; /* [t] local port hash */
- TAILQ_ENTRY(inpcb) inp_queue; /* [t] inet PCB queue */
- SIMPLEQ_ENTRY(inpcb) inp_notify; /* [N] queue to notify PCB */
- struct inpcbtable *inp_table; /* [I] inet queue/hash table */
+ LIST_ENTRY(inpcb) inp_hash; /* local and foreign hash */
+ LIST_ENTRY(inpcb) inp_lhash; /* local port hash */
+ TAILQ_ENTRY(inpcb) inp_queue; /* inet PCB queue */
+ struct inpcbtable *inp_table; /* inet queue/hash table */
union inpaddru inp_faddru; /* Foreign address. */
union inpaddru inp_laddru; /* Local address. */
#define inp_faddr inp_faddru.iau_a4u.inaddr
LIST_HEAD(inpcbhead, inpcb);
struct inpcbtable {
- struct mutex inpt_mtx; /* protect queue and hash */
- TAILQ_HEAD(inpthead, inpcb) inpt_queue; /* [t] inet PCB queue */
- struct inpcbhead *inpt_hashtbl; /* [t] local and foreign hash */
- struct inpcbhead *inpt_lhashtbl; /* [t] local port hash */
- SIPHASH_KEY inpt_key, inpt_lkey; /* [t] secrets for hashes */
- u_long inpt_mask, inpt_lmask; /* [t] hash masks */
- int inpt_count, inpt_size; /* [t] queue count, hash size */
+ TAILQ_HEAD(inpthead, inpcb) inpt_queue; /* inet PCB queue */
+ struct inpcbhead *inpt_hashtbl; /* local and foreign hash */
+ struct inpcbhead *inpt_lhashtbl; /* local port hash */
+ SIPHASH_KEY inpt_key, inpt_lkey; /* secrets for hashes */
+ u_long inpt_mask, inpt_lmask; /* hash masks */
+ int inpt_count, inpt_size; /* queue count, hash size */
};
/* flags in inp_flags: */
-/* $OpenBSD: raw_ip.c,v 1.122 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: raw_ip.c,v 1.123 2022/03/14 22:38:43 tb Exp $ */
/* $NetBSD: raw_ip.c,v 1.25 1996/02/18 18:58:33 christos Exp $ */
/*
}
#endif
NET_ASSERT_LOCKED();
- mtx_enter(&rawcbtable.inpt_mtx);
TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) {
if (inp->inp_socket->so_state & SS_CANTRCVMORE)
continue;
}
last = inp;
}
- mtx_leave(&rawcbtable.inpt_mtx);
-
if (last) {
if (last->inp_flags & INP_CONTROLOPTS ||
last->inp_socket->so_options & SO_TIMESTAMP)
-/* $OpenBSD: udp_usrreq.c,v 1.273 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: udp_usrreq.c,v 1.274 2022/03/14 22:38:43 tb Exp $ */
/* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */
/*
*/
last = NULL;
NET_ASSERT_LOCKED();
- mtx_enter(&udbtable.inpt_mtx);
TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) {
if (inp->inp_socket->so_state & SS_CANTRCVMORE)
continue;
SO_REUSEADDR)) == 0)
break;
}
- mtx_leave(&udbtable.inpt_mtx);
if (last == NULL) {
/*
-/* $OpenBSD: in6_pcb.c,v 1.114 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: in6_pcb.c,v 1.115 2022/03/14 22:38:43 tb Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
uint fport_arg, const struct sockaddr_in6 *src, uint lport_arg,
u_int rtable, int cmd, void *cmdarg, void (*notify)(struct inpcb *, int))
{
- SIMPLEQ_HEAD(, inpcb) inpcblist;
- struct inpcb *inp;
+ struct inpcb *inp, *ninp;
u_short fport = fport_arg, lport = lport_arg;
struct sockaddr_in6 sa6_src;
int errno;
u_int32_t flowinfo;
u_int rdomain;
- NET_ASSERT_WLOCKED();
+ NET_ASSERT_LOCKED();
if ((unsigned)cmd >= PRC_NCMDS)
return;
notify = in_rtchange;
}
errno = inet6ctlerrmap[cmd];
- if (notify == NULL)
- return;
- SIMPLEQ_INIT(&inpcblist);
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
- TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) {
+ TAILQ_FOREACH_SAFE(inp, &table->inpt_queue, inp_queue, ninp) {
if ((inp->inp_flags & INP_IPV6) == 0)
continue;
continue;
}
do_notify:
- in_pcbref(inp);
- SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify);
- }
- mtx_leave(&table->inpt_mtx);
-
- while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) {
- SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify);
- (*notify)(inp, errno);
- in_pcbunref(inp);
+ if (notify)
+ (*notify)(inp, errno);
}
}
u_int rdomain;
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
head = in6_pcbhash(table, rdomain, faddr, fport, laddr, lport);
LIST_FOREACH(inp, head, inp_hash) {
if (!(inp->inp_flags & INP_IPV6))
break;
}
}
- mtx_leave(&table->inpt_mtx);
#ifdef DIAGNOSTIC
if (inp == NULL && in_pcbnotifymiss) {
printf("%s: faddr= fport=%d laddr= lport=%d rdom=%u\n",
#endif
rdomain = rtable_l2(rtable);
- mtx_enter(&table->inpt_mtx);
head = in6_pcbhash(table, rdomain, &zeroin6_addr, 0, key1, lport);
LIST_FOREACH(inp, head, inp_hash) {
if (!(inp->inp_flags & INP_IPV6))
LIST_REMOVE(inp, inp_hash);
LIST_INSERT_HEAD(head, inp, inp_hash);
}
- mtx_leave(&table->inpt_mtx);
#ifdef DIAGNOSTIC
if (inp == NULL && in_pcbnotifymiss) {
printf("%s: laddr= lport=%d rdom=%u\n",
-/* $OpenBSD: raw_ip6.c,v 1.143 2022/03/14 17:23:00 bluhm Exp $ */
+/* $OpenBSD: raw_ip6.c,v 1.144 2022/03/14 22:38:43 tb Exp $ */
/* $KAME: raw_ip6.c,v 1.69 2001/03/04 15:55:44 itojun Exp $ */
/*
}
#endif
NET_ASSERT_LOCKED();
- mtx_enter(&rawin6pcbtable.inpt_mtx);
TAILQ_FOREACH(in6p, &rawin6pcbtable.inpt_queue, inp_queue) {
if (in6p->inp_socket->so_state & SS_CANTRCVMORE)
continue;
IP6_EXTHDR_GET(icmp6, struct icmp6_hdr *, m, *offp,
sizeof(*icmp6));
- if (icmp6 == NULL) {
- mtx_leave(&rawin6pcbtable.inpt_mtx);
+ if (icmp6 == NULL)
return IPPROTO_DONE;
- }
if (ICMP6_FILTER_WILLBLOCK(icmp6->icmp6_type,
in6p->inp_icmp6filt))
continue;
}
last = in6p;
}
- mtx_leave(&rawin6pcbtable.inpt_mtx);
-
if (last) {
if (last->inp_flags & IN6P_CONTROLOPTS)
ip6_savecontrol(last, m, &opts);