Merge tag 'tegra-for-5.7-asoc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra...
[linux-2.6-microblaze.git] / include / net / macsec.h
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_KEYID_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_ */