mirror of
https://github.com/torvalds/linux.git
synced 2024-12-21 02:21:36 +00:00
76564261a7
This patch introduces the macsec_context structure. It will be used in the kernel to exchange information between the common MACsec implementation (macsec.c) and the MACsec hardware offloading implementations. This structure contains pointers to MACsec specific structures which contain the actual MACsec configuration, and to the underlying device (phydev for now). Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com> Signed-off-by: David S. Miller <davem@davemloft.net>
199 lines
4.5 KiB
C
199 lines
4.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* MACsec netdev header, used for h/w accelerated implementations.
|
|
*
|
|
* Copyright (c) 2015 Sabrina Dubroca <sd@queasysnail.net>
|
|
*/
|
|
#ifndef _NET_MACSEC_H_
|
|
#define _NET_MACSEC_H_
|
|
|
|
#include <linux/u64_stats_sync.h>
|
|
#include <uapi/linux/if_link.h>
|
|
#include <uapi/linux/if_macsec.h>
|
|
|
|
typedef u64 __bitwise sci_t;
|
|
|
|
#define MACSEC_NUM_AN 4 /* 2 bits for the association number */
|
|
|
|
/**
|
|
* struct macsec_key - SA key
|
|
* @id: user-provided key identifier
|
|
* @tfm: crypto struct, key storage
|
|
*/
|
|
struct macsec_key {
|
|
u8 id[MACSEC_KEYID_LEN];
|
|
struct crypto_aead *tfm;
|
|
};
|
|
|
|
struct macsec_rx_sc_stats {
|
|
__u64 InOctetsValidated;
|
|
__u64 InOctetsDecrypted;
|
|
__u64 InPktsUnchecked;
|
|
__u64 InPktsDelayed;
|
|
__u64 InPktsOK;
|
|
__u64 InPktsInvalid;
|
|
__u64 InPktsLate;
|
|
__u64 InPktsNotValid;
|
|
__u64 InPktsNotUsingSA;
|
|
__u64 InPktsUnusedSA;
|
|
};
|
|
|
|
struct macsec_rx_sa_stats {
|
|
__u32 InPktsOK;
|
|
__u32 InPktsInvalid;
|
|
__u32 InPktsNotValid;
|
|
__u32 InPktsNotUsingSA;
|
|
__u32 InPktsUnusedSA;
|
|
};
|
|
|
|
struct macsec_tx_sa_stats {
|
|
__u32 OutPktsProtected;
|
|
__u32 OutPktsEncrypted;
|
|
};
|
|
|
|
struct macsec_tx_sc_stats {
|
|
__u64 OutPktsProtected;
|
|
__u64 OutPktsEncrypted;
|
|
__u64 OutOctetsProtected;
|
|
__u64 OutOctetsEncrypted;
|
|
};
|
|
|
|
/**
|
|
* struct macsec_rx_sa - receive secure association
|
|
* @active:
|
|
* @next_pn: packet number expected for the next packet
|
|
* @lock: protects next_pn manipulations
|
|
* @key: key structure
|
|
* @stats: per-SA stats
|
|
*/
|
|
struct macsec_rx_sa {
|
|
struct macsec_key key;
|
|
spinlock_t lock;
|
|
u32 next_pn;
|
|
refcount_t refcnt;
|
|
bool active;
|
|
struct macsec_rx_sa_stats __percpu *stats;
|
|
struct macsec_rx_sc *sc;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
struct pcpu_rx_sc_stats {
|
|
struct macsec_rx_sc_stats stats;
|
|
struct u64_stats_sync syncp;
|
|
};
|
|
|
|
struct pcpu_tx_sc_stats {
|
|
struct macsec_tx_sc_stats stats;
|
|
struct u64_stats_sync syncp;
|
|
};
|
|
|
|
/**
|
|
* struct macsec_rx_sc - receive secure channel
|
|
* @sci: secure channel identifier for this SC
|
|
* @active: channel is active
|
|
* @sa: array of secure associations
|
|
* @stats: per-SC stats
|
|
*/
|
|
struct macsec_rx_sc {
|
|
struct macsec_rx_sc __rcu *next;
|
|
sci_t sci;
|
|
bool active;
|
|
struct macsec_rx_sa __rcu *sa[MACSEC_NUM_AN];
|
|
struct pcpu_rx_sc_stats __percpu *stats;
|
|
refcount_t refcnt;
|
|
struct rcu_head rcu_head;
|
|
};
|
|
|
|
/**
|
|
* struct macsec_tx_sa - transmit secure association
|
|
* @active:
|
|
* @next_pn: packet number to use for the next packet
|
|
* @lock: protects next_pn manipulations
|
|
* @key: key structure
|
|
* @stats: per-SA stats
|
|
*/
|
|
struct macsec_tx_sa {
|
|
struct macsec_key key;
|
|
spinlock_t lock;
|
|
u32 next_pn;
|
|
refcount_t refcnt;
|
|
bool active;
|
|
struct macsec_tx_sa_stats __percpu *stats;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
/**
|
|
* struct macsec_tx_sc - transmit secure channel
|
|
* @active:
|
|
* @encoding_sa: association number of the SA currently in use
|
|
* @encrypt: encrypt packets on transmit, or authenticate only
|
|
* @send_sci: always include the SCI in the SecTAG
|
|
* @end_station:
|
|
* @scb: single copy broadcast flag
|
|
* @sa: array of secure associations
|
|
* @stats: stats for this TXSC
|
|
*/
|
|
struct macsec_tx_sc {
|
|
bool active;
|
|
u8 encoding_sa;
|
|
bool encrypt;
|
|
bool send_sci;
|
|
bool end_station;
|
|
bool scb;
|
|
struct macsec_tx_sa __rcu *sa[MACSEC_NUM_AN];
|
|
struct pcpu_tx_sc_stats __percpu *stats;
|
|
};
|
|
|
|
/**
|
|
* struct macsec_secy - MACsec Security Entity
|
|
* @netdev: netdevice for this SecY
|
|
* @n_rx_sc: number of receive secure channels configured on this SecY
|
|
* @sci: secure channel identifier used for tx
|
|
* @key_len: length of keys used by the cipher suite
|
|
* @icv_len: length of ICV used by the cipher suite
|
|
* @validate_frames: validation mode
|
|
* @operational: MAC_Operational flag
|
|
* @protect_frames: enable protection for this SecY
|
|
* @replay_protect: enable packet number checks on receive
|
|
* @replay_window: size of the replay window
|
|
* @tx_sc: transmit secure channel
|
|
* @rx_sc: linked list of receive secure channels
|
|
*/
|
|
struct macsec_secy {
|
|
struct net_device *netdev;
|
|
unsigned int n_rx_sc;
|
|
sci_t sci;
|
|
u16 key_len;
|
|
u16 icv_len;
|
|
enum macsec_validation_type validate_frames;
|
|
bool operational;
|
|
bool protect_frames;
|
|
bool replay_protect;
|
|
u32 replay_window;
|
|
struct macsec_tx_sc tx_sc;
|
|
struct macsec_rx_sc __rcu *rx_sc;
|
|
};
|
|
|
|
/**
|
|
* struct macsec_context - MACsec context for hardware offloading
|
|
*/
|
|
struct macsec_context {
|
|
struct phy_device *phydev;
|
|
enum macsec_offload offload;
|
|
|
|
struct macsec_secy *secy;
|
|
struct macsec_rx_sc *rx_sc;
|
|
struct {
|
|
unsigned char assoc_num;
|
|
u8 key[MACSEC_KEYID_LEN];
|
|
union {
|
|
struct macsec_rx_sa *rx_sa;
|
|
struct macsec_tx_sa *tx_sa;
|
|
};
|
|
} sa;
|
|
|
|
u8 prepare:1;
|
|
};
|
|
|
|
#endif /* _NET_MACSEC_H_ */
|