The only difference is the socket buffer. As bonus, in the future solock() will be easily replaced by sblock() instead pushing it down to each SO_SND* and SO_RCV* case.
Index: sys/kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.307 diff -u -p -r1.307 uipc_socket.c --- sys/kern/uipc_socket.c 3 Aug 2023 09:49:08 -0000 1.307 +++ sys/kern/uipc_socket.c 3 Aug 2023 21:20:58 -0000 @@ -1856,6 +1856,9 @@ sosetopt(struct socket *so, int level, i case SO_SNDLOWAT: case SO_RCVLOWAT: { + struct sockbuf *sb = (optname == SO_SNDBUF || + optname == SO_SNDLOWAT ? + &so->so_snd : &so->so_rcv); u_long cnt; if (m == NULL || m->m_len < sizeof (int)) @@ -1867,40 +1870,23 @@ sosetopt(struct socket *so, int level, i solock(so); switch (optname) { case SO_SNDBUF: - if (so->so_snd.sb_state & SS_CANTSENDMORE) { - error = EINVAL; - break; - } - if (sbcheckreserve(cnt, so->so_snd.sb_wat) || - sbreserve(so, &so->so_snd, cnt)) { - error = ENOBUFS; - break; - } - so->so_snd.sb_wat = cnt; - break; - case SO_RCVBUF: - if (so->so_rcv.sb_state & SS_CANTRCVMORE) { + if (sb->sb_state & + (SS_CANTSENDMORE | SS_CANTRCVMORE)) { error = EINVAL; break; } - if (sbcheckreserve(cnt, so->so_rcv.sb_wat) || - sbreserve(so, &so->so_rcv, cnt)) { + if (sbcheckreserve(cnt, sb->sb_wat) || + sbreserve(so, sb, cnt)) { error = ENOBUFS; break; } - so->so_rcv.sb_wat = cnt; + sb->sb_wat = cnt; break; - case SO_SNDLOWAT: - so->so_snd.sb_lowat = - (cnt > so->so_snd.sb_hiwat) ? - so->so_snd.sb_hiwat : cnt; - break; case SO_RCVLOWAT: - so->so_rcv.sb_lowat = - (cnt > so->so_rcv.sb_hiwat) ? - so->so_rcv.sb_hiwat : cnt; + sb->sb_lowat = (cnt > sb->sb_hiwat) ? + sb->sb_hiwat : cnt; break; } sounlock(so); @@ -1910,6 +1896,8 @@ sosetopt(struct socket *so, int level, i case SO_SNDTIMEO: case SO_RCVTIMEO: { + struct sockbuf *sb = (optname == SO_SNDTIMEO ? + &so->so_snd : &so->so_rcv); struct timeval tv; uint64_t nsecs; @@ -1925,14 +1913,7 @@ sosetopt(struct socket *so, int level, i nsecs = INFSLP; solock(so); - switch (optname) { - case SO_SNDTIMEO: - so->so_snd.sb_timeo_nsecs = nsecs; - break; - case SO_RCVTIMEO: - so->so_rcv.sb_timeo_nsecs = nsecs; - break; - } + sb->sb_timeo_nsecs = nsecs; sounlock(so); break; }