xref: /linux/include/linux/l2tp.h (revision a32e0eec7042b21ccb52896cf715e3e2641fed93)
10d76751fSJames Chapman /*
20d76751fSJames Chapman  * L2TP-over-IP socket for L2TPv3.
30d76751fSJames Chapman  *
40d76751fSJames Chapman  * Author: James Chapman <jchapman@katalix.com>
50d76751fSJames Chapman  */
60d76751fSJames Chapman 
70d76751fSJames Chapman #ifndef _LINUX_L2TP_H_
80d76751fSJames Chapman #define _LINUX_L2TP_H_
90d76751fSJames Chapman 
100d76751fSJames Chapman #include <linux/types.h>
110d76751fSJames Chapman #include <linux/socket.h>
12bcb949b8SBen Hutchings #ifdef __KERNEL__
130d76751fSJames Chapman #include <linux/in.h>
14*a32e0eecSChris Elston #include <linux/in6.h>
15309795f4SJames Chapman #else
16309795f4SJames Chapman #include <netinet/in.h>
170d76751fSJames Chapman #endif
180d76751fSJames Chapman 
190d76751fSJames Chapman #define IPPROTO_L2TP		115
200d76751fSJames Chapman 
210d76751fSJames Chapman /**
220d76751fSJames Chapman  * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets
230d76751fSJames Chapman  * @l2tp_family:  address family number AF_L2TPIP.
240d76751fSJames Chapman  * @l2tp_addr:    protocol specific address information
250d76751fSJames Chapman  * @l2tp_conn_id: connection id of tunnel
260d76751fSJames Chapman  */
27309795f4SJames Chapman #define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/
280d76751fSJames Chapman struct sockaddr_l2tpip {
290d76751fSJames Chapman 	/* The first fields must match struct sockaddr_in */
30bcb949b8SBen Hutchings 	__kernel_sa_family_t l2tp_family; /* AF_INET */
310d76751fSJames Chapman 	__be16		l2tp_unused;	/* INET port number (unused) */
320d76751fSJames Chapman 	struct in_addr	l2tp_addr;	/* Internet address */
330d76751fSJames Chapman 
340d76751fSJames Chapman 	__u32		l2tp_conn_id;	/* Connection ID of tunnel */
350d76751fSJames Chapman 
360d76751fSJames Chapman 	/* Pad to size of `struct sockaddr'. */
37bcb949b8SBen Hutchings 	unsigned char	__pad[sizeof(struct sockaddr) -
38bcb949b8SBen Hutchings 			      sizeof(__kernel_sa_family_t) -
390d76751fSJames Chapman 			      sizeof(__be16) - sizeof(struct in_addr) -
400d76751fSJames Chapman 			      sizeof(__u32)];
410d76751fSJames Chapman };
420d76751fSJames Chapman 
43*a32e0eecSChris Elston /**
44*a32e0eecSChris Elston  * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets
45*a32e0eecSChris Elston  * @l2tp_family:  address family number AF_L2TPIP.
46*a32e0eecSChris Elston  * @l2tp_addr:    protocol specific address information
47*a32e0eecSChris Elston  * @l2tp_conn_id: connection id of tunnel
48*a32e0eecSChris Elston  */
49*a32e0eecSChris Elston struct sockaddr_l2tpip6 {
50*a32e0eecSChris Elston 	/* The first fields must match struct sockaddr_in6 */
51*a32e0eecSChris Elston 	__kernel_sa_family_t l2tp_family; /* AF_INET6 */
52*a32e0eecSChris Elston 	__be16		l2tp_unused;	/* INET port number (unused) */
53*a32e0eecSChris Elston 	__be32		l2tp_flowinfo;	/* IPv6 flow information */
54*a32e0eecSChris Elston 	struct in6_addr	l2tp_addr;	/* IPv6 address */
55*a32e0eecSChris Elston 	__u32		l2tp_scope_id;	/* scope id (new in RFC2553) */
56*a32e0eecSChris Elston 	__u32		l2tp_conn_id;	/* Connection ID of tunnel */
57*a32e0eecSChris Elston };
58*a32e0eecSChris Elston 
59309795f4SJames Chapman /*****************************************************************************
60309795f4SJames Chapman  *  NETLINK_GENERIC netlink family.
61309795f4SJames Chapman  *****************************************************************************/
62309795f4SJames Chapman 
63309795f4SJames Chapman /*
64309795f4SJames Chapman  * Commands.
65309795f4SJames Chapman  * Valid TLVs of each command are:-
66309795f4SJames Chapman  * TUNNEL_CREATE	- CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid
67309795f4SJames Chapman  * TUNNEL_DELETE	- CONN_ID
68309795f4SJames Chapman  * TUNNEL_MODIFY	- CONN_ID, udpcsum
69309795f4SJames Chapman  * TUNNEL_GETSTATS	- CONN_ID, (stats)
70309795f4SJames Chapman  * TUNNEL_GET		- CONN_ID, (...)
71309795f4SJames Chapman  * SESSION_CREATE	- SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec
72309795f4SJames Chapman  * SESSION_DELETE	- SESSION_ID
73309795f4SJames Chapman  * SESSION_MODIFY	- SESSION_ID, data_seq
74309795f4SJames Chapman  * SESSION_GET		- SESSION_ID, (...)
75309795f4SJames Chapman  * SESSION_GETSTATS	- SESSION_ID, (stats)
76309795f4SJames Chapman  *
77309795f4SJames Chapman  */
78309795f4SJames Chapman enum {
79309795f4SJames Chapman 	L2TP_CMD_NOOP,
80309795f4SJames Chapman 	L2TP_CMD_TUNNEL_CREATE,
81309795f4SJames Chapman 	L2TP_CMD_TUNNEL_DELETE,
82309795f4SJames Chapman 	L2TP_CMD_TUNNEL_MODIFY,
83309795f4SJames Chapman 	L2TP_CMD_TUNNEL_GET,
84309795f4SJames Chapman 	L2TP_CMD_SESSION_CREATE,
85309795f4SJames Chapman 	L2TP_CMD_SESSION_DELETE,
86309795f4SJames Chapman 	L2TP_CMD_SESSION_MODIFY,
87309795f4SJames Chapman 	L2TP_CMD_SESSION_GET,
88309795f4SJames Chapman 	__L2TP_CMD_MAX,
89309795f4SJames Chapman };
90309795f4SJames Chapman 
91309795f4SJames Chapman #define L2TP_CMD_MAX			(__L2TP_CMD_MAX - 1)
92309795f4SJames Chapman 
93309795f4SJames Chapman /*
94309795f4SJames Chapman  * ATTR types defined for L2TP
95309795f4SJames Chapman  */
96309795f4SJames Chapman enum {
97309795f4SJames Chapman 	L2TP_ATTR_NONE,			/* no data */
98309795f4SJames Chapman 	L2TP_ATTR_PW_TYPE,		/* u16, enum l2tp_pwtype */
99309795f4SJames Chapman 	L2TP_ATTR_ENCAP_TYPE,		/* u16, enum l2tp_encap_type */
100309795f4SJames Chapman 	L2TP_ATTR_OFFSET,		/* u16 */
101309795f4SJames Chapman 	L2TP_ATTR_DATA_SEQ,		/* u16 */
102309795f4SJames Chapman 	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */
103309795f4SJames Chapman 	L2TP_ATTR_L2SPEC_LEN,		/* u8, enum l2tp_l2spec_type */
104309795f4SJames Chapman 	L2TP_ATTR_PROTO_VERSION,	/* u8 */
105309795f4SJames Chapman 	L2TP_ATTR_IFNAME,		/* string */
106309795f4SJames Chapman 	L2TP_ATTR_CONN_ID,		/* u32 */
107309795f4SJames Chapman 	L2TP_ATTR_PEER_CONN_ID,		/* u32 */
108309795f4SJames Chapman 	L2TP_ATTR_SESSION_ID,		/* u32 */
109309795f4SJames Chapman 	L2TP_ATTR_PEER_SESSION_ID,	/* u32 */
110309795f4SJames Chapman 	L2TP_ATTR_UDP_CSUM,		/* u8 */
111309795f4SJames Chapman 	L2TP_ATTR_VLAN_ID,		/* u16 */
112309795f4SJames Chapman 	L2TP_ATTR_COOKIE,		/* 0, 4 or 8 bytes */
113309795f4SJames Chapman 	L2TP_ATTR_PEER_COOKIE,		/* 0, 4 or 8 bytes */
114309795f4SJames Chapman 	L2TP_ATTR_DEBUG,		/* u32 */
115309795f4SJames Chapman 	L2TP_ATTR_RECV_SEQ,		/* u8 */
116309795f4SJames Chapman 	L2TP_ATTR_SEND_SEQ,		/* u8 */
117309795f4SJames Chapman 	L2TP_ATTR_LNS_MODE,		/* u8 */
118309795f4SJames Chapman 	L2TP_ATTR_USING_IPSEC,		/* u8 */
119309795f4SJames Chapman 	L2TP_ATTR_RECV_TIMEOUT,		/* msec */
120309795f4SJames Chapman 	L2TP_ATTR_FD,			/* int */
121309795f4SJames Chapman 	L2TP_ATTR_IP_SADDR,		/* u32 */
122309795f4SJames Chapman 	L2TP_ATTR_IP_DADDR,		/* u32 */
123309795f4SJames Chapman 	L2TP_ATTR_UDP_SPORT,		/* u16 */
124309795f4SJames Chapman 	L2TP_ATTR_UDP_DPORT,		/* u16 */
125309795f4SJames Chapman 	L2TP_ATTR_MTU,			/* u16 */
126309795f4SJames Chapman 	L2TP_ATTR_MRU,			/* u16 */
127309795f4SJames Chapman 	L2TP_ATTR_STATS,		/* nested */
128f9bac8dfSChris Elston 	L2TP_ATTR_IP6_SADDR,		/* struct in6_addr */
129f9bac8dfSChris Elston 	L2TP_ATTR_IP6_DADDR,		/* struct in6_addr */
130309795f4SJames Chapman 	__L2TP_ATTR_MAX,
131309795f4SJames Chapman };
132309795f4SJames Chapman 
133309795f4SJames Chapman #define L2TP_ATTR_MAX			(__L2TP_ATTR_MAX - 1)
134309795f4SJames Chapman 
135309795f4SJames Chapman /* Nested in L2TP_ATTR_STATS */
136309795f4SJames Chapman enum {
137309795f4SJames Chapman 	L2TP_ATTR_STATS_NONE,		/* no data */
138309795f4SJames Chapman 	L2TP_ATTR_TX_PACKETS,		/* u64 */
139309795f4SJames Chapman 	L2TP_ATTR_TX_BYTES,		/* u64 */
140309795f4SJames Chapman 	L2TP_ATTR_TX_ERRORS,		/* u64 */
141309795f4SJames Chapman 	L2TP_ATTR_RX_PACKETS,		/* u64 */
142309795f4SJames Chapman 	L2TP_ATTR_RX_BYTES,		/* u64 */
143309795f4SJames Chapman 	L2TP_ATTR_RX_SEQ_DISCARDS,	/* u64 */
144309795f4SJames Chapman 	L2TP_ATTR_RX_OOS_PACKETS,	/* u64 */
145309795f4SJames Chapman 	L2TP_ATTR_RX_ERRORS,		/* u64 */
146309795f4SJames Chapman 	__L2TP_ATTR_STATS_MAX,
147309795f4SJames Chapman };
148309795f4SJames Chapman 
149309795f4SJames Chapman #define L2TP_ATTR_STATS_MAX		(__L2TP_ATTR_STATS_MAX - 1)
150309795f4SJames Chapman 
151309795f4SJames Chapman enum l2tp_pwtype {
152309795f4SJames Chapman 	L2TP_PWTYPE_NONE = 0x0000,
153309795f4SJames Chapman 	L2TP_PWTYPE_ETH_VLAN = 0x0004,
154309795f4SJames Chapman 	L2TP_PWTYPE_ETH = 0x0005,
155309795f4SJames Chapman 	L2TP_PWTYPE_PPP = 0x0007,
156309795f4SJames Chapman 	L2TP_PWTYPE_PPP_AC = 0x0008,
157309795f4SJames Chapman 	L2TP_PWTYPE_IP = 0x000b,
158309795f4SJames Chapman 	__L2TP_PWTYPE_MAX
159309795f4SJames Chapman };
160309795f4SJames Chapman 
161309795f4SJames Chapman enum l2tp_l2spec_type {
162309795f4SJames Chapman 	L2TP_L2SPECTYPE_NONE,
163309795f4SJames Chapman 	L2TP_L2SPECTYPE_DEFAULT,
164309795f4SJames Chapman };
165309795f4SJames Chapman 
166309795f4SJames Chapman enum l2tp_encap_type {
167309795f4SJames Chapman 	L2TP_ENCAPTYPE_UDP,
168309795f4SJames Chapman 	L2TP_ENCAPTYPE_IP,
169309795f4SJames Chapman };
170309795f4SJames Chapman 
171309795f4SJames Chapman enum l2tp_seqmode {
172309795f4SJames Chapman 	L2TP_SEQ_NONE = 0,
173309795f4SJames Chapman 	L2TP_SEQ_IP = 1,
174309795f4SJames Chapman 	L2TP_SEQ_ALL = 2,
175309795f4SJames Chapman };
176309795f4SJames Chapman 
177309795f4SJames Chapman /*
178309795f4SJames Chapman  * NETLINK_GENERIC related info
179309795f4SJames Chapman  */
180309795f4SJames Chapman #define L2TP_GENL_NAME		"l2tp"
181309795f4SJames Chapman #define L2TP_GENL_VERSION	0x1
182309795f4SJames Chapman 
1830d76751fSJames Chapman #endif
184