HomeFreeBSD

sockets: make pr_shutdown fully protocol specific method

Description

sockets: make pr_shutdown fully protocol specific method

Disassemble a one-for-all soshutdown() into protocol specific methods.
This creates a small amount of copy & paste, but makes code a lot more
self documented, as protocol specific method would execute only the code
that is relevant to that protocol and nothing else. This also fixes a
couple recent regressions and reduces risk of future regressions. The
extended KPI for the new pr_shutdown removes need for the extra pr_flush
which was added for the sake of SCTP which could not perform its shutdown
properly with the old one. Particularly for SCTP this change streamlines
a lot of code.

Some notes on why certain parts of code were copied or were not to certain
protocols:

  • The (SS_ISCONNECTED | SS_ISCONNECTING | SS_ISDISCONNECTING) check is needed only for those protocols that may be connected or disconnected.
  • The above reduces into only SS_ISCONNECTED for those protocols that always connect instantly.
  • The ENOTCONN and continue processing hack is left only for datagram protocols.
  • The SOLISTENING(so) block is copied to those protocols that listen(2).
  • sorflush() on SHUT_RD is copied almost to every protocol, but that will be refactored later.
  • wakeup(&so->so_timeo) is copied to protocols that can make a non-instant connect(2), can SO_LINGER or can accept(2).

There are three protocols (netgraph(4), Bluetooth, SDP) that did not have
pr_shutdown, but old soshutdown() would still perform sorflush() on
SHUT_RD for them and also wakeup(9). Those protocols partially supported
shutdown(2) returning EOPNOTSUP for SHUT_WR/SHUT_RDWR, now they fully lost
shutdown(2) support. I'm pretty sure netgraph(4) and Bluetooth are okay
about that and SDP is almost abandoned anyway.

Reviewed by: tuexen
Differential Revision: https://reviews.freebsd.org/D43413

Details

Provenance
glebiusAuthored on Jan 16 2024, 6:26 PM
Reviewer
tuexen
Differential Revision
D43413: sockets: make pr_shutdown fully protocol specific method
Parents
rGc3276e02beab: sockets: make shutdown(2) how argument a enum
Branches
Unknown
Tags
Unknown