xref: /dpdk/lib/net/rte_l2tpv2.h (revision fba9875559906e04eaeb74532f4cfd51194259a2)
13a929df1SJie Wang /* SPDX-License-Identifier: BSD-3-Clause
23a929df1SJie Wang  * Copyright(c) 2021 Intel Corporation.
33a929df1SJie Wang  */
43a929df1SJie Wang 
53a929df1SJie Wang #ifndef _RTE_L2TPV2_H_
63a929df1SJie Wang #define _RTE_L2TPV2_H_
73a929df1SJie Wang 
83a929df1SJie Wang /**
93a929df1SJie Wang  * @file
103a929df1SJie Wang  *
113a929df1SJie Wang  * L2TP header:
123a929df1SJie Wang  *
133a929df1SJie Wang  * `-0--------------------1----------------2-------------------3`
143a929df1SJie Wang  *
153a929df1SJie Wang  * `-0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1`
163a929df1SJie Wang  *
173a929df1SJie Wang  * `+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+`
183a929df1SJie Wang  *
193a929df1SJie Wang  * `|T|L|x|x|S|x|O|P|x|x|x|x|--Ver--|-----------Length (opt)--------|`
203a929df1SJie Wang  *
213a929df1SJie Wang  * `+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+`
223a929df1SJie Wang  *
233a929df1SJie Wang  * `|-----------Tunnel ID-----------|-----------Session ID----------|`
243a929df1SJie Wang  *
253a929df1SJie Wang  * `+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+`
263a929df1SJie Wang  *
273a929df1SJie Wang  * `|-----------Ns (opt)------------|-----------Nr (opt)------------|`
283a929df1SJie Wang  *
293a929df1SJie Wang  * `+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+`
303a929df1SJie Wang  *
313a929df1SJie Wang  * `|---------Offset Size (opt)-----|---------Offset pad... (opt)`
323a929df1SJie Wang  *
333a929df1SJie Wang  * `+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+`
343a929df1SJie Wang  *
353a929df1SJie Wang  * The Type (T) bit indicates the type of message. It is set to 0 for a data
363a929df1SJie Wang  * message and 1 for a control message.
373a929df1SJie Wang  *
383a929df1SJie Wang  * If the Length (L) bit is 1, the Length field is present. This bit MUST be
393a929df1SJie Wang  * set to 1 for control messages.
403a929df1SJie Wang  *
413a929df1SJie Wang  * The x bits are reserved for future extensions. All reserved bits MUST
423a929df1SJie Wang  * be set to 0 on outgoing messages and ignored on incoming messages.
433a929df1SJie Wang  *
443a929df1SJie Wang  * If the Sequence (S) bit is set to 1 the Ns and Nr fields are present.
453a929df1SJie Wang  * The S bit MUST be set to 1 for control messages.
463a929df1SJie Wang  *
473a929df1SJie Wang  * If the Offset (O) bit is 1, the Offset Size field is present. The O
483a929df1SJie Wang  * bit MUST be set to 0 for control messages.
493a929df1SJie Wang  *
503a929df1SJie Wang  * If the Priority (P) bit is 1, this data message should receive
513a929df1SJie Wang  * preferential treatment in its local queuing and transmission.
523a929df1SJie Wang  * The P bit MUST be set to 0 for control messages.
533a929df1SJie Wang  *
543a929df1SJie Wang  * Ver MUST be 2, indicating the version of the L2TP data message header.
553a929df1SJie Wang  *
563a929df1SJie Wang  * The Length field indicates the total length of the message in octets.
573a929df1SJie Wang  *
583a929df1SJie Wang  * Tunnel ID indicates the identifier for the control connection.
593a929df1SJie Wang  *
603a929df1SJie Wang  * Session ID indicates the identifier for a session within a tunnel.
613a929df1SJie Wang  *
623a929df1SJie Wang  * Ns indicates the sequence number for this data or control message.
633a929df1SJie Wang  *
643a929df1SJie Wang  * Nr indicates the sequence number expected in the next control message
653a929df1SJie Wang  * to be received.
663a929df1SJie Wang  *
673a929df1SJie Wang  * The Offset Size field, if present, specifies the number of octets
683a929df1SJie Wang  * past the L2TP header at which the payload data is expected to start.
693a929df1SJie Wang  * Actual data within the offset padding is undefined. If the offset
703a929df1SJie Wang  * field is present, the L2TP header ends after the last octet of the
713a929df1SJie Wang  * offset padding.
723a929df1SJie Wang  */
733a929df1SJie Wang 
743a929df1SJie Wang #include <stdint.h>
753a929df1SJie Wang #include <rte_byteorder.h>
763a929df1SJie Wang 
77988cd040SJie Wang /*
78988cd040SJie Wang  * L2TPv2 Message Type
79988cd040SJie Wang  */
80988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_CONTROL	0xC802
81988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA	0x0002
82988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_L	0x4002
83988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_S	0x0802
84988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_O	0x0202
85988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_L_S	0x4802
86988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_L_O	0x4202
87988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_S_O	0x0A02
88988cd040SJie Wang #define RTE_L2TPV2_MSG_TYPE_DATA_L_S_O	0x4A02
89988cd040SJie Wang 
903a929df1SJie Wang /**
913a929df1SJie Wang  * L2TPv2 Common Header
923a929df1SJie Wang  */
933a929df1SJie Wang struct rte_l2tpv2_common_hdr {
943a929df1SJie Wang 	union {
953a929df1SJie Wang 		/** header flags and protocol version */
963a929df1SJie Wang 		rte_be16_t flags_version;
97e0d3a74dSDavid Marchand 		__extension__
983a929df1SJie Wang 		struct {
993a929df1SJie Wang #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
100e7c727c3SDavid Marchand 			uint16_t ver:4;		/**< protocol version */
1019747f695SJie Wang 			uint16_t res3:4;	/**< reserved */
1029747f695SJie Wang 			uint16_t p:1;		/**< priority option bit */
1039747f695SJie Wang 			uint16_t o:1;		/**< offset option bit */
1049747f695SJie Wang 			uint16_t res2:1;	/**< reserved */
1059747f695SJie Wang 			uint16_t s:1;		/**< ns/nr option bit */
1069747f695SJie Wang 			uint16_t res1:2;	/**< reserved */
1079747f695SJie Wang 			uint16_t l:1;		/**< length option bit */
1089747f695SJie Wang 			uint16_t t:1;		/**< message Type */
1093a929df1SJie Wang #elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN
110e7c727c3SDavid Marchand 			uint16_t t:1;		/**< message Type */
1119747f695SJie Wang 			uint16_t l:1;		/**< length option bit */
1129747f695SJie Wang 			uint16_t res1:2;	/**< reserved */
1139747f695SJie Wang 			uint16_t s:1;		/**< ns/nr option bit */
1149747f695SJie Wang 			uint16_t res2:1;	/**< reserved */
1159747f695SJie Wang 			uint16_t o:1;		/**< offset option bit */
1169747f695SJie Wang 			uint16_t p:1;		/**< priority option bit */
1179747f695SJie Wang 			uint16_t res3:4;	/**< reserved */
1189747f695SJie Wang 			uint16_t ver:4;		/**< protocol version */
1193a929df1SJie Wang #endif
1203a929df1SJie Wang 		};
1213a929df1SJie Wang 	};
1223a929df1SJie Wang };
1233a929df1SJie Wang 
1243a929df1SJie Wang /**
1253a929df1SJie Wang  * L2TPv2 message Header contains all options(length, ns, nr,
1263a929df1SJie Wang  * offset size, offset padding).
1273a929df1SJie Wang  */
128*fba98755SAndre Muezerie struct __rte_packed_begin rte_l2tpv2_msg_with_all_options {
1293a929df1SJie Wang 	rte_be16_t length;		/**< length(16) */
1303a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
1313a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
1323a929df1SJie Wang 	rte_be16_t ns;			/**< Ns(16) */
1333a929df1SJie Wang 	rte_be16_t nr;			/**< Nr(16) */
1343a929df1SJie Wang 	rte_be16_t offset_size;		/**< offset size(16) */
1353a929df1SJie Wang 	uint8_t   *offset_padding;	/**< offset padding(variable length) */
136*fba98755SAndre Muezerie } __rte_packed_end;
1373a929df1SJie Wang 
1383a929df1SJie Wang /**
1393a929df1SJie Wang  * L2TPv2 message Header contains all options except length(ns, nr,
1403a929df1SJie Wang  * offset size, offset padding).
1413a929df1SJie Wang  */
142*fba98755SAndre Muezerie struct __rte_packed_begin rte_l2tpv2_msg_without_length {
1433a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
1443a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
1453a929df1SJie Wang 	rte_be16_t ns;			/**< Ns(16) */
1463a929df1SJie Wang 	rte_be16_t nr;			/**< Nr(16) */
1473a929df1SJie Wang 	rte_be16_t offset_size;		/**< offset size(16) */
1483a929df1SJie Wang 	uint8_t   *offset_padding;	/**< offset padding(variable length) */
149*fba98755SAndre Muezerie } __rte_packed_end;
1503a929df1SJie Wang 
1513a929df1SJie Wang /**
1523a929df1SJie Wang  * L2TPv2 message Header contains all options except ns_nr(length,
1533a929df1SJie Wang  * offset size, offset padding).
1547be78d02SJosh Soref  * Ns and Nr MUST be together.
1553a929df1SJie Wang  */
1563a929df1SJie Wang struct rte_l2tpv2_msg_without_ns_nr {
1573a929df1SJie Wang 	rte_be16_t length;		/**< length(16) */
1583a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
1593a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
1603a929df1SJie Wang 	rte_be16_t offset_size;		/**< offset size(16) */
1613a929df1SJie Wang 	uint8_t   *offset_padding;	/**< offset padding(variable length) */
1623a929df1SJie Wang };
1633a929df1SJie Wang 
1643a929df1SJie Wang /**
1653a929df1SJie Wang  * L2TPv2 message Header contains all options except ns_nr(length, ns, nr).
1667be78d02SJosh Soref  * offset size and offset padding MUST be together.
1673a929df1SJie Wang  */
1683a929df1SJie Wang struct rte_l2tpv2_msg_without_offset {
1693a929df1SJie Wang 	rte_be16_t length;		/**< length(16) */
1703a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
1713a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
1723a929df1SJie Wang 	rte_be16_t ns;			/**< Ns(16) */
1733a929df1SJie Wang 	rte_be16_t nr;			/**< Nr(16) */
1743a929df1SJie Wang };
1753a929df1SJie Wang 
1763a929df1SJie Wang /**
1773a929df1SJie Wang  * L2TPv2 message Header contains options offset size and offset padding.
1783a929df1SJie Wang  */
179*fba98755SAndre Muezerie struct __rte_packed_begin rte_l2tpv2_msg_with_offset {
1803a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
1813a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
1823a929df1SJie Wang 	rte_be16_t offset_size;		/**< offset size(16) */
1833a929df1SJie Wang 	uint8_t   *offset_padding;	/**< offset padding(variable length) */
184*fba98755SAndre Muezerie } __rte_packed_end;
1853a929df1SJie Wang 
1863a929df1SJie Wang /**
1873a929df1SJie Wang  * L2TPv2 message Header contains options ns and nr.
1883a929df1SJie Wang  */
1893a929df1SJie Wang struct rte_l2tpv2_msg_with_ns_nr {
1903a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
1913a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
1923a929df1SJie Wang 	rte_be16_t ns;			/**< Ns(16) */
1933a929df1SJie Wang 	rte_be16_t nr;			/**< Nr(16) */
1943a929df1SJie Wang };
1953a929df1SJie Wang 
1963a929df1SJie Wang /**
1973a929df1SJie Wang  * L2TPv2 message Header contains option length.
1983a929df1SJie Wang  */
1993a929df1SJie Wang struct rte_l2tpv2_msg_with_length {
2003a929df1SJie Wang 	rte_be16_t length;		/**< length(16) */
2013a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
2023a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
2033a929df1SJie Wang };
2043a929df1SJie Wang 
2053a929df1SJie Wang /**
2063a929df1SJie Wang  * L2TPv2 message Header without all options.
2073a929df1SJie Wang  */
2083a929df1SJie Wang struct rte_l2tpv2_msg_without_all_options {
2093a929df1SJie Wang 	rte_be16_t tunnel_id;		/**< tunnel ID(16) */
2103a929df1SJie Wang 	rte_be16_t session_id;		/**< session ID(16) */
2113a929df1SJie Wang };
2123a929df1SJie Wang 
2133a929df1SJie Wang /**
2143a929df1SJie Wang  * L2TPv2 Combined Message Header Format: Common Header + Options
2153a929df1SJie Wang  */
216*fba98755SAndre Muezerie struct __rte_packed_begin rte_l2tpv2_combined_msg_hdr {
2173a929df1SJie Wang 	struct rte_l2tpv2_common_hdr common; /**< common header */
2183a929df1SJie Wang 	union {
2193a929df1SJie Wang 		/** header with all options */
2203a929df1SJie Wang 		struct rte_l2tpv2_msg_with_all_options type0;
2213a929df1SJie Wang 		/** header with all options except length */
2223a929df1SJie Wang 		struct rte_l2tpv2_msg_without_length type1;
2233a929df1SJie Wang 		/** header with all options except ns/nr */
2243a929df1SJie Wang 		struct rte_l2tpv2_msg_without_ns_nr type2;
2253a929df1SJie Wang 		/** header with all options except offset */
2263a929df1SJie Wang 		struct rte_l2tpv2_msg_without_offset type3;
2273a929df1SJie Wang 		/** header with offset options */
2283a929df1SJie Wang 		struct rte_l2tpv2_msg_with_offset type4;
2293a929df1SJie Wang 		/** header with ns/nr options */
2303a929df1SJie Wang 		struct rte_l2tpv2_msg_with_ns_nr type5;
2313a929df1SJie Wang 		/** header with length option */
2323a929df1SJie Wang 		struct rte_l2tpv2_msg_with_length type6;
2333a929df1SJie Wang 		/** header without all options */
2343a929df1SJie Wang 		struct rte_l2tpv2_msg_without_all_options type7;
2353a929df1SJie Wang 	};
236*fba98755SAndre Muezerie } __rte_packed_end;
2373a929df1SJie Wang 
2383a929df1SJie Wang #endif /* _RTE_L2TPV2_H_ */
239