1ab7ac4ebSTom Herbert /* 2ab7ac4ebSTom Herbert * Kernel Connection Multiplexor 3ab7ac4ebSTom Herbert * 4ab7ac4ebSTom Herbert * Copyright (c) 2016 Tom Herbert <tom@herbertland.com> 5ab7ac4ebSTom Herbert * 6ab7ac4ebSTom Herbert * This program is free software; you can redistribute it and/or modify 7ab7ac4ebSTom Herbert * it under the terms of the GNU General Public License version 2 8ab7ac4ebSTom Herbert * as published by the Free Software Foundation. 9ab7ac4ebSTom Herbert */ 10ab7ac4ebSTom Herbert 11ab7ac4ebSTom Herbert #ifndef __NET_KCM_H_ 12ab7ac4ebSTom Herbert #define __NET_KCM_H_ 13ab7ac4ebSTom Herbert 14ab7ac4ebSTom Herbert #include <linux/skbuff.h> 15ab7ac4ebSTom Herbert #include <net/sock.h> 16ab7ac4ebSTom Herbert #include <uapi/linux/kcm.h> 17ab7ac4ebSTom Herbert 18ab7ac4ebSTom Herbert extern unsigned int kcm_net_id; 19ab7ac4ebSTom Herbert 20ab7ac4ebSTom Herbert struct kcm_tx_msg { 21ab7ac4ebSTom Herbert unsigned int sent; 22ab7ac4ebSTom Herbert unsigned int fragidx; 23ab7ac4ebSTom Herbert unsigned int frag_offset; 24ab7ac4ebSTom Herbert unsigned int msg_flags; 25ab7ac4ebSTom Herbert struct sk_buff *frag_skb; 26ab7ac4ebSTom Herbert struct sk_buff *last_skb; 27ab7ac4ebSTom Herbert }; 28ab7ac4ebSTom Herbert 29ab7ac4ebSTom Herbert struct kcm_rx_msg { 30ab7ac4ebSTom Herbert int full_len; 31ab7ac4ebSTom Herbert int accum_len; 32ab7ac4ebSTom Herbert int offset; 33ab7ac4ebSTom Herbert }; 34ab7ac4ebSTom Herbert 35ab7ac4ebSTom Herbert /* Socket structure for KCM client sockets */ 36ab7ac4ebSTom Herbert struct kcm_sock { 37ab7ac4ebSTom Herbert struct sock sk; 38ab7ac4ebSTom Herbert struct kcm_mux *mux; 39ab7ac4ebSTom Herbert struct list_head kcm_sock_list; 40ab7ac4ebSTom Herbert int index; 41ab7ac4ebSTom Herbert u32 done : 1; 42ab7ac4ebSTom Herbert struct work_struct done_work; 43ab7ac4ebSTom Herbert 44ab7ac4ebSTom Herbert /* Transmit */ 45ab7ac4ebSTom Herbert struct kcm_psock *tx_psock; 46ab7ac4ebSTom Herbert struct work_struct tx_work; 47ab7ac4ebSTom Herbert struct list_head wait_psock_list; 48ab7ac4ebSTom Herbert struct sk_buff *seq_skb; 49ab7ac4ebSTom Herbert 50ab7ac4ebSTom Herbert /* Don't use bit fields here, these are set under different locks */ 51ab7ac4ebSTom Herbert bool tx_wait; 52ab7ac4ebSTom Herbert bool tx_wait_more; 53ab7ac4ebSTom Herbert 54ab7ac4ebSTom Herbert /* Receive */ 55ab7ac4ebSTom Herbert struct kcm_psock *rx_psock; 56ab7ac4ebSTom Herbert struct list_head wait_rx_list; /* KCMs waiting for receiving */ 57ab7ac4ebSTom Herbert bool rx_wait; 58ab7ac4ebSTom Herbert u32 rx_disabled : 1; 59ab7ac4ebSTom Herbert }; 60ab7ac4ebSTom Herbert 61ab7ac4ebSTom Herbert struct bpf_prog; 62ab7ac4ebSTom Herbert 63ab7ac4ebSTom Herbert /* Structure for an attached lower socket */ 64ab7ac4ebSTom Herbert struct kcm_psock { 65ab7ac4ebSTom Herbert struct sock *sk; 66ab7ac4ebSTom Herbert struct kcm_mux *mux; 67ab7ac4ebSTom Herbert int index; 68ab7ac4ebSTom Herbert 69ab7ac4ebSTom Herbert u32 tx_stopped : 1; 70ab7ac4ebSTom Herbert u32 rx_stopped : 1; 71ab7ac4ebSTom Herbert u32 done : 1; 72ab7ac4ebSTom Herbert u32 unattaching : 1; 73ab7ac4ebSTom Herbert 74ab7ac4ebSTom Herbert void (*save_state_change)(struct sock *sk); 75ab7ac4ebSTom Herbert void (*save_data_ready)(struct sock *sk); 76ab7ac4ebSTom Herbert void (*save_write_space)(struct sock *sk); 77ab7ac4ebSTom Herbert 78ab7ac4ebSTom Herbert struct list_head psock_list; 79ab7ac4ebSTom Herbert 80ab7ac4ebSTom Herbert /* Receive */ 81ab7ac4ebSTom Herbert struct sk_buff *rx_skb_head; 82ab7ac4ebSTom Herbert struct sk_buff **rx_skb_nextp; 83ab7ac4ebSTom Herbert struct sk_buff *ready_rx_msg; 84ab7ac4ebSTom Herbert struct list_head psock_ready_list; 85ab7ac4ebSTom Herbert struct work_struct rx_work; 86ab7ac4ebSTom Herbert struct delayed_work rx_delayed_work; 87ab7ac4ebSTom Herbert struct bpf_prog *bpf_prog; 88ab7ac4ebSTom Herbert struct kcm_sock *rx_kcm; 89ab7ac4ebSTom Herbert 90ab7ac4ebSTom Herbert /* Transmit */ 91ab7ac4ebSTom Herbert struct kcm_sock *tx_kcm; 92ab7ac4ebSTom Herbert struct list_head psock_avail_list; 93ab7ac4ebSTom Herbert }; 94ab7ac4ebSTom Herbert 95ab7ac4ebSTom Herbert /* Per net MUX list */ 96ab7ac4ebSTom Herbert struct kcm_net { 97ab7ac4ebSTom Herbert struct mutex mutex; 98ab7ac4ebSTom Herbert struct list_head mux_list; 99ab7ac4ebSTom Herbert int count; 100ab7ac4ebSTom Herbert }; 101ab7ac4ebSTom Herbert 102ab7ac4ebSTom Herbert /* Structure for a MUX */ 103ab7ac4ebSTom Herbert struct kcm_mux { 104ab7ac4ebSTom Herbert struct list_head kcm_mux_list; 105ab7ac4ebSTom Herbert struct rcu_head rcu; 106ab7ac4ebSTom Herbert struct kcm_net *knet; 107ab7ac4ebSTom Herbert 108ab7ac4ebSTom Herbert struct list_head kcm_socks; /* All KCM sockets on MUX */ 109ab7ac4ebSTom Herbert int kcm_socks_cnt; /* Total KCM socket count for MUX */ 110ab7ac4ebSTom Herbert struct list_head psocks; /* List of all psocks on MUX */ 111ab7ac4ebSTom Herbert int psocks_cnt; /* Total attached sockets */ 112ab7ac4ebSTom Herbert 113ab7ac4ebSTom Herbert /* Receive */ 114ab7ac4ebSTom Herbert spinlock_t rx_lock ____cacheline_aligned_in_smp; 115ab7ac4ebSTom Herbert struct list_head kcm_rx_waiters; /* KCMs waiting for receiving */ 116ab7ac4ebSTom Herbert struct list_head psocks_ready; /* List of psocks with a msg ready */ 117ab7ac4ebSTom Herbert struct sk_buff_head rx_hold_queue; 118ab7ac4ebSTom Herbert 119ab7ac4ebSTom Herbert /* Transmit */ 120ab7ac4ebSTom Herbert spinlock_t lock ____cacheline_aligned_in_smp; /* TX and mux locking */ 121ab7ac4ebSTom Herbert struct list_head psocks_avail; /* List of available psocks */ 122ab7ac4ebSTom Herbert struct list_head kcm_tx_waiters; /* KCMs waiting for a TX psock */ 123ab7ac4ebSTom Herbert }; 124ab7ac4ebSTom Herbert 125ab7ac4ebSTom Herbert #endif /* __NET_KCM_H_ */ 126