The branch main has been updated by kib:

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

commit c9e9a0fe5b0f88561f55fb2f6f5354fbbd96dd5d
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-05-20 08:06:23 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-06-09 23:47:12 +0000

    ktls: define struct xktls_session and converter from ktls_session into 
external representation
    
    Reviewed by:    jhb (previous version), markj
    Sponsored by:   NVidia networking
    Differential revision:  https://reviews.freebsd.org/D50653
---
 sys/kern/uipc_ktls.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 sys/netinet/in_pcb.h | 24 ++++++++++++++++++++++++
 sys/sys/ktls.h       | 27 ++++++++++++++++++++++++++
 3 files changed, 104 insertions(+)

diff --git a/sys/kern/uipc_ktls.c b/sys/kern/uipc_ktls.c
index b479ca9c3ed7..1cbaa7db2e84 100644
--- a/sys/kern/uipc_ktls.c
+++ b/sys/kern/uipc_ktls.c
@@ -3447,3 +3447,56 @@ ktls_disable_ifnet(void *arg)
        TASK_INIT(&tls->disable_ifnet_task, 0, ktls_disable_ifnet_help, tls);
        (void)taskqueue_enqueue(taskqueue_thread, &tls->disable_ifnet_task);
 }
+
+void
+ktls_session_to_xktls_onedir(const struct ktls_session *ktls, bool export_keys,
+    struct xktls_session_onedir *xk)
+{
+       if_t ifp;
+       struct m_snd_tag *st;
+
+       xk->gen = ktls->gen;
+#define        A(m) xk->m = ktls->params.m
+       A(cipher_algorithm);
+       A(auth_algorithm);
+       A(cipher_key_len);
+       A(auth_key_len);
+       A(max_frame_len);
+       A(tls_vmajor);
+       A(tls_vminor);
+       A(tls_hlen);
+       A(tls_tlen);
+       A(tls_bs);
+       A(flags);
+       if (export_keys) {
+               memcpy(&xk->iv, &ktls->params.iv, XKTLS_SESSION_IV_BUF_LEN);
+               A(iv_len);
+       } else {
+               memset(&xk->iv, 0, XKTLS_SESSION_IV_BUF_LEN);
+               xk->iv_len = 0;
+       }
+#undef A
+       if ((st = ktls->snd_tag) != NULL &&
+           (ifp = ktls->snd_tag->ifp) != NULL)
+               strncpy(xk->ifnet, if_name(ifp), sizeof(xk->ifnet));
+}
+
+void
+ktls_session_copy_keys(const struct ktls_session *ktls,
+    uint8_t *data, size_t *sz)
+{
+       size_t t, ta, tc;
+
+       if (ktls == NULL) {
+               *sz = 0;
+               return;
+       }
+       t = *sz;
+       tc = MIN(t, ktls->params.cipher_key_len);
+       if (data != NULL)
+               memcpy(data, ktls->params.cipher_key, tc);
+       ta = MIN(t - tc, ktls->params.auth_key_len);
+       if (data != NULL)
+               memcpy(data + tc, ktls->params.auth_key, ta);
+       *sz = ta + tc;
+}
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 5fe12c4f1e76..57cf15ca37fc 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -303,6 +303,30 @@ struct sockopt_parameters {
        char sop_optval[];
 };
 
+#ifdef _SYS_KTLS_H_
+struct xktls_session {
+       uint32_t tsz;   /* total sz of elm, next elm is at this+tsz */
+       uint32_t fsz;   /* size of the struct up to keys */
+       uint64_t inp_gencnt;
+       kvaddr_t so_pcb;
+       struct in_conninfo coninf;
+       u_short rx_vlan_id;
+       struct xktls_session_onedir rcv;
+       struct xktls_session_onedir snd;
+/*
+ * Next are
+ * - keydata for rcv, first cipher of length rcv.cipher_key_len, then
+ *    authentication of length rcv.auth_key_len;
+ * - driver data (string) of length rcv.drv_st_len, if the rcv session is
+ *    offloaded to ifnet rcv.ifnet;
+ * - keydata for snd, first cipher of length snd.cipher_key_len, then
+ *    authentication of length snd.auth_key_len;
+ * - driver data (string) of length snd.drv_st_len, if the snd session is
+ *    offloaded to ifnet snd.ifnet;
+ */
+};
+#endif /* _SYS_KTLS_H_ */
+
 #ifdef _KERNEL
 int    sysctl_setsockopt(SYSCTL_HANDLER_ARGS, struct inpcbinfo *pcbinfo,
            int (*ctloutput_set)(struct inpcb *, struct sockopt *));
diff --git a/sys/sys/ktls.h b/sys/sys/ktls.h
index 8dad53868686..0f9e5c5ed87b 100644
--- a/sys/sys/ktls.h
+++ b/sys/sys/ktls.h
@@ -145,6 +145,28 @@ struct tls_get_record {
        uint16_t tls_length;
 };
 
+#define        XKTLS_SESSION_IV_BUF_LEN        32
+struct xktls_session_onedir {
+       uint64_t gen;
+       uint64_t rsrv1[8];
+       uint32_t rsrv2[8];
+       uint8_t iv[XKTLS_SESSION_IV_BUF_LEN];
+       int     cipher_algorithm;
+       int     auth_algorithm;
+       uint16_t cipher_key_len;
+       uint16_t iv_len;
+       uint16_t auth_key_len;
+       uint16_t max_frame_len;
+       uint8_t tls_vmajor;
+       uint8_t tls_vminor;
+       uint8_t tls_hlen;
+       uint8_t tls_tlen;
+       uint8_t tls_bs;
+       uint8_t flags;
+       uint16_t drv_st_len;
+       char ifnet[16]; /* IFNAMSIZ */
+};
+
 #ifdef _KERNEL
 
 struct tls_session_params {
@@ -267,5 +289,10 @@ ktls_session_genvis(const struct ktls_session *ks, 
uint64_t gen)
        return (ks != NULL && ks->gen <= gen);
 }
 
+void ktls_session_to_xktls_onedir(const struct ktls_session *ks,
+    bool export_keys, struct xktls_session_onedir *xktls_od);
+void ktls_session_copy_keys(const struct ktls_session *ktls,
+    uint8_t *data, size_t *sz);
+
 #endif /* !_KERNEL */
 #endif /* !_SYS_KTLS_H_ */

Reply via email to