16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2607ca46eSDavid Howells /* 3607ca46eSDavid Howells * L2TP-over-IP socket for L2TPv3. 4607ca46eSDavid Howells * 5607ca46eSDavid Howells * Author: James Chapman <jchapman@katalix.com> 6607ca46eSDavid Howells */ 7607ca46eSDavid Howells 8607ca46eSDavid Howells #ifndef _UAPI_LINUX_L2TP_H_ 9607ca46eSDavid Howells #define _UAPI_LINUX_L2TP_H_ 10607ca46eSDavid Howells 11607ca46eSDavid Howells #include <linux/types.h> 12607ca46eSDavid Howells #include <linux/socket.h> 13a725eb15SDmitry V. Levin #include <linux/in.h> 14a725eb15SDmitry V. Levin #include <linux/in6.h> 15607ca46eSDavid Howells 16607ca46eSDavid Howells /** 17607ca46eSDavid Howells * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets 18607ca46eSDavid Howells * @l2tp_family: address family number AF_L2TPIP. 19607ca46eSDavid Howells * @l2tp_addr: protocol specific address information 20607ca46eSDavid Howells * @l2tp_conn_id: connection id of tunnel 21607ca46eSDavid Howells */ 22607ca46eSDavid Howells #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ 23607ca46eSDavid Howells struct sockaddr_l2tpip { 24607ca46eSDavid Howells /* The first fields must match struct sockaddr_in */ 25607ca46eSDavid Howells __kernel_sa_family_t l2tp_family; /* AF_INET */ 26607ca46eSDavid Howells __be16 l2tp_unused; /* INET port number (unused) */ 27607ca46eSDavid Howells struct in_addr l2tp_addr; /* Internet address */ 28607ca46eSDavid Howells 29607ca46eSDavid Howells __u32 l2tp_conn_id; /* Connection ID of tunnel */ 30607ca46eSDavid Howells 31607ca46eSDavid Howells /* Pad to size of `struct sockaddr'. */ 32a725eb15SDmitry V. Levin unsigned char __pad[__SOCK_SIZE__ - 33607ca46eSDavid Howells sizeof(__kernel_sa_family_t) - 34607ca46eSDavid Howells sizeof(__be16) - sizeof(struct in_addr) - 35607ca46eSDavid Howells sizeof(__u32)]; 36607ca46eSDavid Howells }; 37607ca46eSDavid Howells 38607ca46eSDavid Howells /** 39607ca46eSDavid Howells * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets 40607ca46eSDavid Howells * @l2tp_family: address family number AF_L2TPIP. 41607ca46eSDavid Howells * @l2tp_addr: protocol specific address information 42607ca46eSDavid Howells * @l2tp_conn_id: connection id of tunnel 43607ca46eSDavid Howells */ 44607ca46eSDavid Howells struct sockaddr_l2tpip6 { 45607ca46eSDavid Howells /* The first fields must match struct sockaddr_in6 */ 46607ca46eSDavid Howells __kernel_sa_family_t l2tp_family; /* AF_INET6 */ 47607ca46eSDavid Howells __be16 l2tp_unused; /* INET port number (unused) */ 48607ca46eSDavid Howells __be32 l2tp_flowinfo; /* IPv6 flow information */ 49607ca46eSDavid Howells struct in6_addr l2tp_addr; /* IPv6 address */ 50607ca46eSDavid Howells __u32 l2tp_scope_id; /* scope id (new in RFC2553) */ 51607ca46eSDavid Howells __u32 l2tp_conn_id; /* Connection ID of tunnel */ 52607ca46eSDavid Howells }; 53607ca46eSDavid Howells 54607ca46eSDavid Howells /***************************************************************************** 55607ca46eSDavid Howells * NETLINK_GENERIC netlink family. 56607ca46eSDavid Howells *****************************************************************************/ 57607ca46eSDavid Howells 58607ca46eSDavid Howells /* 59607ca46eSDavid Howells * Commands. 60607ca46eSDavid Howells * Valid TLVs of each command are:- 61ae51a7c6SGuillaume Nault * TUNNEL_CREATE - CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum 62607ca46eSDavid Howells * TUNNEL_DELETE - CONN_ID 63607ca46eSDavid Howells * TUNNEL_MODIFY - CONN_ID, udpcsum 64607ca46eSDavid Howells * TUNNEL_GETSTATS - CONN_ID, (stats) 65607ca46eSDavid Howells * TUNNEL_GET - CONN_ID, (...) 663ae5536bSGuillaume Nault * SESSION_CREATE - SESSION_ID, PW_TYPE, cookie, peer_cookie, l2spec 67607ca46eSDavid Howells * SESSION_DELETE - SESSION_ID 683ae5536bSGuillaume Nault * SESSION_MODIFY - SESSION_ID 69607ca46eSDavid Howells * SESSION_GET - SESSION_ID, (...) 70607ca46eSDavid Howells * SESSION_GETSTATS - SESSION_ID, (stats) 71607ca46eSDavid Howells * 72607ca46eSDavid Howells */ 73607ca46eSDavid Howells enum { 74607ca46eSDavid Howells L2TP_CMD_NOOP, 75607ca46eSDavid Howells L2TP_CMD_TUNNEL_CREATE, 76607ca46eSDavid Howells L2TP_CMD_TUNNEL_DELETE, 77607ca46eSDavid Howells L2TP_CMD_TUNNEL_MODIFY, 78607ca46eSDavid Howells L2TP_CMD_TUNNEL_GET, 79607ca46eSDavid Howells L2TP_CMD_SESSION_CREATE, 80607ca46eSDavid Howells L2TP_CMD_SESSION_DELETE, 81607ca46eSDavid Howells L2TP_CMD_SESSION_MODIFY, 82607ca46eSDavid Howells L2TP_CMD_SESSION_GET, 83607ca46eSDavid Howells __L2TP_CMD_MAX, 84607ca46eSDavid Howells }; 85607ca46eSDavid Howells 86607ca46eSDavid Howells #define L2TP_CMD_MAX (__L2TP_CMD_MAX - 1) 87607ca46eSDavid Howells 88607ca46eSDavid Howells /* 89607ca46eSDavid Howells * ATTR types defined for L2TP 90607ca46eSDavid Howells */ 91607ca46eSDavid Howells enum { 92607ca46eSDavid Howells L2TP_ATTR_NONE, /* no data */ 93607ca46eSDavid Howells L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ 94607ca46eSDavid Howells L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ 954887d893SJames Chapman L2TP_ATTR_OFFSET, /* u16 (not used) */ 963ae5536bSGuillaume Nault L2TP_ATTR_DATA_SEQ, /* u16 (not used) */ 97607ca46eSDavid Howells L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ 984db5a802SLorenzo Bianconi L2TP_ATTR_L2SPEC_LEN, /* u8 (not used) */ 99607ca46eSDavid Howells L2TP_ATTR_PROTO_VERSION, /* u8 */ 100607ca46eSDavid Howells L2TP_ATTR_IFNAME, /* string */ 101607ca46eSDavid Howells L2TP_ATTR_CONN_ID, /* u32 */ 102607ca46eSDavid Howells L2TP_ATTR_PEER_CONN_ID, /* u32 */ 103607ca46eSDavid Howells L2TP_ATTR_SESSION_ID, /* u32 */ 104607ca46eSDavid Howells L2TP_ATTR_PEER_SESSION_ID, /* u32 */ 105607ca46eSDavid Howells L2TP_ATTR_UDP_CSUM, /* u8 */ 106ae51a7c6SGuillaume Nault L2TP_ATTR_VLAN_ID, /* u16 (not used) */ 107607ca46eSDavid Howells L2TP_ATTR_COOKIE, /* 0, 4 or 8 bytes */ 108607ca46eSDavid Howells L2TP_ATTR_PEER_COOKIE, /* 0, 4 or 8 bytes */ 109eee049c0STom Parkin L2TP_ATTR_DEBUG, /* u32, enum l2tp_debug_flags (not used) */ 110607ca46eSDavid Howells L2TP_ATTR_RECV_SEQ, /* u8 */ 111607ca46eSDavid Howells L2TP_ATTR_SEND_SEQ, /* u8 */ 112607ca46eSDavid Howells L2TP_ATTR_LNS_MODE, /* u8 */ 113607ca46eSDavid Howells L2TP_ATTR_USING_IPSEC, /* u8 */ 114607ca46eSDavid Howells L2TP_ATTR_RECV_TIMEOUT, /* msec */ 115607ca46eSDavid Howells L2TP_ATTR_FD, /* int */ 116607ca46eSDavid Howells L2TP_ATTR_IP_SADDR, /* u32 */ 117607ca46eSDavid Howells L2TP_ATTR_IP_DADDR, /* u32 */ 118607ca46eSDavid Howells L2TP_ATTR_UDP_SPORT, /* u16 */ 119607ca46eSDavid Howells L2TP_ATTR_UDP_DPORT, /* u16 */ 120e9697e2eSGuillaume Nault L2TP_ATTR_MTU, /* u16 (not used) */ 12192ea4a7eSGuillaume Nault L2TP_ATTR_MRU, /* u16 (not used) */ 122607ca46eSDavid Howells L2TP_ATTR_STATS, /* nested */ 123607ca46eSDavid Howells L2TP_ATTR_IP6_SADDR, /* struct in6_addr */ 124607ca46eSDavid Howells L2TP_ATTR_IP6_DADDR, /* struct in6_addr */ 1253f11ec04SAsbjørn Sloth Tønnesen L2TP_ATTR_UDP_ZERO_CSUM6_TX, /* flag */ 1263f11ec04SAsbjørn Sloth Tønnesen L2TP_ATTR_UDP_ZERO_CSUM6_RX, /* flag */ 1272175d87cSNicolas Dichtel L2TP_ATTR_PAD, 128607ca46eSDavid Howells __L2TP_ATTR_MAX, 129607ca46eSDavid Howells }; 130607ca46eSDavid Howells 131607ca46eSDavid Howells #define L2TP_ATTR_MAX (__L2TP_ATTR_MAX - 1) 132607ca46eSDavid Howells 133607ca46eSDavid Howells /* Nested in L2TP_ATTR_STATS */ 134607ca46eSDavid Howells enum { 135607ca46eSDavid Howells L2TP_ATTR_STATS_NONE, /* no data */ 136607ca46eSDavid Howells L2TP_ATTR_TX_PACKETS, /* u64 */ 137607ca46eSDavid Howells L2TP_ATTR_TX_BYTES, /* u64 */ 138607ca46eSDavid Howells L2TP_ATTR_TX_ERRORS, /* u64 */ 139607ca46eSDavid Howells L2TP_ATTR_RX_PACKETS, /* u64 */ 140607ca46eSDavid Howells L2TP_ATTR_RX_BYTES, /* u64 */ 141607ca46eSDavid Howells L2TP_ATTR_RX_SEQ_DISCARDS, /* u64 */ 142607ca46eSDavid Howells L2TP_ATTR_RX_OOS_PACKETS, /* u64 */ 143607ca46eSDavid Howells L2TP_ATTR_RX_ERRORS, /* u64 */ 1441c714a92SNicolas Dichtel L2TP_ATTR_STATS_PAD, 1453f47cb4cSTom Parkin L2TP_ATTR_RX_COOKIE_DISCARDS, /* u64 */ 146*3e59e885SMatthias Schiffer L2TP_ATTR_RX_INVALID, /* u64 */ 147607ca46eSDavid Howells __L2TP_ATTR_STATS_MAX, 148607ca46eSDavid Howells }; 149607ca46eSDavid Howells 150607ca46eSDavid Howells #define L2TP_ATTR_STATS_MAX (__L2TP_ATTR_STATS_MAX - 1) 151607ca46eSDavid Howells 152607ca46eSDavid Howells enum l2tp_pwtype { 153607ca46eSDavid Howells L2TP_PWTYPE_NONE = 0x0000, 154607ca46eSDavid Howells L2TP_PWTYPE_ETH_VLAN = 0x0004, 155607ca46eSDavid Howells L2TP_PWTYPE_ETH = 0x0005, 156607ca46eSDavid Howells L2TP_PWTYPE_PPP = 0x0007, 157607ca46eSDavid Howells L2TP_PWTYPE_PPP_AC = 0x0008, 158607ca46eSDavid Howells L2TP_PWTYPE_IP = 0x000b, 159607ca46eSDavid Howells __L2TP_PWTYPE_MAX 160607ca46eSDavid Howells }; 161607ca46eSDavid Howells 162607ca46eSDavid Howells enum l2tp_l2spec_type { 163607ca46eSDavid Howells L2TP_L2SPECTYPE_NONE, 164607ca46eSDavid Howells L2TP_L2SPECTYPE_DEFAULT, 165607ca46eSDavid Howells }; 166607ca46eSDavid Howells 167607ca46eSDavid Howells enum l2tp_encap_type { 168607ca46eSDavid Howells L2TP_ENCAPTYPE_UDP, 169607ca46eSDavid Howells L2TP_ENCAPTYPE_IP, 170607ca46eSDavid Howells }; 171607ca46eSDavid Howells 1723ae5536bSGuillaume Nault /* For L2TP_ATTR_DATA_SEQ. Unused. */ 173607ca46eSDavid Howells enum l2tp_seqmode { 174607ca46eSDavid Howells L2TP_SEQ_NONE = 0, 175607ca46eSDavid Howells L2TP_SEQ_IP = 1, 176607ca46eSDavid Howells L2TP_SEQ_ALL = 2, 177607ca46eSDavid Howells }; 178607ca46eSDavid Howells 17941c43fbeSAsbjørn Sloth Tønnesen /** 180eee049c0STom Parkin * enum l2tp_debug_flags - debug message categories for L2TP tunnels/sessions. 181eee049c0STom Parkin * 182eee049c0STom Parkin * Unused. 18341c43fbeSAsbjørn Sloth Tønnesen * 18441c43fbeSAsbjørn Sloth Tønnesen * @L2TP_MSG_DEBUG: verbose debug (if compiled in) 18541c43fbeSAsbjørn Sloth Tønnesen * @L2TP_MSG_CONTROL: userspace - kernel interface 18641c43fbeSAsbjørn Sloth Tønnesen * @L2TP_MSG_SEQ: sequence numbers 18741c43fbeSAsbjørn Sloth Tønnesen * @L2TP_MSG_DATA: data packets 18841c43fbeSAsbjørn Sloth Tønnesen */ 18941c43fbeSAsbjørn Sloth Tønnesen enum l2tp_debug_flags { 19041c43fbeSAsbjørn Sloth Tønnesen L2TP_MSG_DEBUG = (1 << 0), 19141c43fbeSAsbjørn Sloth Tønnesen L2TP_MSG_CONTROL = (1 << 1), 19241c43fbeSAsbjørn Sloth Tønnesen L2TP_MSG_SEQ = (1 << 2), 19341c43fbeSAsbjørn Sloth Tønnesen L2TP_MSG_DATA = (1 << 3), 19441c43fbeSAsbjørn Sloth Tønnesen }; 19541c43fbeSAsbjørn Sloth Tønnesen 196607ca46eSDavid Howells /* 197607ca46eSDavid Howells * NETLINK_GENERIC related info 198607ca46eSDavid Howells */ 199607ca46eSDavid Howells #define L2TP_GENL_NAME "l2tp" 200607ca46eSDavid Howells #define L2TP_GENL_VERSION 0x1 20133f72e6fSBill Hong #define L2TP_GENL_MCGROUP "l2tp" 202607ca46eSDavid Howells 203607ca46eSDavid Howells #endif /* _UAPI_LINUX_L2TP_H_ */ 204