xref: /dpdk/lib/net/rte_macsec.h (revision 515cd4a488b6a0c6e40d20e6b10d8e89657dc23f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2022 Marvell.
3  */
4 
5 #ifndef RTE_MACSEC_H
6 #define RTE_MACSEC_H
7 
8 /**
9  * @file
10  *
11  * MACsec-related defines
12  */
13 
14 #include <rte_byteorder.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 #define RTE_MACSEC_TCI_VER_MASK	0x80 /**< Version mask for MACsec. Should be 0. */
21 #define RTE_MACSEC_TCI_ES	0x40 /**< Mask for End station (ES) bit - SCI is not valid. */
22 #define RTE_MACSEC_TCI_SC	0x20 /**< Mask for SCI present bit. */
23 #define RTE_MACSEC_TCI_SCB	0x10 /**< Mask for EPON single copy broadcast bit. */
24 #define RTE_MACSEC_TCI_E	0x08 /**< Mask for encrypted user data bit. */
25 #define RTE_MACSEC_TCI_C	0x04 /**< Mask for changed user data bit (because of encryption). */
26 #define RTE_MACSEC_AN_MASK	0x03 /**< Association number mask in tci_an. */
27 
28 /**
29  * MACsec Header (SecTAG)
30  */
31 __extension__
32 struct rte_macsec_hdr {
33 	/**
34 	 * Tag control information and Association number of secure channel.
35 	 * Various bits of TCI and AN are masked using RTE_MACSEC_TCI_* and RTE_MACSEC_AN_MASK.
36 	 */
37 	uint8_t tci_an;
38 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
39 	uint8_t short_length:6; /**< Short Length. */
40 	uint8_t unused:2;
41 #elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN
42 	uint8_t unused:2;
43 	uint8_t short_length:6; /**< Short Length. */
44 #endif
45 	rte_be32_t packet_number; /**< Packet number to support replay protection. */
46 } __rte_packed;
47 
48 /** SCI length in MACsec header if present. */
49 #define RTE_MACSEC_SCI_LEN 8
50 
51 /**
52  * MACsec SCI header (8 bytes) after the MACsec header
53  * which is present if SC bit is set in tci_an.
54  */
55 struct rte_macsec_sci_hdr {
56 	uint8_t sci[RTE_MACSEC_SCI_LEN]; /**< Optional secure channel ID. */
57 } __rte_packed;
58 
59 #ifdef __cplusplus
60 }
61 #endif
62 
63 #endif /* RTE_MACSEC_H */
64