xref: /linux/include/net/macsec.h (revision 1f7fe5121127e037b86592ba42ce36515ea0e3f7)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * MACsec netdev header, used for h/w accelerated implementations.
4  *
5  * Copyright (c) 2015 Sabrina Dubroca <sd@queasysnail.net>
6  */
7 #ifndef _NET_MACSEC_H_
8 #define _NET_MACSEC_H_
9 
10 #include <linux/u64_stats_sync.h>
11 #include <uapi/linux/if_link.h>
12 #include <uapi/linux/if_macsec.h>
13 
14 #define MACSEC_DEFAULT_PN_LEN 4
15 #define MACSEC_XPN_PN_LEN 8
16 
17 #define MACSEC_SALT_LEN 12
18 #define MACSEC_NUM_AN 4 /* 2 bits for the association number */
19 
20 typedef u64 __bitwise sci_t;
21 typedef u32 __bitwise ssci_t;
22 
23 typedef union salt {
24 	struct {
25 		u32 ssci;
26 		u64 pn;
27 	} __packed;
28 	u8 bytes[MACSEC_SALT_LEN];
29 } __packed salt_t;
30 
31 typedef union pn {
32 	struct {
33 #if defined(__LITTLE_ENDIAN_BITFIELD)
34 		u32 lower;
35 		u32 upper;
36 #elif defined(__BIG_ENDIAN_BITFIELD)
37 		u32 upper;
38 		u32 lower;
39 #else
40 #error	"Please fix <asm/byteorder.h>"
41 #endif
42 	};
43 	u64 full64;
44 } pn_t;
45 
46 /**
47  * struct macsec_key - SA key
48  * @id: user-provided key identifier
49  * @tfm: crypto struct, key storage
50  * @salt: salt used to generate IV in XPN cipher suites
51  */
52 struct macsec_key {
53 	u8 id[MACSEC_KEYID_LEN];
54 	struct crypto_aead *tfm;
55 	salt_t salt;
56 };
57 
58 struct macsec_rx_sc_stats {
59 	__u64 InOctetsValidated;
60 	__u64 InOctetsDecrypted;
61 	__u64 InPktsUnchecked;
62 	__u64 InPktsDelayed;
63 	__u64 InPktsOK;
64 	__u64 InPktsInvalid;
65 	__u64 InPktsLate;
66 	__u64 InPktsNotValid;
67 	__u64 InPktsNotUsingSA;
68 	__u64 InPktsUnusedSA;
69 };
70 
71 struct macsec_rx_sa_stats {
72 	__u32 InPktsOK;
73 	__u32 InPktsInvalid;
74 	__u32 InPktsNotValid;
75 	__u32 InPktsNotUsingSA;
76 	__u32 InPktsUnusedSA;
77 };
78 
79 struct macsec_tx_sa_stats {
80 	__u32 OutPktsProtected;
81 	__u32 OutPktsEncrypted;
82 };
83 
84 struct macsec_tx_sc_stats {
85 	__u64 OutPktsProtected;
86 	__u64 OutPktsEncrypted;
87 	__u64 OutOctetsProtected;
88 	__u64 OutOctetsEncrypted;
89 };
90 
91 struct macsec_dev_stats {
92 	__u64 OutPktsUntagged;
93 	__u64 InPktsUntagged;
94 	__u64 OutPktsTooLong;
95 	__u64 InPktsNoTag;
96 	__u64 InPktsBadTag;
97 	__u64 InPktsUnknownSCI;
98 	__u64 InPktsNoSCI;
99 	__u64 InPktsOverrun;
100 };
101 
102 /**
103  * struct macsec_rx_sa - receive secure association
104  * @active:
105  * @next_pn: packet number expected for the next packet
106  * @lock: protects next_pn manipulations
107  * @key: key structure
108  * @ssci: short secure channel identifier
109  * @stats: per-SA stats
110  */
111 struct macsec_rx_sa {
112 	struct macsec_key key;
113 	ssci_t ssci;
114 	spinlock_t lock;
115 	union {
116 		pn_t next_pn_halves;
117 		u64 next_pn;
118 	};
119 	refcount_t refcnt;
120 	bool active;
121 	struct macsec_rx_sa_stats __percpu *stats;
122 	struct macsec_rx_sc *sc;
123 	struct rcu_head rcu;
124 };
125 
126 struct pcpu_rx_sc_stats {
127 	struct macsec_rx_sc_stats stats;
128 	struct u64_stats_sync syncp;
129 };
130 
131 struct pcpu_tx_sc_stats {
132 	struct macsec_tx_sc_stats stats;
133 	struct u64_stats_sync syncp;
134 };
135 
136 /**
137  * struct macsec_rx_sc - receive secure channel
138  * @sci: secure channel identifier for this SC
139  * @active: channel is active
140  * @sa: array of secure associations
141  * @stats: per-SC stats
142  */
143 struct macsec_rx_sc {
144 	struct macsec_rx_sc __rcu *next;
145 	sci_t sci;
146 	bool active;
147 	struct macsec_rx_sa __rcu *sa[MACSEC_NUM_AN];
148 	struct pcpu_rx_sc_stats __percpu *stats;
149 	refcount_t refcnt;
150 	struct rcu_head rcu_head;
151 };
152 
153 /**
154  * struct macsec_tx_sa - transmit secure association
155  * @active:
156  * @next_pn: packet number to use for the next packet
157  * @lock: protects next_pn manipulations
158  * @key: key structure
159  * @ssci: short secure channel identifier
160  * @stats: per-SA stats
161  */
162 struct macsec_tx_sa {
163 	struct macsec_key key;
164 	ssci_t ssci;
165 	spinlock_t lock;
166 	union {
167 		pn_t next_pn_halves;
168 		u64 next_pn;
169 	};
170 	refcount_t refcnt;
171 	bool active;
172 	struct macsec_tx_sa_stats __percpu *stats;
173 	struct rcu_head rcu;
174 };
175 
176 /**
177  * struct macsec_tx_sc - transmit secure channel
178  * @active:
179  * @encoding_sa: association number of the SA currently in use
180  * @encrypt: encrypt packets on transmit, or authenticate only
181  * @send_sci: always include the SCI in the SecTAG
182  * @end_station:
183  * @scb: single copy broadcast flag
184  * @sa: array of secure associations
185  * @stats: stats for this TXSC
186  */
187 struct macsec_tx_sc {
188 	bool active;
189 	u8 encoding_sa;
190 	bool encrypt;
191 	bool send_sci;
192 	bool end_station;
193 	bool scb;
194 	struct macsec_tx_sa __rcu *sa[MACSEC_NUM_AN];
195 	struct pcpu_tx_sc_stats __percpu *stats;
196 };
197 
198 /**
199  * struct macsec_secy - MACsec Security Entity
200  * @netdev: netdevice for this SecY
201  * @n_rx_sc: number of receive secure channels configured on this SecY
202  * @sci: secure channel identifier used for tx
203  * @key_len: length of keys used by the cipher suite
204  * @icv_len: length of ICV used by the cipher suite
205  * @validate_frames: validation mode
206  * @xpn: enable XPN for this SecY
207  * @operational: MAC_Operational flag
208  * @protect_frames: enable protection for this SecY
209  * @replay_protect: enable packet number checks on receive
210  * @replay_window: size of the replay window
211  * @tx_sc: transmit secure channel
212  * @rx_sc: linked list of receive secure channels
213  */
214 struct macsec_secy {
215 	struct net_device *netdev;
216 	unsigned int n_rx_sc;
217 	sci_t sci;
218 	u16 key_len;
219 	u16 icv_len;
220 	enum macsec_validation_type validate_frames;
221 	bool xpn;
222 	bool operational;
223 	bool protect_frames;
224 	bool replay_protect;
225 	u32 replay_window;
226 	struct macsec_tx_sc tx_sc;
227 	struct macsec_rx_sc __rcu *rx_sc;
228 };
229 
230 /**
231  * struct macsec_context - MACsec context for hardware offloading
232  */
233 struct macsec_context {
234 	union {
235 		struct net_device *netdev;
236 		struct phy_device *phydev;
237 	};
238 	enum macsec_offload offload;
239 
240 	struct macsec_secy *secy;
241 	struct macsec_rx_sc *rx_sc;
242 	struct {
243 		unsigned char assoc_num;
244 		u8 key[MACSEC_MAX_KEY_LEN];
245 		union {
246 			struct macsec_rx_sa *rx_sa;
247 			struct macsec_tx_sa *tx_sa;
248 		};
249 	} sa;
250 	union {
251 		struct macsec_tx_sc_stats *tx_sc_stats;
252 		struct macsec_tx_sa_stats *tx_sa_stats;
253 		struct macsec_rx_sc_stats *rx_sc_stats;
254 		struct macsec_rx_sa_stats *rx_sa_stats;
255 		struct macsec_dev_stats  *dev_stats;
256 	} stats;
257 
258 	u8 prepare:1;
259 };
260 
261 /**
262  * struct macsec_ops - MACsec offloading operations
263  */
264 struct macsec_ops {
265 	/* Device wide */
266 	int (*mdo_dev_open)(struct macsec_context *ctx);
267 	int (*mdo_dev_stop)(struct macsec_context *ctx);
268 	/* SecY */
269 	int (*mdo_add_secy)(struct macsec_context *ctx);
270 	int (*mdo_upd_secy)(struct macsec_context *ctx);
271 	int (*mdo_del_secy)(struct macsec_context *ctx);
272 	/* Security channels */
273 	int (*mdo_add_rxsc)(struct macsec_context *ctx);
274 	int (*mdo_upd_rxsc)(struct macsec_context *ctx);
275 	int (*mdo_del_rxsc)(struct macsec_context *ctx);
276 	/* Security associations */
277 	int (*mdo_add_rxsa)(struct macsec_context *ctx);
278 	int (*mdo_upd_rxsa)(struct macsec_context *ctx);
279 	int (*mdo_del_rxsa)(struct macsec_context *ctx);
280 	int (*mdo_add_txsa)(struct macsec_context *ctx);
281 	int (*mdo_upd_txsa)(struct macsec_context *ctx);
282 	int (*mdo_del_txsa)(struct macsec_context *ctx);
283 	/* Statistics */
284 	int (*mdo_get_dev_stats)(struct macsec_context *ctx);
285 	int (*mdo_get_tx_sc_stats)(struct macsec_context *ctx);
286 	int (*mdo_get_tx_sa_stats)(struct macsec_context *ctx);
287 	int (*mdo_get_rx_sc_stats)(struct macsec_context *ctx);
288 	int (*mdo_get_rx_sa_stats)(struct macsec_context *ctx);
289 };
290 
291 void macsec_pn_wrapped(struct macsec_secy *secy, struct macsec_tx_sa *tx_sa);
292 
293 #endif /* _NET_MACSEC_H_ */
294