1607ca46eSDavid Howells /* 2607ca46eSDavid Howells * L2TP-over-IP socket for L2TPv3. 3607ca46eSDavid Howells * 4607ca46eSDavid Howells * Author: James Chapman <jchapman@katalix.com> 5607ca46eSDavid Howells */ 6607ca46eSDavid Howells 7607ca46eSDavid Howells #ifndef _UAPI_LINUX_L2TP_H_ 8607ca46eSDavid Howells #define _UAPI_LINUX_L2TP_H_ 9607ca46eSDavid Howells 10607ca46eSDavid Howells #include <linux/types.h> 11607ca46eSDavid Howells #include <linux/socket.h> 12607ca46eSDavid Howells #ifndef __KERNEL__ 13607ca46eSDavid Howells #include <netinet/in.h> 14607ca46eSDavid Howells #endif 15607ca46eSDavid Howells 16607ca46eSDavid Howells #define IPPROTO_L2TP 115 17607ca46eSDavid Howells 18607ca46eSDavid Howells /** 19607ca46eSDavid Howells * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets 20607ca46eSDavid Howells * @l2tp_family: address family number AF_L2TPIP. 21607ca46eSDavid Howells * @l2tp_addr: protocol specific address information 22607ca46eSDavid Howells * @l2tp_conn_id: connection id of tunnel 23607ca46eSDavid Howells */ 24607ca46eSDavid Howells #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ 25607ca46eSDavid Howells struct sockaddr_l2tpip { 26607ca46eSDavid Howells /* The first fields must match struct sockaddr_in */ 27607ca46eSDavid Howells __kernel_sa_family_t l2tp_family; /* AF_INET */ 28607ca46eSDavid Howells __be16 l2tp_unused; /* INET port number (unused) */ 29607ca46eSDavid Howells struct in_addr l2tp_addr; /* Internet address */ 30607ca46eSDavid Howells 31607ca46eSDavid Howells __u32 l2tp_conn_id; /* Connection ID of tunnel */ 32607ca46eSDavid Howells 33607ca46eSDavid Howells /* Pad to size of `struct sockaddr'. */ 34607ca46eSDavid Howells unsigned char __pad[sizeof(struct sockaddr) - 35607ca46eSDavid Howells sizeof(__kernel_sa_family_t) - 36607ca46eSDavid Howells sizeof(__be16) - sizeof(struct in_addr) - 37607ca46eSDavid Howells sizeof(__u32)]; 38607ca46eSDavid Howells }; 39607ca46eSDavid Howells 40607ca46eSDavid Howells /** 41607ca46eSDavid Howells * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets 42607ca46eSDavid Howells * @l2tp_family: address family number AF_L2TPIP. 43607ca46eSDavid Howells * @l2tp_addr: protocol specific address information 44607ca46eSDavid Howells * @l2tp_conn_id: connection id of tunnel 45607ca46eSDavid Howells */ 46607ca46eSDavid Howells struct sockaddr_l2tpip6 { 47607ca46eSDavid Howells /* The first fields must match struct sockaddr_in6 */ 48607ca46eSDavid Howells __kernel_sa_family_t l2tp_family; /* AF_INET6 */ 49607ca46eSDavid Howells __be16 l2tp_unused; /* INET port number (unused) */ 50607ca46eSDavid Howells __be32 l2tp_flowinfo; /* IPv6 flow information */ 51607ca46eSDavid Howells struct in6_addr l2tp_addr; /* IPv6 address */ 52607ca46eSDavid Howells __u32 l2tp_scope_id; /* scope id (new in RFC2553) */ 53607ca46eSDavid Howells __u32 l2tp_conn_id; /* Connection ID of tunnel */ 54607ca46eSDavid Howells }; 55607ca46eSDavid Howells 56607ca46eSDavid Howells /***************************************************************************** 57607ca46eSDavid Howells * NETLINK_GENERIC netlink family. 58607ca46eSDavid Howells *****************************************************************************/ 59607ca46eSDavid Howells 60607ca46eSDavid Howells /* 61607ca46eSDavid Howells * Commands. 62607ca46eSDavid Howells * Valid TLVs of each command are:- 63607ca46eSDavid Howells * TUNNEL_CREATE - CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid 64607ca46eSDavid Howells * TUNNEL_DELETE - CONN_ID 65607ca46eSDavid Howells * TUNNEL_MODIFY - CONN_ID, udpcsum 66607ca46eSDavid Howells * TUNNEL_GETSTATS - CONN_ID, (stats) 67607ca46eSDavid Howells * TUNNEL_GET - CONN_ID, (...) 68607ca46eSDavid Howells * SESSION_CREATE - SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec 69607ca46eSDavid Howells * SESSION_DELETE - SESSION_ID 70607ca46eSDavid Howells * SESSION_MODIFY - SESSION_ID, data_seq 71607ca46eSDavid Howells * SESSION_GET - SESSION_ID, (...) 72607ca46eSDavid Howells * SESSION_GETSTATS - SESSION_ID, (stats) 73607ca46eSDavid Howells * 74607ca46eSDavid Howells */ 75607ca46eSDavid Howells enum { 76607ca46eSDavid Howells L2TP_CMD_NOOP, 77607ca46eSDavid Howells L2TP_CMD_TUNNEL_CREATE, 78607ca46eSDavid Howells L2TP_CMD_TUNNEL_DELETE, 79607ca46eSDavid Howells L2TP_CMD_TUNNEL_MODIFY, 80607ca46eSDavid Howells L2TP_CMD_TUNNEL_GET, 81607ca46eSDavid Howells L2TP_CMD_SESSION_CREATE, 82607ca46eSDavid Howells L2TP_CMD_SESSION_DELETE, 83607ca46eSDavid Howells L2TP_CMD_SESSION_MODIFY, 84607ca46eSDavid Howells L2TP_CMD_SESSION_GET, 85607ca46eSDavid Howells __L2TP_CMD_MAX, 86607ca46eSDavid Howells }; 87607ca46eSDavid Howells 88607ca46eSDavid Howells #define L2TP_CMD_MAX (__L2TP_CMD_MAX - 1) 89607ca46eSDavid Howells 90607ca46eSDavid Howells /* 91607ca46eSDavid Howells * ATTR types defined for L2TP 92607ca46eSDavid Howells */ 93607ca46eSDavid Howells enum { 94607ca46eSDavid Howells L2TP_ATTR_NONE, /* no data */ 95607ca46eSDavid Howells L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ 96607ca46eSDavid Howells L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ 97607ca46eSDavid Howells L2TP_ATTR_OFFSET, /* u16 */ 98607ca46eSDavid Howells L2TP_ATTR_DATA_SEQ, /* u16 */ 99607ca46eSDavid Howells L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ 100607ca46eSDavid Howells L2TP_ATTR_L2SPEC_LEN, /* u8, enum l2tp_l2spec_type */ 101607ca46eSDavid Howells L2TP_ATTR_PROTO_VERSION, /* u8 */ 102607ca46eSDavid Howells L2TP_ATTR_IFNAME, /* string */ 103607ca46eSDavid Howells L2TP_ATTR_CONN_ID, /* u32 */ 104607ca46eSDavid Howells L2TP_ATTR_PEER_CONN_ID, /* u32 */ 105607ca46eSDavid Howells L2TP_ATTR_SESSION_ID, /* u32 */ 106607ca46eSDavid Howells L2TP_ATTR_PEER_SESSION_ID, /* u32 */ 107607ca46eSDavid Howells L2TP_ATTR_UDP_CSUM, /* u8 */ 108607ca46eSDavid Howells L2TP_ATTR_VLAN_ID, /* u16 */ 109607ca46eSDavid Howells L2TP_ATTR_COOKIE, /* 0, 4 or 8 bytes */ 110607ca46eSDavid Howells L2TP_ATTR_PEER_COOKIE, /* 0, 4 or 8 bytes */ 111607ca46eSDavid Howells L2TP_ATTR_DEBUG, /* u32 */ 112607ca46eSDavid Howells L2TP_ATTR_RECV_SEQ, /* u8 */ 113607ca46eSDavid Howells L2TP_ATTR_SEND_SEQ, /* u8 */ 114607ca46eSDavid Howells L2TP_ATTR_LNS_MODE, /* u8 */ 115607ca46eSDavid Howells L2TP_ATTR_USING_IPSEC, /* u8 */ 116607ca46eSDavid Howells L2TP_ATTR_RECV_TIMEOUT, /* msec */ 117607ca46eSDavid Howells L2TP_ATTR_FD, /* int */ 118607ca46eSDavid Howells L2TP_ATTR_IP_SADDR, /* u32 */ 119607ca46eSDavid Howells L2TP_ATTR_IP_DADDR, /* u32 */ 120607ca46eSDavid Howells L2TP_ATTR_UDP_SPORT, /* u16 */ 121607ca46eSDavid Howells L2TP_ATTR_UDP_DPORT, /* u16 */ 122607ca46eSDavid Howells L2TP_ATTR_MTU, /* u16 */ 123607ca46eSDavid Howells L2TP_ATTR_MRU, /* u16 */ 124607ca46eSDavid Howells L2TP_ATTR_STATS, /* nested */ 125607ca46eSDavid Howells L2TP_ATTR_IP6_SADDR, /* struct in6_addr */ 126607ca46eSDavid Howells L2TP_ATTR_IP6_DADDR, /* struct in6_addr */ 1276b649feaSTom Herbert L2TP_ATTR_UDP_ZERO_CSUM6_TX, /* u8 */ 1286b649feaSTom Herbert L2TP_ATTR_UDP_ZERO_CSUM6_RX, /* u8 */ 1292175d87cSNicolas Dichtel L2TP_ATTR_PAD, 130607ca46eSDavid Howells __L2TP_ATTR_MAX, 131607ca46eSDavid Howells }; 132607ca46eSDavid Howells 133607ca46eSDavid Howells #define L2TP_ATTR_MAX (__L2TP_ATTR_MAX - 1) 134607ca46eSDavid Howells 135607ca46eSDavid Howells /* Nested in L2TP_ATTR_STATS */ 136607ca46eSDavid Howells enum { 137607ca46eSDavid Howells L2TP_ATTR_STATS_NONE, /* no data */ 138607ca46eSDavid Howells L2TP_ATTR_TX_PACKETS, /* u64 */ 139607ca46eSDavid Howells L2TP_ATTR_TX_BYTES, /* u64 */ 140607ca46eSDavid Howells L2TP_ATTR_TX_ERRORS, /* u64 */ 141607ca46eSDavid Howells L2TP_ATTR_RX_PACKETS, /* u64 */ 142607ca46eSDavid Howells L2TP_ATTR_RX_BYTES, /* u64 */ 143607ca46eSDavid Howells L2TP_ATTR_RX_SEQ_DISCARDS, /* u64 */ 144607ca46eSDavid Howells L2TP_ATTR_RX_OOS_PACKETS, /* u64 */ 145607ca46eSDavid Howells L2TP_ATTR_RX_ERRORS, /* u64 */ 146*1c714a92SNicolas Dichtel L2TP_ATTR_STATS_PAD, 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 172607ca46eSDavid Howells enum l2tp_seqmode { 173607ca46eSDavid Howells L2TP_SEQ_NONE = 0, 174607ca46eSDavid Howells L2TP_SEQ_IP = 1, 175607ca46eSDavid Howells L2TP_SEQ_ALL = 2, 176607ca46eSDavid Howells }; 177607ca46eSDavid Howells 178607ca46eSDavid Howells /* 179607ca46eSDavid Howells * NETLINK_GENERIC related info 180607ca46eSDavid Howells */ 181607ca46eSDavid Howells #define L2TP_GENL_NAME "l2tp" 182607ca46eSDavid Howells #define L2TP_GENL_VERSION 0x1 18333f72e6fSBill Hong #define L2TP_GENL_MCGROUP "l2tp" 184607ca46eSDavid Howells 185607ca46eSDavid Howells #endif /* _UAPI_LINUX_L2TP_H_ */ 186