xref: /openbmc/linux/include/net/kcm.h (revision ab7ac4eb)
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