1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2 /***************************************************************************
3  * Linux PPP over L2TP (PPPoL2TP) Socket Implementation (RFC 2661)
4  *
5  * This file supplies definitions required by the PPP over L2TP driver
6  * (l2tp_ppp.c).  All version information wrt this file is located in l2tp_ppp.c
7  *
8  * License:
9  *		This program is free software; you can redistribute it and/or
10  *		modify it under the terms of the GNU General Public License
11  *		as published by the Free Software Foundation; either version
12  *		2 of the License, or (at your option) any later version.
13  *
14  */
15 
16 #ifndef _UAPI__LINUX_IF_PPPOL2TP_H
17 #define _UAPI__LINUX_IF_PPPOL2TP_H
18 
19 #include <linux/types.h>
20 #include <linux/in.h>
21 #include <linux/in6.h>
22 #include <linux/l2tp.h>
23 
24 /* Structure used to connect() the socket to a particular tunnel UDP
25  * socket over IPv4.
26  */
27 struct pppol2tp_addr {
28 	__kernel_pid_t	pid;		/* pid that owns the fd.
29 					 * 0 => current */
30 	int	fd;			/* FD of UDP socket to use */
31 
32 	struct sockaddr_in addr;	/* IP address and port to send to */
33 
34 	uint16_t s_tunnel, s_session;	/* For matching incoming packets */
35 	uint16_t d_tunnel, d_session;	/* For sending outgoing packets */
36 };
37 
38 /* Structure used to connect() the socket to a particular tunnel UDP
39  * socket over IPv6.
40  */
41 struct pppol2tpin6_addr {
42 	__kernel_pid_t	pid;		/* pid that owns the fd.
43 					 * 0 => current */
44 	int	fd;			/* FD of UDP socket to use */
45 
46 	uint16_t s_tunnel, s_session;	/* For matching incoming packets */
47 	uint16_t d_tunnel, d_session;	/* For sending outgoing packets */
48 
49 	struct sockaddr_in6 addr;	/* IP address and port to send to */
50 };
51 
52 /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
53  * bits. So we need a different sockaddr structure.
54  */
55 struct pppol2tpv3_addr {
56 	__kernel_pid_t	pid;		/* pid that owns the fd.
57 					 * 0 => current */
58 	int	fd;			/* FD of UDP or IP socket to use */
59 
60 	struct sockaddr_in addr;	/* IP address and port to send to */
61 
62 	uint32_t s_tunnel, s_session;	/* For matching incoming packets */
63 	uint32_t d_tunnel, d_session;	/* For sending outgoing packets */
64 };
65 
66 struct pppol2tpv3in6_addr {
67 	__kernel_pid_t	pid;		/* pid that owns the fd.
68 					 * 0 => current */
69 	int	fd;			/* FD of UDP or IP socket to use */
70 
71 	uint32_t s_tunnel, s_session;	/* For matching incoming packets */
72 	uint32_t d_tunnel, d_session;	/* For sending outgoing packets */
73 
74 	struct sockaddr_in6 addr;	/* IP address and port to send to */
75 };
76 
77 /* Socket options:
78  * DEBUG	- bitmask of debug message categories (not used)
79  * SENDSEQ	- 0 => don't send packets with sequence numbers
80  *		  1 => send packets with sequence numbers
81  * RECVSEQ	- 0 => receive packet sequence numbers are optional
82  *		  1 => drop receive packets without sequence numbers
83  * LNSMODE	- 0 => act as LAC.
84  *		  1 => act as LNS.
85  * REORDERTO	- reorder timeout (in millisecs). If 0, don't try to reorder.
86  */
87 enum {
88 	PPPOL2TP_SO_DEBUG	= 1,
89 	PPPOL2TP_SO_RECVSEQ	= 2,
90 	PPPOL2TP_SO_SENDSEQ	= 3,
91 	PPPOL2TP_SO_LNSMODE	= 4,
92 	PPPOL2TP_SO_REORDERTO	= 5,
93 };
94 
95 /* Debug message categories for the DEBUG socket option (deprecated) */
96 enum {
97 	PPPOL2TP_MSG_DEBUG	= L2TP_MSG_DEBUG,
98 	PPPOL2TP_MSG_CONTROL	= L2TP_MSG_CONTROL,
99 	PPPOL2TP_MSG_SEQ	= L2TP_MSG_SEQ,
100 	PPPOL2TP_MSG_DATA	= L2TP_MSG_DATA,
101 };
102 
103 
104 
105 #endif /* _UAPI__LINUX_IF_PPPOL2TP_H */
106