git: 9e2cce7e6a87 - main - Implement a function to get the next TCP- and TLS- receive sequence number.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 26 Jan 2022 12:42:10 UTC
The branch main has been updated by hselasky: URL: https://cgit.FreeBSD.org/src/commit/?id=9e2cce7e6a87dd68af0f671f964cc7b3464ea76a commit 9e2cce7e6a87dd68af0f671f964cc7b3464ea76a Author: Hans Petter Selasky <hselasky@FreeBSD.org> AuthorDate: 2022-01-26 11:53:13 +0000 Commit: Hans Petter Selasky <hselasky@FreeBSD.org> CommitDate: 2022-01-26 11:55:00 +0000 Implement a function to get the next TCP- and TLS- receive sequence number. This function will be used by coming TLS hardware receive offload support. Differential Revision: https://reviews.freebsd.org/D32356 Discussed with: jhb@ MFC after: 1 week Sponsored by: NVIDIA Networking --- sys/kern/uipc_ktls.c | 43 +++++++++++++++++++++++++++++++++++++++++++ sys/sys/ktls.h | 1 + 2 files changed, 44 insertions(+) diff --git a/sys/kern/uipc_ktls.c b/sys/kern/uipc_ktls.c index 5912db865ef6..620536f28b34 100644 --- a/sys/kern/uipc_ktls.c +++ b/sys/kern/uipc_ktls.c @@ -1319,6 +1319,49 @@ ktls_get_rx_mode(struct socket *so, int *modep) return (0); } +/* + * ktls_get_rx_sequence - get the next TCP- and TLS- sequence number. + * + * This function gets information about the next TCP- and TLS- + * sequence number to be processed by the TLS receive worker + * thread. The information is extracted from the given "inpcb" + * structure. The values are stored in host endian format at the two + * given output pointer locations. The TCP sequence number points to + * the beginning of the TLS header. + * + * This function returns zero on success, else a non-zero error code + * is returned. + */ +int +ktls_get_rx_sequence(struct inpcb *inp, uint32_t *tcpseq, uint64_t *tlsseq) +{ + struct socket *so; + struct tcpcb *tp; + + INP_RLOCK(inp); + so = inp->inp_socket; + if (__predict_false(so == NULL)) { + INP_RUNLOCK(inp); + return (EINVAL); + } + if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) { + INP_RUNLOCK(inp); + return (ECONNRESET); + } + + tp = intotcpcb(inp); + MPASS(tp != NULL); + + SOCKBUF_LOCK(&so->so_rcv); + *tcpseq = tp->rcv_nxt - so->so_rcv.sb_tlscc; + *tlsseq = so->so_rcv.sb_tls_seqno; + SOCKBUF_UNLOCK(&so->so_rcv); + + INP_RUNLOCK(inp); + + return (0); +} + int ktls_get_tx_mode(struct socket *so, int *modep) { diff --git a/sys/sys/ktls.h b/sys/sys/ktls.h index a3eac69b5eeb..5cfca2d860a0 100644 --- a/sys/sys/ktls.h +++ b/sys/sys/ktls.h @@ -219,6 +219,7 @@ void ktls_enqueue_to_free(struct mbuf *m); 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 *modep); +int ktls_get_rx_sequence(struct inpcb *inp, uint32_t *tcpseq, uint64_t *tlsseq); 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);