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