xref: /linux/include/net/psp/types.h (revision 8f7aa3d3c7323f4ca2768a9e74ebbe359c4f8f88)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __NET_PSP_H
4 #define __NET_PSP_H
5 
6 #include <linux/mutex.h>
7 #include <linux/refcount.h>
8 
9 struct netlink_ext_ack;
10 
11 #define PSP_DEFAULT_UDP_PORT	1000
12 
13 struct psphdr {
14 	u8	nexthdr;
15 	u8	hdrlen;
16 	u8	crypt_offset;
17 	u8	verfl;
18 	__be32	spi;
19 	__be64	iv;
20 	__be64	vc[]; /* optional */
21 };
22 
23 #define PSP_ENCAP_HLEN (sizeof(struct udphdr) + sizeof(struct psphdr))
24 
25 #define PSP_SPI_KEY_ID		GENMASK(30, 0)
26 #define PSP_SPI_KEY_PHASE	BIT(31)
27 
28 #define PSPHDR_CRYPT_OFFSET	GENMASK(5, 0)
29 
30 #define PSPHDR_VERFL_SAMPLE	BIT(7)
31 #define PSPHDR_VERFL_DROP	BIT(6)
32 #define PSPHDR_VERFL_VERSION	GENMASK(5, 2)
33 #define PSPHDR_VERFL_VIRT	BIT(1)
34 #define PSPHDR_VERFL_ONE	BIT(0)
35 
36 #define PSP_HDRLEN_NOOPT	((sizeof(struct psphdr) - 8) / 8)
37 
38 /**
39  * struct psp_dev_config - PSP device configuration
40  * @versions: PSP versions enabled on the device
41  */
42 struct psp_dev_config {
43 	u32 versions;
44 };
45 
46 /**
47  * struct psp_dev - PSP device struct
48  * @main_netdev: original netdevice of this PSP device
49  * @ops:	driver callbacks
50  * @caps:	device capabilities
51  * @drv_priv:	driver priv pointer
52  * @lock:	instance lock, protects all fields
53  * @refcnt:	reference count for the instance
54  * @id:		instance id
55  * @generation:	current generation of the device key
56  * @config:	current device configuration
57  * @active_assocs:	list of registered associations
58  * @prev_assocs:	associations which use old (but still usable)
59  *			device key
60  * @stale_assocs:	associations which use a rotated out key
61  *
62  * @stats:	statistics maintained by the core
63  * @stats.rotations:	See stats attr key-rotations
64  * @stats.stales:	See stats attr stale-events
65  *
66  * @rcu:	RCU head for freeing the structure
67  */
68 struct psp_dev {
69 	struct net_device *main_netdev;
70 
71 	struct psp_dev_ops *ops;
72 	struct psp_dev_caps *caps;
73 	void *drv_priv;
74 
75 	struct mutex lock;
76 	refcount_t refcnt;
77 
78 	u32 id;
79 
80 	u8 generation;
81 
82 	struct psp_dev_config config;
83 
84 	struct list_head active_assocs;
85 	struct list_head prev_assocs;
86 	struct list_head stale_assocs;
87 
88 	struct {
89 		unsigned long rotations;
90 		unsigned long stales;
91 	} stats;
92 
93 	struct rcu_head rcu;
94 };
95 
96 #define PSP_GEN_VALID_MASK	0x7f
97 
98 /**
99  * struct psp_dev_caps - PSP device capabilities
100  */
101 struct psp_dev_caps {
102 	/**
103 	 * @versions: mask of supported PSP versions
104 	 * Set this field to 0 to indicate PSP is not supported at all.
105 	 */
106 	u32 versions;
107 
108 	/**
109 	 * @assoc_drv_spc: size of driver-specific state in Tx assoc
110 	 * Determines the size of struct psp_assoc::drv_data
111 	 */
112 	u32 assoc_drv_spc;
113 };
114 
115 #define PSP_MAX_KEY	32
116 
117 #define PSP_HDR_SIZE	16	/* We don't support optional fields, yet */
118 #define PSP_TRL_SIZE	16	/* AES-GCM/GMAC trailer size */
119 
120 struct psp_skb_ext {
121 	__be32 spi;
122 	u16 dev_id;
123 	u8 generation;
124 	u8 version;
125 };
126 
127 struct psp_key_parsed {
128 	__be32 spi;
129 	u8 key[PSP_MAX_KEY];
130 };
131 
132 struct psp_assoc {
133 	struct psp_dev *psd;
134 
135 	u16 dev_id;
136 	u8 generation;
137 	u8 version;
138 	u8 peer_tx;
139 
140 	u32 upgrade_seq;
141 
142 	struct psp_key_parsed tx;
143 	struct psp_key_parsed rx;
144 
145 	refcount_t refcnt;
146 	struct rcu_head rcu;
147 	struct work_struct work;
148 	struct list_head assocs_list;
149 
150 	u8 drv_data[] __aligned(8);
151 };
152 
153 struct psp_dev_stats {
154 	union {
155 		struct {
156 			u64 rx_packets;
157 			u64 rx_bytes;
158 			u64 rx_auth_fail;
159 			u64 rx_error;
160 			u64 rx_bad;
161 			u64 tx_packets;
162 			u64 tx_bytes;
163 			u64 tx_error;
164 		};
165 		DECLARE_FLEX_ARRAY(u64, required);
166 	};
167 };
168 
169 /**
170  * struct psp_dev_ops - netdev driver facing PSP callbacks
171  */
172 struct psp_dev_ops {
173 	/**
174 	 * @set_config: set configuration of a PSP device
175 	 * Driver can inspect @psd->config for the previous configuration.
176 	 * Core will update @psd->config with @config on success.
177 	 */
178 	int (*set_config)(struct psp_dev *psd, struct psp_dev_config *conf,
179 			  struct netlink_ext_ack *extack);
180 
181 	/**
182 	 * @key_rotate: rotate the device key
183 	 */
184 	int (*key_rotate)(struct psp_dev *psd, struct netlink_ext_ack *extack);
185 
186 	/**
187 	 * @rx_spi_alloc: allocate an Rx SPI+key pair
188 	 * Allocate an Rx SPI and resulting derived key.
189 	 * This key should remain valid until key rotation.
190 	 */
191 	int (*rx_spi_alloc)(struct psp_dev *psd, u32 version,
192 			    struct psp_key_parsed *assoc,
193 			    struct netlink_ext_ack *extack);
194 
195 	/**
196 	 * @tx_key_add: add a Tx key to the device
197 	 * Install an association in the device. Core will allocate space
198 	 * for the driver to use at drv_data.
199 	 */
200 	int (*tx_key_add)(struct psp_dev *psd, struct psp_assoc *pas,
201 			  struct netlink_ext_ack *extack);
202 	/**
203 	 * @tx_key_del: remove a Tx key from the device
204 	 * Remove an association from the device.
205 	 */
206 	void (*tx_key_del)(struct psp_dev *psd, struct psp_assoc *pas);
207 
208 	/**
209 	 * @get_stats: get statistics from the device
210 	 * Stats required by the spec must be maintained and filled in.
211 	 * Stats must be filled in member-by-member, never memset the struct.
212 	 */
213 	void (*get_stats)(struct psp_dev *psd, struct psp_dev_stats *stats);
214 };
215 
216 #endif /* __NET_PSP_H */
217