The branch main has been updated by tuexen:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=bed7633b108930e9e9d2478c75556035938d4e88

commit bed7633b108930e9e9d2478c75556035938d4e88
Author:     Michael Tuexen <[email protected]>
AuthorDate: 2023-12-09 11:57:19 +0000
Commit:     Michael Tuexen <[email protected]>
CommitDate: 2023-12-09 12:03:51 +0000

    tcp: tcp: allow SOL_SOCKET-level socket options via sysctl interface
    
    When using the sysctl interface for setting a SOL_SOCKET-level socket
    option, the TCP handler refers to the IP handler, which only handles
    SO_SETFIB and SO_MAX_PACING_RATE.
    So call sosetopt(), which handles all SOL_SOCKET-level options.
    Then you can use tcpsso with SOL_SOCKET-level socket options as
    expected.
    
    Reported by:            rscheff
    Reviewed by:            glebius, rscheff
    MFC after:              1 week
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D42985
---
 sys/netinet/in_pcb.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 797c0dc445dd..0d763184f68c 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -2984,7 +2984,11 @@ sysctl_setsockopt(SYSCTL_HANDLER_ARGS, struct inpcbinfo 
*pcbinfo,
                        so = inp->inp_socket;
                        KASSERT(so != NULL, ("inp_socket == NULL"));
                        soref(so);
-                       error = (*ctloutput_set)(inp, &sopt);
+                       if (params->sop_level == SOL_SOCKET) {
+                               INP_WUNLOCK(inp);
+                               error = sosetopt(so, &sopt);
+                       } else
+                               error = (*ctloutput_set)(inp, &sopt);
                        sorele(so);
                        break;
                }

Reply via email to