#include <linux/module.h>
#include <net/tcp.h>
#include <net/inet_common.h>
#include <linux/highmem.h>
#include <linux/netdevice.h>
#include <linux/sched/signal.h>
#include <linux/inetdevice.h>
#include <linux/inet_diag.h>
#include <net/snmp.h>
#include <net/tls.h>
#include <net/tls_toe.h>
#include "tls.h"
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_ALIAS_TCP_ULP(…) …;
enum { … };
#define CHECK_CIPHER_DESC(cipher,ci) …
#define __CIPHER_DESC(ci) …
#define CIPHER_DESC(cipher,ci,algname,_offloadable) …
#define CIPHER_DESC_NONCE0(cipher,ci,algname,_offloadable) …
const struct tls_cipher_desc tls_cipher_desc[TLS_CIPHER_MAX + 1 - TLS_CIPHER_MIN] = …;
CHECK_CIPHER_DESC(TLS_CIPHER_AES_GCM_128, tls12_crypto_info_aes_gcm_128);
CHECK_CIPHER_DESC(TLS_CIPHER_AES_GCM_256, tls12_crypto_info_aes_gcm_256);
CHECK_CIPHER_DESC(TLS_CIPHER_AES_CCM_128, tls12_crypto_info_aes_ccm_128);
CHECK_CIPHER_DESC(TLS_CIPHER_CHACHA20_POLY1305, tls12_crypto_info_chacha20_poly1305);
CHECK_CIPHER_DESC(TLS_CIPHER_SM4_GCM, tls12_crypto_info_sm4_gcm);
CHECK_CIPHER_DESC(TLS_CIPHER_SM4_CCM, tls12_crypto_info_sm4_ccm);
CHECK_CIPHER_DESC(TLS_CIPHER_ARIA_GCM_128, tls12_crypto_info_aria_gcm_128);
CHECK_CIPHER_DESC(TLS_CIPHER_ARIA_GCM_256, tls12_crypto_info_aria_gcm_256);
static const struct proto *saved_tcpv6_prot;
static DEFINE_MUTEX(tcpv6_prot_mutex);
static const struct proto *saved_tcpv4_prot;
static DEFINE_MUTEX(tcpv4_prot_mutex);
static struct proto tls_prots[TLS_NUM_PROTS][TLS_NUM_CONFIG][TLS_NUM_CONFIG];
static struct proto_ops tls_proto_ops[TLS_NUM_PROTS][TLS_NUM_CONFIG][TLS_NUM_CONFIG];
static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
const struct proto *base);
void update_sk_prot(struct sock *sk, struct tls_context *ctx)
{ … }
int wait_on_pending_writer(struct sock *sk, long *timeo)
{ … }
int tls_push_sg(struct sock *sk,
struct tls_context *ctx,
struct scatterlist *sg,
u16 first_offset,
int flags)
{ … }
static int tls_handle_open_record(struct sock *sk, int flags)
{ … }
int tls_process_cmsg(struct sock *sk, struct msghdr *msg,
unsigned char *record_type)
{ … }
int tls_push_partial_record(struct sock *sk, struct tls_context *ctx,
int flags)
{ … }
void tls_free_partial_record(struct sock *sk, struct tls_context *ctx)
{ … }
static void tls_write_space(struct sock *sk)
{ … }
void tls_ctx_free(struct sock *sk, struct tls_context *ctx)
{ … }
static void tls_sk_proto_cleanup(struct sock *sk,
struct tls_context *ctx, long timeo)
{ … }
static void tls_sk_proto_close(struct sock *sk, long timeout)
{ … }
static __poll_t tls_sk_poll(struct file *file, struct socket *sock,
struct poll_table_struct *wait)
{ … }
static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
int __user *optlen, int tx)
{ … }
static int do_tls_getsockopt_tx_zc(struct sock *sk, char __user *optval,
int __user *optlen)
{ … }
static int do_tls_getsockopt_no_pad(struct sock *sk, char __user *optval,
int __user *optlen)
{ … }
static int do_tls_getsockopt(struct sock *sk, int optname,
char __user *optval, int __user *optlen)
{ … }
static int tls_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{ … }
static int validate_crypto_info(const struct tls_crypto_info *crypto_info,
const struct tls_crypto_info *alt_crypto_info)
{ … }
static int do_tls_setsockopt_conf(struct sock *sk, sockptr_t optval,
unsigned int optlen, int tx)
{ … }
static int do_tls_setsockopt_tx_zc(struct sock *sk, sockptr_t optval,
unsigned int optlen)
{ … }
static int do_tls_setsockopt_no_pad(struct sock *sk, sockptr_t optval,
unsigned int optlen)
{ … }
static int do_tls_setsockopt(struct sock *sk, int optname, sockptr_t optval,
unsigned int optlen)
{ … }
static int tls_setsockopt(struct sock *sk, int level, int optname,
sockptr_t optval, unsigned int optlen)
{ … }
struct tls_context *tls_ctx_create(struct sock *sk)
{ … }
static void build_proto_ops(struct proto_ops ops[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
const struct proto_ops *base)
{ … }
static void tls_build_proto(struct sock *sk)
{ … }
static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
const struct proto *base)
{ … }
static int tls_init(struct sock *sk)
{ … }
static void tls_update(struct sock *sk, struct proto *p,
void (*write_space)(struct sock *sk))
{ … }
static u16 tls_user_config(struct tls_context *ctx, bool tx)
{ … }
static int tls_get_info(struct sock *sk, struct sk_buff *skb)
{ … }
static size_t tls_get_info_size(const struct sock *sk)
{ … }
static int __net_init tls_init_net(struct net *net)
{ … }
static void __net_exit tls_exit_net(struct net *net)
{ … }
static struct pernet_operations tls_proc_ops = …;
static struct tcp_ulp_ops tcp_tls_ulp_ops __read_mostly = …;
static int __init tls_register(void)
{ … }
static void __exit tls_unregister(void)
{ … }
module_init(…) …;
module_exit(tls_unregister);