Index: sys/kern/uipc_ktls.c =================================================================== --- sys/kern/uipc_ktls.c +++ sys/kern/uipc_ktls.c @@ -1199,45 +1199,43 @@ } int -ktls_get_rx_mode(struct socket *so) +ktls_get_rx_mode(struct socket *so, int *modep) { struct ktls_session *tls; struct inpcb *inp; - int mode; if (SOLISTENING(so)) return (EINVAL); inp = so->so_pcb; INP_WLOCK_ASSERT(inp); - SOCKBUF_LOCK(&so->so_rcv); + SOCK_RECVBUF_LOCK(so); tls = so->so_rcv.sb_tls_info; if (tls == NULL) - mode = TCP_TLS_MODE_NONE; + *modep = TCP_TLS_MODE_NONE; else - mode = tls->mode; - SOCKBUF_UNLOCK(&so->so_rcv); - return (mode); + *modep = tls->mode; + SOCK_RECVBUF_UNLOCK(so); + return (0); } int -ktls_get_tx_mode(struct socket *so) +ktls_get_tx_mode(struct socket *so, int *modep) { struct ktls_session *tls; struct inpcb *inp; - int mode; if (SOLISTENING(so)) return (EINVAL); inp = so->so_pcb; INP_WLOCK_ASSERT(inp); - SOCKBUF_LOCK(&so->so_snd); + SOCK_SENDBUF_LOCK(so); tls = so->so_snd.sb_tls_info; if (tls == NULL) - mode = TCP_TLS_MODE_NONE; + *modep = TCP_TLS_MODE_NONE; else - mode = tls->mode; - SOCKBUF_UNLOCK(&so->so_snd); - return (mode); + *modep = tls->mode; + SOCK_SENDBUF_UNLOCK(so); + return (0); } /* Index: sys/netinet/tcp_usrreq.c =================================================================== --- sys/netinet/tcp_usrreq.c +++ sys/netinet/tcp_usrreq.c @@ -2563,14 +2563,18 @@ #endif #ifdef KERN_TLS case TCP_TXTLS_MODE: - optval = ktls_get_tx_mode(so); + error = ktls_get_tx_mode(so, &optval); INP_WUNLOCK(inp); - error = sooptcopyout(sopt, &optval, sizeof(optval)); + if (error == 0) + error = sooptcopyout(sopt, &optval, + sizeof(optval)); break; case TCP_RXTLS_MODE: - optval = ktls_get_rx_mode(so); + error = ktls_get_rx_mode(so, &optval); INP_WUNLOCK(inp); - error = sooptcopyout(sopt, &optval, sizeof(optval)); + if (error == 0) + error = sooptcopyout(sopt, &optval, + sizeof(optval)); break; #endif case TCP_LRD: Index: sys/sys/ktls.h =================================================================== --- sys/sys/ktls.h +++ sys/sys/ktls.h @@ -212,9 +212,9 @@ void ktls_seq(struct sockbuf *sb, struct mbuf *m); void ktls_enqueue(struct mbuf *m, struct socket *so, int page_count); void ktls_enqueue_to_free(struct mbuf *m); -int ktls_get_rx_mode(struct socket *so); +int ktls_get_rx_mode(struct socket *so, int *modep); int ktls_set_tx_mode(struct socket *so, int mode); -int ktls_get_tx_mode(struct socket *so); +int ktls_get_tx_mode(struct socket *so, int *modep); int ktls_output_eagain(struct inpcb *inp, struct ktls_session *tls); #ifdef RATELIMIT int ktls_modify_txrtlmt(struct ktls_session *tls, uint64_t max_pacing_rate);