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 Nahmansonstatic 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 Sundeepstatic 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