xref: /linux-6.15/include/net/macsec.h (revision 457bb797)
1c0e4eadfSAntoine Tenart /* SPDX-License-Identifier: GPL-2.0+ */
2c0e4eadfSAntoine Tenart /*
3c0e4eadfSAntoine Tenart  * MACsec netdev header, used for h/w accelerated implementations.
4c0e4eadfSAntoine Tenart  *
5c0e4eadfSAntoine Tenart  * Copyright (c) 2015 Sabrina Dubroca <[email protected]>
6c0e4eadfSAntoine Tenart  */
7c0e4eadfSAntoine Tenart #ifndef _NET_MACSEC_H_
8c0e4eadfSAntoine Tenart #define _NET_MACSEC_H_
9c0e4eadfSAntoine Tenart 
10c0e4eadfSAntoine Tenart #include <linux/u64_stats_sync.h>
11bd9424efSSubbaraya Sundeep #include <linux/if_vlan.h>
12c0e4eadfSAntoine Tenart #include <uapi/linux/if_link.h>
13c0e4eadfSAntoine Tenart #include <uapi/linux/if_macsec.h>
14c0e4eadfSAntoine Tenart 
1548ef50faSEra Mayflower #define MACSEC_DEFAULT_PN_LEN 4
1648ef50faSEra Mayflower #define MACSEC_XPN_PN_LEN 8
1748ef50faSEra Mayflower 
18c0e4eadfSAntoine Tenart #define MACSEC_NUM_AN 4 /* 2 bits for the association number */
19c0e4eadfSAntoine Tenart 
20b1671253SLior Nahmanson #define MACSEC_SCI_LEN 8
21b1671253SLior Nahmanson #define MACSEC_PORT_ES (htons(0x0001))
22b1671253SLior Nahmanson 
23b1671253SLior Nahmanson #define MACSEC_TCI_VERSION 0x80
24b1671253SLior Nahmanson #define MACSEC_TCI_ES      0x40 /* end station */
25b1671253SLior Nahmanson #define MACSEC_TCI_SC      0x20 /* SCI present */
26b1671253SLior Nahmanson #define MACSEC_TCI_SCB     0x10 /* epon */
27b1671253SLior Nahmanson #define MACSEC_TCI_E       0x08 /* encryption */
28b1671253SLior Nahmanson #define MACSEC_TCI_C       0x04 /* changed text */
29b1671253SLior Nahmanson #define MACSEC_AN_MASK     0x03 /* association number */
30b1671253SLior Nahmanson #define MACSEC_TCI_CONFID  (MACSEC_TCI_E | MACSEC_TCI_C)
31b1671253SLior Nahmanson 
32b1671253SLior Nahmanson #define MACSEC_DEFAULT_ICV_LEN 16
33b1671253SLior Nahmanson 
34a21ecf0eSEra Mayflower typedef u64 __bitwise sci_t;
35a21ecf0eSEra Mayflower typedef u32 __bitwise ssci_t;
36a21ecf0eSEra Mayflower 
370a28bfd4SLior Nahmanson struct metadata_dst;
380a28bfd4SLior Nahmanson 
39a21ecf0eSEra Mayflower typedef union salt {
40a21ecf0eSEra Mayflower 	struct {
41*457bb797SAles Nezbeda 		ssci_t ssci;
42*457bb797SAles Nezbeda 		__be64 pn;
43a21ecf0eSEra Mayflower 	} __packed;
44a21ecf0eSEra Mayflower 	u8 bytes[MACSEC_SALT_LEN];
45a21ecf0eSEra Mayflower } __packed salt_t;
46a21ecf0eSEra Mayflower 
47a21ecf0eSEra Mayflower typedef union pn {
48a21ecf0eSEra Mayflower 	struct {
49a21ecf0eSEra Mayflower #if defined(__LITTLE_ENDIAN_BITFIELD)
50a21ecf0eSEra Mayflower 		u32 lower;
51a21ecf0eSEra Mayflower 		u32 upper;
52a21ecf0eSEra Mayflower #elif defined(__BIG_ENDIAN_BITFIELD)
53a21ecf0eSEra Mayflower 		u32 upper;
54a21ecf0eSEra Mayflower 		u32 lower;
55a21ecf0eSEra Mayflower #else
56a21ecf0eSEra Mayflower #error	"Please fix <asm/byteorder.h>"
57a21ecf0eSEra Mayflower #endif
58a21ecf0eSEra Mayflower 	};
59a21ecf0eSEra Mayflower 	u64 full64;
60a21ecf0eSEra Mayflower } pn_t;
61a21ecf0eSEra Mayflower 
62c0e4eadfSAntoine Tenart /**
63c0e4eadfSAntoine Tenart  * struct macsec_key - SA key
64c0e4eadfSAntoine Tenart  * @id: user-provided key identifier
65c0e4eadfSAntoine Tenart  * @tfm: crypto struct, key storage
66a21ecf0eSEra Mayflower  * @salt: salt used to generate IV in XPN cipher suites
67c0e4eadfSAntoine Tenart  */
68c0e4eadfSAntoine Tenart struct macsec_key {
69c0e4eadfSAntoine Tenart 	u8 id[MACSEC_KEYID_LEN];
70c0e4eadfSAntoine Tenart 	struct crypto_aead *tfm;
71a21ecf0eSEra Mayflower 	salt_t salt;
72c0e4eadfSAntoine Tenart };
73c0e4eadfSAntoine Tenart 
74c0e4eadfSAntoine Tenart struct macsec_rx_sc_stats {
75c0e4eadfSAntoine Tenart 	__u64 InOctetsValidated;
76c0e4eadfSAntoine Tenart 	__u64 InOctetsDecrypted;
77c0e4eadfSAntoine Tenart 	__u64 InPktsUnchecked;
78c0e4eadfSAntoine Tenart 	__u64 InPktsDelayed;
79c0e4eadfSAntoine Tenart 	__u64 InPktsOK;
80c0e4eadfSAntoine Tenart 	__u64 InPktsInvalid;
81c0e4eadfSAntoine Tenart 	__u64 InPktsLate;
82c0e4eadfSAntoine Tenart 	__u64 InPktsNotValid;
83c0e4eadfSAntoine Tenart 	__u64 InPktsNotUsingSA;
84c0e4eadfSAntoine Tenart 	__u64 InPktsUnusedSA;
85c0e4eadfSAntoine Tenart };
86c0e4eadfSAntoine Tenart 
87c0e4eadfSAntoine Tenart struct macsec_rx_sa_stats {
88c0e4eadfSAntoine Tenart 	__u32 InPktsOK;
89c0e4eadfSAntoine Tenart 	__u32 InPktsInvalid;
90c0e4eadfSAntoine Tenart 	__u32 InPktsNotValid;
91c0e4eadfSAntoine Tenart 	__u32 InPktsNotUsingSA;
92c0e4eadfSAntoine Tenart 	__u32 InPktsUnusedSA;
93c0e4eadfSAntoine Tenart };
94c0e4eadfSAntoine Tenart 
95c0e4eadfSAntoine Tenart struct macsec_tx_sa_stats {
96c0e4eadfSAntoine Tenart 	__u32 OutPktsProtected;
97c0e4eadfSAntoine Tenart 	__u32 OutPktsEncrypted;
98c0e4eadfSAntoine Tenart };
99c0e4eadfSAntoine Tenart 
100c0e4eadfSAntoine Tenart struct macsec_tx_sc_stats {
101c0e4eadfSAntoine Tenart 	__u64 OutPktsProtected;
102c0e4eadfSAntoine Tenart 	__u64 OutPktsEncrypted;
103c0e4eadfSAntoine Tenart 	__u64 OutOctetsProtected;
104c0e4eadfSAntoine Tenart 	__u64 OutOctetsEncrypted;
105c0e4eadfSAntoine Tenart };
106c0e4eadfSAntoine Tenart 
107b62c3624SDmitry Bogdanov struct macsec_dev_stats {
108b62c3624SDmitry Bogdanov 	__u64 OutPktsUntagged;
109b62c3624SDmitry Bogdanov 	__u64 InPktsUntagged;
110b62c3624SDmitry Bogdanov 	__u64 OutPktsTooLong;
111b62c3624SDmitry Bogdanov 	__u64 InPktsNoTag;
112b62c3624SDmitry Bogdanov 	__u64 InPktsBadTag;
113b62c3624SDmitry Bogdanov 	__u64 InPktsUnknownSCI;
114b62c3624SDmitry Bogdanov 	__u64 InPktsNoSCI;
115b62c3624SDmitry Bogdanov 	__u64 InPktsOverrun;
116b62c3624SDmitry Bogdanov };
117b62c3624SDmitry Bogdanov 
118c0e4eadfSAntoine Tenart /**
119c0e4eadfSAntoine Tenart  * struct macsec_rx_sa - receive secure association
120c0e4eadfSAntoine Tenart  * @active:
121c0e4eadfSAntoine Tenart  * @next_pn: packet number expected for the next packet
122c0e4eadfSAntoine Tenart  * @lock: protects next_pn manipulations
123c0e4eadfSAntoine Tenart  * @key: key structure
124a21ecf0eSEra Mayflower  * @ssci: short secure channel identifier
125c0e4eadfSAntoine Tenart  * @stats: per-SA stats
126c0e4eadfSAntoine Tenart  */
127c0e4eadfSAntoine Tenart struct macsec_rx_sa {
128c0e4eadfSAntoine Tenart 	struct macsec_key key;
129a21ecf0eSEra Mayflower 	ssci_t ssci;
130c0e4eadfSAntoine Tenart 	spinlock_t lock;
131a21ecf0eSEra Mayflower 	union {
132a21ecf0eSEra Mayflower 		pn_t next_pn_halves;
133a21ecf0eSEra Mayflower 		u64 next_pn;
134a21ecf0eSEra Mayflower 	};
135c0e4eadfSAntoine Tenart 	refcount_t refcnt;
136c0e4eadfSAntoine Tenart 	bool active;
137c0e4eadfSAntoine Tenart 	struct macsec_rx_sa_stats __percpu *stats;
138c0e4eadfSAntoine Tenart 	struct macsec_rx_sc *sc;
139c0e4eadfSAntoine Tenart 	struct rcu_head rcu;
140c0e4eadfSAntoine Tenart };
141c0e4eadfSAntoine Tenart 
142c0e4eadfSAntoine Tenart struct pcpu_rx_sc_stats {
143c0e4eadfSAntoine Tenart 	struct macsec_rx_sc_stats stats;
144c0e4eadfSAntoine Tenart 	struct u64_stats_sync syncp;
145c0e4eadfSAntoine Tenart };
146c0e4eadfSAntoine Tenart 
147c0e4eadfSAntoine Tenart struct pcpu_tx_sc_stats {
148c0e4eadfSAntoine Tenart 	struct macsec_tx_sc_stats stats;
149c0e4eadfSAntoine Tenart 	struct u64_stats_sync syncp;
150c0e4eadfSAntoine Tenart };
151c0e4eadfSAntoine Tenart 
152c0e4eadfSAntoine Tenart /**
153c0e4eadfSAntoine Tenart  * struct macsec_rx_sc - receive secure channel
154c0e4eadfSAntoine Tenart  * @sci: secure channel identifier for this SC
155c0e4eadfSAntoine Tenart  * @active: channel is active
156c0e4eadfSAntoine Tenart  * @sa: array of secure associations
157c0e4eadfSAntoine Tenart  * @stats: per-SC stats
158c0e4eadfSAntoine Tenart  */
159c0e4eadfSAntoine Tenart struct macsec_rx_sc {
160c0e4eadfSAntoine Tenart 	struct macsec_rx_sc __rcu *next;
161c0e4eadfSAntoine Tenart 	sci_t sci;
162c0e4eadfSAntoine Tenart 	bool active;
163c0e4eadfSAntoine Tenart 	struct macsec_rx_sa __rcu *sa[MACSEC_NUM_AN];
164c0e4eadfSAntoine Tenart 	struct pcpu_rx_sc_stats __percpu *stats;
165c0e4eadfSAntoine Tenart 	refcount_t refcnt;
166c0e4eadfSAntoine Tenart 	struct rcu_head rcu_head;
167c0e4eadfSAntoine Tenart };
168c0e4eadfSAntoine Tenart 
169c0e4eadfSAntoine Tenart /**
170c0e4eadfSAntoine Tenart  * struct macsec_tx_sa - transmit secure association
171c0e4eadfSAntoine Tenart  * @active:
172c0e4eadfSAntoine Tenart  * @next_pn: packet number to use for the next packet
173c0e4eadfSAntoine Tenart  * @lock: protects next_pn manipulations
174c0e4eadfSAntoine Tenart  * @key: key structure
175a21ecf0eSEra Mayflower  * @ssci: short secure channel identifier
176c0e4eadfSAntoine Tenart  * @stats: per-SA stats
177c0e4eadfSAntoine Tenart  */
178c0e4eadfSAntoine Tenart struct macsec_tx_sa {
179c0e4eadfSAntoine Tenart 	struct macsec_key key;
180a21ecf0eSEra Mayflower 	ssci_t ssci;
181c0e4eadfSAntoine Tenart 	spinlock_t lock;
182a21ecf0eSEra Mayflower 	union {
183a21ecf0eSEra Mayflower 		pn_t next_pn_halves;
184a21ecf0eSEra Mayflower 		u64 next_pn;
185a21ecf0eSEra Mayflower 	};
186c0e4eadfSAntoine Tenart 	refcount_t refcnt;
187c0e4eadfSAntoine Tenart 	bool active;
188c0e4eadfSAntoine Tenart 	struct macsec_tx_sa_stats __percpu *stats;
189c0e4eadfSAntoine Tenart 	struct rcu_head rcu;
190c0e4eadfSAntoine Tenart };
191c0e4eadfSAntoine Tenart 
192c0e4eadfSAntoine Tenart /**
193c0e4eadfSAntoine Tenart  * struct macsec_tx_sc - transmit secure channel
194c0e4eadfSAntoine Tenart  * @active:
195c0e4eadfSAntoine Tenart  * @encoding_sa: association number of the SA currently in use
196c0e4eadfSAntoine Tenart  * @encrypt: encrypt packets on transmit, or authenticate only
197c0e4eadfSAntoine Tenart  * @send_sci: always include the SCI in the SecTAG
198c0e4eadfSAntoine Tenart  * @end_station:
199c0e4eadfSAntoine Tenart  * @scb: single copy broadcast flag
200c0e4eadfSAntoine Tenart  * @sa: array of secure associations
201c0e4eadfSAntoine Tenart  * @stats: stats for this TXSC
2020a28bfd4SLior Nahmanson  * @md_dst: MACsec offload metadata dst
203c0e4eadfSAntoine Tenart  */
204c0e4eadfSAntoine Tenart struct macsec_tx_sc {
205c0e4eadfSAntoine Tenart 	bool active;
206c0e4eadfSAntoine Tenart 	u8 encoding_sa;
207c0e4eadfSAntoine Tenart 	bool encrypt;
208c0e4eadfSAntoine Tenart 	bool send_sci;
209c0e4eadfSAntoine Tenart 	bool end_station;
210c0e4eadfSAntoine Tenart 	bool scb;
211c0e4eadfSAntoine Tenart 	struct macsec_tx_sa __rcu *sa[MACSEC_NUM_AN];
212c0e4eadfSAntoine Tenart 	struct pcpu_tx_sc_stats __percpu *stats;
2130a28bfd4SLior Nahmanson 	struct metadata_dst *md_dst;
214c0e4eadfSAntoine Tenart };
215c0e4eadfSAntoine Tenart 
216c0e4eadfSAntoine Tenart /**
217c0e4eadfSAntoine Tenart  * struct macsec_secy - MACsec Security Entity
218c0e4eadfSAntoine Tenart  * @netdev: netdevice for this SecY
219c0e4eadfSAntoine Tenart  * @n_rx_sc: number of receive secure channels configured on this SecY
220c0e4eadfSAntoine Tenart  * @sci: secure channel identifier used for tx
221c0e4eadfSAntoine Tenart  * @key_len: length of keys used by the cipher suite
222c0e4eadfSAntoine Tenart  * @icv_len: length of ICV used by the cipher suite
223c0e4eadfSAntoine Tenart  * @validate_frames: validation mode
224a21ecf0eSEra Mayflower  * @xpn: enable XPN for this SecY
225c0e4eadfSAntoine Tenart  * @operational: MAC_Operational flag
226c0e4eadfSAntoine Tenart  * @protect_frames: enable protection for this SecY
227c0e4eadfSAntoine Tenart  * @replay_protect: enable packet number checks on receive
228c0e4eadfSAntoine Tenart  * @replay_window: size of the replay window
229c0e4eadfSAntoine Tenart  * @tx_sc: transmit secure channel
230c0e4eadfSAntoine Tenart  * @rx_sc: linked list of receive secure channels
231c0e4eadfSAntoine Tenart  */
232c0e4eadfSAntoine Tenart struct macsec_secy {
233c0e4eadfSAntoine Tenart 	struct net_device *netdev;
234c0e4eadfSAntoine Tenart 	unsigned int n_rx_sc;
235c0e4eadfSAntoine Tenart 	sci_t sci;
236c0e4eadfSAntoine Tenart 	u16 key_len;
237c0e4eadfSAntoine Tenart 	u16 icv_len;
238c0e4eadfSAntoine Tenart 	enum macsec_validation_type validate_frames;
239a21ecf0eSEra Mayflower 	bool xpn;
240c0e4eadfSAntoine Tenart 	bool operational;
241c0e4eadfSAntoine Tenart 	bool protect_frames;
242c0e4eadfSAntoine Tenart 	bool replay_protect;
243c0e4eadfSAntoine Tenart 	u32 replay_window;
244c0e4eadfSAntoine Tenart 	struct macsec_tx_sc tx_sc;
245c0e4eadfSAntoine Tenart 	struct macsec_rx_sc __rcu *rx_sc;
246c0e4eadfSAntoine Tenart };
247c0e4eadfSAntoine Tenart 
24876564261SAntoine Tenart /**
24976564261SAntoine Tenart  * struct macsec_context - MACsec context for hardware offloading
250eb97b9bdSRadu Pirea (NXP OSS)  * @netdev: a valid pointer to a struct net_device if @offload ==
251eb97b9bdSRadu Pirea (NXP OSS)  *	MACSEC_OFFLOAD_MAC
252eb97b9bdSRadu Pirea (NXP OSS)  * @phydev: a valid pointer to a struct phy_device if @offload ==
253eb97b9bdSRadu Pirea (NXP OSS)  *	MACSEC_OFFLOAD_PHY
254eb97b9bdSRadu Pirea (NXP OSS)  * @offload: MACsec offload status
255eb97b9bdSRadu Pirea (NXP OSS)  * @secy: pointer to a MACsec SecY
256eb97b9bdSRadu Pirea (NXP OSS)  * @rx_sc: pointer to a RX SC
257eb97b9bdSRadu Pirea (NXP OSS)  * @update_pn: when updating the SA, update the next PN
258eb97b9bdSRadu Pirea (NXP OSS)  * @assoc_num: association number of the target SA
259eb97b9bdSRadu Pirea (NXP OSS)  * @key: key of the target SA
260eb97b9bdSRadu Pirea (NXP OSS)  * @rx_sa: pointer to an RX SA if a RX SA is added/updated/removed
261eb97b9bdSRadu Pirea (NXP OSS)  * @tx_sa: pointer to an TX SA if a TX SA is added/updated/removed
262eb97b9bdSRadu Pirea (NXP OSS)  * @tx_sc_stats: pointer to TX SC stats structure
263eb97b9bdSRadu Pirea (NXP OSS)  * @tx_sa_stats: pointer to TX SA stats structure
264eb97b9bdSRadu Pirea (NXP OSS)  * @rx_sc_stats: pointer to RX SC stats structure
265eb97b9bdSRadu Pirea (NXP OSS)  * @rx_sa_stats: pointer to RX SA stats structure
266eb97b9bdSRadu Pirea (NXP OSS)  * @dev_stats: pointer to dev stats structure
26776564261SAntoine Tenart  */
26876564261SAntoine Tenart struct macsec_context {
2698fa91371SAntoine Tenart 	union {
2708fa91371SAntoine Tenart 		struct net_device *netdev;
27176564261SAntoine Tenart 		struct phy_device *phydev;
2728fa91371SAntoine Tenart 	};
27376564261SAntoine Tenart 	enum macsec_offload offload;
27476564261SAntoine Tenart 
27576564261SAntoine Tenart 	struct macsec_secy *secy;
27676564261SAntoine Tenart 	struct macsec_rx_sc *rx_sc;
27776564261SAntoine Tenart 	struct {
2780412cc84SRadu Pirea (NXP OSS) 		bool update_pn;
27976564261SAntoine Tenart 		unsigned char assoc_num;
2801f7fe512SAntoine Tenart 		u8 key[MACSEC_MAX_KEY_LEN];
28176564261SAntoine Tenart 		union {
28276564261SAntoine Tenart 			struct macsec_rx_sa *rx_sa;
28376564261SAntoine Tenart 			struct macsec_tx_sa *tx_sa;
28476564261SAntoine Tenart 		};
28576564261SAntoine Tenart 	} sa;
286b62c3624SDmitry Bogdanov 	union {
287b62c3624SDmitry Bogdanov 		struct macsec_tx_sc_stats *tx_sc_stats;
288b62c3624SDmitry Bogdanov 		struct macsec_tx_sa_stats *tx_sa_stats;
289b62c3624SDmitry Bogdanov 		struct macsec_rx_sc_stats *rx_sc_stats;
290b62c3624SDmitry Bogdanov 		struct macsec_rx_sa_stats *rx_sa_stats;
291b62c3624SDmitry Bogdanov 		struct macsec_dev_stats  *dev_stats;
292b62c3624SDmitry Bogdanov 	} stats;
29376564261SAntoine Tenart };
29476564261SAntoine Tenart 
2950830e20bSAntoine Tenart /**
2960830e20bSAntoine Tenart  * struct macsec_ops - MACsec offloading operations
297eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_dev_open: called when the MACsec interface transitions to the up state
298eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_dev_stop: called when the MACsec interface transitions to the down
299eb97b9bdSRadu Pirea (NXP OSS)  *	state
300eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_add_secy: called when a new SecY is added
301eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_upd_secy: called when the SecY flags are changed or the MAC address of
302eb97b9bdSRadu Pirea (NXP OSS)  *	the MACsec interface is changed
303eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_del_secy: called when the hw offload is disabled or the MACsec
304eb97b9bdSRadu Pirea (NXP OSS)  *	interface is removed
305eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_add_rxsc: called when a new RX SC is added
306eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_upd_rxsc: called when a certain RX SC is updated
307eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_del_rxsc: called when a certain RX SC is removed
308eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_add_rxsa: called when a new RX SA is added
309eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_upd_rxsa: called when a certain RX SA is updated
310eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_del_rxsa: called when a certain RX SA is removed
311eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_add_txsa: called when a new TX SA is added
312eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_upd_txsa: called when a certain TX SA is updated
313eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_del_txsa: called when a certain TX SA is removed
314eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_get_dev_stats: called when dev stats are read
315eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_get_tx_sc_stats: called when TX SC stats are read
316eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_get_tx_sa_stats: called when TX SA stats are read
317eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_get_rx_sc_stats: called when RX SC stats are read
318eb97b9bdSRadu Pirea (NXP OSS)  * @mdo_get_rx_sa_stats: called when RX SA stats are read
319a73d8779SRadu Pirea (NXP OSS)  * @mdo_insert_tx_tag: called to insert the TX tag
320a73d8779SRadu Pirea (NXP OSS)  * @needed_headroom: number of bytes reserved at the beginning of the sk_buff
321a73d8779SRadu Pirea (NXP OSS)  *	for the TX tag
322a73d8779SRadu Pirea (NXP OSS)  * @needed_tailroom: number of bytes reserved at the end of the sk_buff for the
323a73d8779SRadu Pirea (NXP OSS)  *	TX tag
324475747a1SRahul Rameshbabu  * @rx_uses_md_dst: whether MACsec device offload supports sk_buff md_dst
3250830e20bSAntoine Tenart  */
3260830e20bSAntoine Tenart struct macsec_ops {
3270830e20bSAntoine Tenart 	/* Device wide */
3280830e20bSAntoine Tenart 	int (*mdo_dev_open)(struct macsec_context *ctx);
3290830e20bSAntoine Tenart 	int (*mdo_dev_stop)(struct macsec_context *ctx);
3300830e20bSAntoine Tenart 	/* SecY */
3310830e20bSAntoine Tenart 	int (*mdo_add_secy)(struct macsec_context *ctx);
3320830e20bSAntoine Tenart 	int (*mdo_upd_secy)(struct macsec_context *ctx);
3330830e20bSAntoine Tenart 	int (*mdo_del_secy)(struct macsec_context *ctx);
3340830e20bSAntoine Tenart 	/* Security channels */
3350830e20bSAntoine Tenart 	int (*mdo_add_rxsc)(struct macsec_context *ctx);
3360830e20bSAntoine Tenart 	int (*mdo_upd_rxsc)(struct macsec_context *ctx);
3370830e20bSAntoine Tenart 	int (*mdo_del_rxsc)(struct macsec_context *ctx);
3380830e20bSAntoine Tenart 	/* Security associations */
3390830e20bSAntoine Tenart 	int (*mdo_add_rxsa)(struct macsec_context *ctx);
3400830e20bSAntoine Tenart 	int (*mdo_upd_rxsa)(struct macsec_context *ctx);
3410830e20bSAntoine Tenart 	int (*mdo_del_rxsa)(struct macsec_context *ctx);
3420830e20bSAntoine Tenart 	int (*mdo_add_txsa)(struct macsec_context *ctx);
3430830e20bSAntoine Tenart 	int (*mdo_upd_txsa)(struct macsec_context *ctx);
3440830e20bSAntoine Tenart 	int (*mdo_del_txsa)(struct macsec_context *ctx);
345b62c3624SDmitry Bogdanov 	/* Statistics */
346b62c3624SDmitry Bogdanov 	int (*mdo_get_dev_stats)(struct macsec_context *ctx);
347b62c3624SDmitry Bogdanov 	int (*mdo_get_tx_sc_stats)(struct macsec_context *ctx);
348b62c3624SDmitry Bogdanov 	int (*mdo_get_tx_sa_stats)(struct macsec_context *ctx);
349b62c3624SDmitry Bogdanov 	int (*mdo_get_rx_sc_stats)(struct macsec_context *ctx);
350b62c3624SDmitry Bogdanov 	int (*mdo_get_rx_sa_stats)(struct macsec_context *ctx);
351a73d8779SRadu Pirea (NXP OSS) 	/* Offload tag */
352a73d8779SRadu Pirea (NXP OSS) 	int (*mdo_insert_tx_tag)(struct phy_device *phydev,
353a73d8779SRadu Pirea (NXP OSS) 				 struct sk_buff *skb);
354a73d8779SRadu Pirea (NXP OSS) 	unsigned int needed_headroom;
355a73d8779SRadu Pirea (NXP OSS) 	unsigned int needed_tailroom;
356475747a1SRahul Rameshbabu 	bool rx_uses_md_dst;
3570830e20bSAntoine Tenart };
3580830e20bSAntoine Tenart 
3595c937de7SAntoine Tenart void macsec_pn_wrapped(struct macsec_secy *secy, struct macsec_tx_sa *tx_sa);
macsec_send_sci(const struct macsec_secy * secy)360b1671253SLior Nahmanson static inline bool macsec_send_sci(const struct macsec_secy *secy)
361b1671253SLior Nahmanson {
362b1671253SLior Nahmanson 	const struct macsec_tx_sc *tx_sc = &secy->tx_sc;
363b1671253SLior Nahmanson 
364b1671253SLior Nahmanson 	return tx_sc->send_sci ||
365b1671253SLior Nahmanson 		(secy->n_rx_sc > 1 && !tx_sc->end_station && !tx_sc->scb);
366b1671253SLior Nahmanson }
367f132fdd9SPatrisious Haddad struct net_device *macsec_get_real_dev(const struct net_device *dev);
368f132fdd9SPatrisious Haddad bool macsec_netdev_is_offloaded(struct net_device *dev);
3695c937de7SAntoine Tenart 
macsec_netdev_priv(const struct net_device * dev)370bd9424efSSubbaraya Sundeep static inline void *macsec_netdev_priv(const struct net_device *dev)
371bd9424efSSubbaraya Sundeep {
372bd9424efSSubbaraya Sundeep #if IS_ENABLED(CONFIG_VLAN_8021Q)
373bd9424efSSubbaraya Sundeep 	if (is_vlan_dev(dev))
374bd9424efSSubbaraya Sundeep 		return netdev_priv(vlan_dev_priv(dev)->real_dev);
375bd9424efSSubbaraya Sundeep #endif
376bd9424efSSubbaraya Sundeep 	return netdev_priv(dev);
377bd9424efSSubbaraya Sundeep }
378bd9424efSSubbaraya Sundeep 
sci_to_cpu(sci_t sci)379b1c036e8SRadu Pirea (NXP OSS) static inline u64 sci_to_cpu(sci_t sci)
380b1c036e8SRadu Pirea (NXP OSS) {
381b1c036e8SRadu Pirea (NXP OSS) 	return be64_to_cpu((__force __be64)sci);
382b1c036e8SRadu Pirea (NXP OSS) }
383b1c036e8SRadu Pirea (NXP OSS) 
384c0e4eadfSAntoine Tenart #endif /* _NET_MACSEC_H_ */
385