Inpcb table mutex protects addr and port during bind(2) and connect(2).
authorbluhm <bluhm@openbsd.org>
Thu, 7 Dec 2023 16:08:30 +0000 (16:08 +0000)
committerbluhm <bluhm@openbsd.org>
Thu, 7 Dec 2023 16:08:30 +0000 (16:08 +0000)
commit6426d56d30272ef64d032e196f014b7342f52d9c
treeb9e3ab4efd8daa5ed8fc6f395598f1a63add4d8b
parent9e8ee861e6531ddeed02545b9b7db45845b8ce76
Inpcb table mutex protects addr and port during bind(2) and connect(2).

in_pcbbind(), in_pcbconnect(), and in6_pcbconnect() have to set
addresses and ports within the same critical section as the inpcb
hash table calculation.  Also lookup and address selection have to
be protected to avoid bindings and connections that are not unique.

For that in_pcbpickport() and in_pcbbind_locked() expect that the
table mutex is already taken.  The functions in_pcblookup_lock(),
in_pcblookup_local_lock(), and in_pcbaddrisavail_lock() grab the
mutex iff the lock parameter is IN_PCBLOCK_GRAB.  Otherwise the
parameter is IN_PCBLOCK_HOLD has the lock has to be taken already.
Note that in_pcblookup_lock() and in_pcblookup_local() return an
inp with increased reference iff they take and release the lock.
Otherwise the caller protects the life time of the inp.

This gives enough flexibility that in_pcbbind() and in_pcbconnect()
can hold the table mutex when they need it.  The public inpcb API
does not change.

OK sashan@ mvs@
sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet6/in6_pcb.c