linux/include/net/macsec.h
<<
>>
Prefs
   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
  20typedef u64 __bitwise sci_t;
  21typedef u32 __bitwise ssci_t;
  22
  23typedef union salt {
  24        struct {
  25                u32 ssci;
  26                u64 pn;
  27        } __packed;
  28        u8 bytes[MACSEC_SALT_LEN];
  29} __packed salt_t;
  30
  31typedef 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 */
  52struct macsec_key {
  53        u8 id[MACSEC_KEYID_LEN];
  54        struct crypto_aead *tfm;
  55        salt_t salt;
  56};
  57
  58struct 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
  71struct macsec_rx_sa_stats {
  72        __u32 InPktsOK;
  73        __u32 InPktsInvalid;
  74        __u32 InPktsNotValid;
  75        __u32 InPktsNotUsingSA;
  76        __u32 InPktsUnusedSA;
  77};
  78
  79struct macsec_tx_sa_stats {
  80        __u32 OutPktsProtected;
  81        __u32 OutPktsEncrypted;
  82};
  83
  84struct macsec_tx_sc_stats {
  85        __u64 OutPktsProtected;
  86        __u64 OutPktsEncrypted;
  87        __u64 OutOctetsProtected;
  88        __u64 OutOctetsEncrypted;
  89};
  90
  91struct 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 */
 111struct 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
 126struct pcpu_rx_sc_stats {
 127        struct macsec_rx_sc_stats stats;
 128        struct u64_stats_sync syncp;
 129};
 130
 131struct 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 */
 143struct 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 */
 162struct 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 */
 187struct 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 */
 214struct 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 */
 233struct 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 */
 264struct 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
 291void macsec_pn_wrapped(struct macsec_secy *secy, struct macsec_tx_sa *tx_sa);
 292
 293#endif /* _NET_MACSEC_H_ */
 294