Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
v4.6
  1/*
  2 * L2TP internal definitions.
  3 *
  4 * Copyright (c) 2008,2009 Katalix Systems Ltd
  5 *
  6 * This program is free software; you can redistribute it and/or modify
  7 * it under the terms of the GNU General Public License version 2 as
  8 * published by the Free Software Foundation.
  9 */
 
 10
 11#ifndef _L2TP_CORE_H_
 12#define _L2TP_CORE_H_
 13
 14/* Just some random numbers */
 15#define L2TP_TUNNEL_MAGIC	0x42114DDA
 16#define L2TP_SESSION_MAGIC	0x0C04EB7D
 17
 18/* Per tunnel, session hash table size */
 19#define L2TP_HASH_BITS	4
 20#define L2TP_HASH_SIZE	(1 << L2TP_HASH_BITS)
 21
 22/* System-wide, session hash table size */
 23#define L2TP_HASH_BITS_2	8
 24#define L2TP_HASH_SIZE_2	(1 << L2TP_HASH_BITS_2)
 25
 26/* Debug message categories for the DEBUG socket option */
 27enum {
 28	L2TP_MSG_DEBUG		= (1 << 0),	/* verbose debug (if
 29						 * compiled in) */
 30	L2TP_MSG_CONTROL	= (1 << 1),	/* userspace - kernel
 31						 * interface */
 32	L2TP_MSG_SEQ		= (1 << 2),	/* sequence numbers */
 33	L2TP_MSG_DATA		= (1 << 3),	/* data packets */
 34};
 35
 36struct sk_buff;
 37
 38struct l2tp_stats {
 39	atomic_long_t		tx_packets;
 40	atomic_long_t		tx_bytes;
 41	atomic_long_t		tx_errors;
 42	atomic_long_t		rx_packets;
 43	atomic_long_t		rx_bytes;
 44	atomic_long_t		rx_seq_discards;
 45	atomic_long_t		rx_oos_packets;
 46	atomic_long_t		rx_errors;
 47	atomic_long_t		rx_cookie_discards;
 
 48};
 49
 50struct l2tp_tunnel;
 51
 52/* Describes a session. Contains information to determine incoming
 53 * packets and transmit outgoing ones.
 54 */
 55struct l2tp_session_cfg {
 56	enum l2tp_pwtype	pw_type;
 57	unsigned int		data_seq:2;	/* data sequencing level
 58						 * 0 => none, 1 => IP only,
 59						 * 2 => all
 
 60						 */
 61	unsigned int		recv_seq:1;	/* expect receive packets with
 62						 * sequence numbers? */
 63	unsigned int		send_seq:1;	/* send packets with sequence
 64						 * numbers? */
 65	unsigned int		lns_mode:1;	/* behave as LNS? LAC enables
 66						 * sequence numbers under
 67						 * control of LNS. */
 68	int			debug;		/* bitmask of debug message
 69						 * categories */
 70	u16			vlan_id;	/* VLAN pseudowire only */
 71	u16			offset;		/* offset to payload */
 72	u16			l2specific_len;	/* Layer 2 specific length */
 73	u16			l2specific_type; /* Layer 2 specific type */
 74	u8			cookie[8];	/* optional cookie */
 75	int			cookie_len;	/* 0, 4 or 8 bytes */
 76	u8			peer_cookie[8];	/* peer's cookie */
 77	int			peer_cookie_len; /* 0, 4 or 8 bytes */
 78	int			reorder_timeout; /* configured reorder timeout
 79						  * (in jiffies) */
 80	int			mtu;
 81	int			mru;
 82	char			*ifname;
 83};
 84
 
 
 
 
 
 
 
 
 
 
 
 85struct l2tp_session {
 86	int			magic;		/* should be
 87						 * L2TP_SESSION_MAGIC */
 
 88
 89	struct l2tp_tunnel	*tunnel;	/* back pointer to tunnel
 90						 * context */
 91	u32			session_id;
 92	u32			peer_session_id;
 93	u8			cookie[8];
 94	int			cookie_len;
 95	u8			peer_cookie[8];
 96	int			peer_cookie_len;
 97	u16			offset;		/* offset from end of L2TP header
 98						   to beginning of data */
 99	u16			l2specific_len;
100	u16			l2specific_type;
101	u16			hdr_len;
102	u32			nr;		/* session NR state (receive) */
103	u32			ns;		/* session NR state (send) */
104	struct sk_buff_head	reorder_q;	/* receive reorder queue */
105	u32			nr_max;		/* max NR. Depends on tunnel */
106	u32			nr_window_size;	/* NR window size */
107	u32			nr_oos;		/* NR of last OOS packet */
108	int			nr_oos_count;	/* For OOS recovery */
109	int			nr_oos_count_max;
110	struct hlist_node	hlist;		/* Hash list node */
111	atomic_t		ref_count;
 
 
 
 
112
113	char			name[32];	/* for logging */
114	char			ifname[IFNAMSIZ];
115	unsigned int		data_seq:2;	/* data sequencing level
116						 * 0 => none, 1 => IP only,
117						 * 2 => all
 
118						 */
119	unsigned int		recv_seq:1;	/* expect receive packets with
120						 * sequence numbers? */
121	unsigned int		send_seq:1;	/* send packets with sequence
122						 * numbers? */
123	unsigned int		lns_mode:1;	/* behave as LNS? LAC enables
124						 * sequence numbers under
125						 * control of LNS. */
126	int			debug;		/* bitmask of debug message
127						 * categories */
128	int			reorder_timeout; /* configured reorder timeout
129						  * (in jiffies) */
130	int			reorder_skip;	/* set if skip to next nr */
131	int			mtu;
132	int			mru;
133	enum l2tp_pwtype	pwtype;
134	struct l2tp_stats	stats;
135	struct hlist_node	global_hlist;	/* Global hash list node */
136
137	int (*build_header)(struct l2tp_session *session, void *buf);
 
 
 
 
138	void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
 
 
 
 
 
 
 
139	void (*session_close)(struct l2tp_session *session);
140	void (*ref)(struct l2tp_session *session);
141	void (*deref)(struct l2tp_session *session);
142#if defined(CONFIG_L2TP_DEBUGFS) || defined(CONFIG_L2TP_DEBUGFS_MODULE)
 
 
 
143	void (*show)(struct seq_file *m, void *priv);
144#endif
145	uint8_t			priv[0];	/* private data */
146};
147
148/* Describes the tunnel. It contains info to track all the associated
149 * sessions so incoming packets can be sorted out
150 */
151struct l2tp_tunnel_cfg {
152	int			debug;		/* bitmask of debug message
153						 * categories */
154	enum l2tp_encap_type	encap;
155
156	/* Used only for kernel-created sockets */
157	struct in_addr		local_ip;
158	struct in_addr		peer_ip;
159#if IS_ENABLED(CONFIG_IPV6)
160	struct in6_addr		*local_ip6;
161	struct in6_addr		*peer_ip6;
162#endif
163	u16			local_udp_port;
164	u16			peer_udp_port;
165	unsigned int		use_udp_checksums:1,
166				udp6_zero_tx_checksums:1,
167				udp6_zero_rx_checksums:1;
168};
169
 
 
 
 
 
 
 
170struct l2tp_tunnel {
171	int			magic;		/* Should be L2TP_TUNNEL_MAGIC */
 
172	struct rcu_head rcu;
173	rwlock_t		hlist_lock;	/* protect session_hlist */
174	struct hlist_head	session_hlist[L2TP_HASH_SIZE];
175						/* hashed list of sessions,
176						 * hashed by id */
 
177	u32			tunnel_id;
178	u32			peer_tunnel_id;
179	int			version;	/* 2=>L2TPv2, 3=>L2TPv3 */
180
181	char			name[20];	/* for logging */
182	int			debug;		/* bitmask of debug message
183						 * categories */
184	enum l2tp_encap_type	encap;
185	struct l2tp_stats	stats;
186
187	struct list_head	list;		/* Keep a list of all tunnels */
188	struct net		*l2tp_net;	/* the net we belong to */
189
190	atomic_t		ref_count;
191#ifdef CONFIG_DEBUG_FS
192	void (*show)(struct seq_file *m, void *arg);
193#endif
194	int (*recv_payload_hook)(struct sk_buff *skb);
195	void (*old_sk_destruct)(struct sock *);
196	struct sock		*sock;		/* Parent socket */
197	int			fd;		/* Parent fd, if tunnel socket
198						 * was created by userspace */
199#if IS_ENABLED(CONFIG_IPV6)
200	bool			v4mapped;
201#endif
202
203	struct work_struct	del_work;
204
205	uint8_t			priv[0];	/* private data */
206};
207
 
208struct l2tp_nl_cmd_ops {
209	int (*session_create)(struct net *net, u32 tunnel_id, u32 session_id, u32 peer_session_id, struct l2tp_session_cfg *cfg);
210	int (*session_delete)(struct l2tp_session *session);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211};
212
213static inline void *l2tp_tunnel_priv(struct l2tp_tunnel *tunnel)
214{
215	return &tunnel->priv[0];
216}
217
218static inline void *l2tp_session_priv(struct l2tp_session *session)
219{
220	return &session->priv[0];
221}
222
223static inline struct l2tp_tunnel *l2tp_sock_to_tunnel(struct sock *sk)
224{
225	struct l2tp_tunnel *tunnel;
226
227	if (sk == NULL)
228		return NULL;
229
230	sock_hold(sk);
231	tunnel = (struct l2tp_tunnel *)(sk->sk_user_data);
232	if (tunnel == NULL) {
233		sock_put(sk);
234		goto out;
235	}
236
237	BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC);
238
239out:
240	return tunnel;
241}
242
243struct l2tp_session *l2tp_session_find(struct net *net,
244				       struct l2tp_tunnel *tunnel,
245				       u32 session_id);
246struct l2tp_session *l2tp_session_find_nth(struct l2tp_tunnel *tunnel, int nth);
247struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname);
248struct l2tp_tunnel *l2tp_tunnel_find(struct net *net, u32 tunnel_id);
249struct l2tp_tunnel *l2tp_tunnel_find_nth(struct net *net, int nth);
250
251int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id,
 
 
 
 
 
 
 
 
 
 
 
 
 
252		       u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
253		       struct l2tp_tunnel **tunnelp);
254void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel);
255int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
 
 
256struct l2tp_session *l2tp_session_create(int priv_size,
257					 struct l2tp_tunnel *tunnel,
258					 u32 session_id, u32 peer_session_id,
259					 struct l2tp_session_cfg *cfg);
260void __l2tp_session_unhash(struct l2tp_session *session);
261int l2tp_session_delete(struct l2tp_session *session);
262void l2tp_session_free(struct l2tp_session *session);
 
 
 
 
 
263void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
264		      unsigned char *ptr, unsigned char *optr, u16 hdrflags,
265		      int length, int (*payload_hook)(struct sk_buff *skb));
266int l2tp_session_queue_purge(struct l2tp_session *session);
267int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
268void l2tp_session_set_header_len(struct l2tp_session *session, int version);
269
270int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb,
271		  int hdr_len);
272
273int l2tp_nl_register_ops(enum l2tp_pwtype pw_type,
274			 const struct l2tp_nl_cmd_ops *ops);
 
 
 
 
 
 
 
 
275void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
276
277/* Session reference counts. Incremented when code obtains a reference
278 * to a session.
279 */
280static inline void l2tp_session_inc_refcount_1(struct l2tp_session *session)
 
 
281{
282	atomic_inc(&session->ref_count);
 
 
 
 
 
 
283}
284
285static inline void l2tp_session_dec_refcount_1(struct l2tp_session *session)
286{
287	if (atomic_dec_and_test(&session->ref_count))
288		l2tp_session_free(session);
 
 
 
 
 
 
 
 
 
289}
290
291#ifdef L2TP_REFCNT_DEBUG
292#define l2tp_session_inc_refcount(_s)					\
293do {									\
294	pr_debug("l2tp_session_inc_refcount: %s:%d %s: cnt=%d\n",	\
295		 __func__, __LINE__, (_s)->name,			\
296		 atomic_read(&_s->ref_count));				\
297	l2tp_session_inc_refcount_1(_s);				\
298} while (0)
299#define l2tp_session_dec_refcount(_s)					\
300do {									\
301	pr_debug("l2tp_session_dec_refcount: %s:%d %s: cnt=%d\n",	\
302		 __func__, __LINE__, (_s)->name,			\
303		 atomic_read(&_s->ref_count));				\
304	l2tp_session_dec_refcount_1(_s);				\
305} while (0)
306#else
307#define l2tp_session_inc_refcount(s) l2tp_session_inc_refcount_1(s)
308#define l2tp_session_dec_refcount(s) l2tp_session_dec_refcount_1(s)
 
 
309#endif
310
311#define l2tp_printk(ptr, type, func, fmt, ...)				\
312do {									\
313	if (((ptr)->debug) & (type))					\
314		func(fmt, ##__VA_ARGS__);				\
315} while (0)
316
317#define l2tp_warn(ptr, type, fmt, ...)					\
318	l2tp_printk(ptr, type, pr_warn, fmt, ##__VA_ARGS__)
319#define l2tp_info(ptr, type, fmt, ...)					\
320	l2tp_printk(ptr, type, pr_info, fmt, ##__VA_ARGS__)
321#define l2tp_dbg(ptr, type, fmt, ...)					\
322	l2tp_printk(ptr, type, pr_debug, fmt, ##__VA_ARGS__)
 
 
 
 
 
 
 
323
324#define MODULE_ALIAS_L2TP_PWTYPE(type) \
325	MODULE_ALIAS("net-l2tp-type-" __stringify(type))
326
327#endif /* _L2TP_CORE_H_ */
v6.13.7
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/* L2TP internal definitions.
  3 *
  4 * Copyright (c) 2008,2009 Katalix Systems Ltd
 
 
 
 
  5 */
  6#include <linux/refcount.h>
  7
  8#ifndef _L2TP_CORE_H_
  9#define _L2TP_CORE_H_
 10
 11#include <net/dst.h>
 12#include <net/sock.h>
 
 13
 14#ifdef CONFIG_XFRM
 15#include <net/xfrm.h>
 16#endif
 17
 18/* Random numbers used for internal consistency checks of tunnel and session structures */
 19#define L2TP_SESSION_MAGIC	0x0C04EB7D
 
 
 
 
 
 
 
 
 
 
 
 20
 21struct sk_buff;
 22
 23struct l2tp_stats {
 24	atomic_long_t		tx_packets;
 25	atomic_long_t		tx_bytes;
 26	atomic_long_t		tx_errors;
 27	atomic_long_t		rx_packets;
 28	atomic_long_t		rx_bytes;
 29	atomic_long_t		rx_seq_discards;
 30	atomic_long_t		rx_oos_packets;
 31	atomic_long_t		rx_errors;
 32	atomic_long_t		rx_cookie_discards;
 33	atomic_long_t		rx_invalid;
 34};
 35
 36struct l2tp_tunnel;
 37
 38/* L2TP session configuration */
 
 
 39struct l2tp_session_cfg {
 40	enum l2tp_pwtype	pw_type;
 41	unsigned int		recv_seq:1;	/* expect receive packets with sequence numbers? */
 42	unsigned int		send_seq:1;	/* send packets with sequence numbers? */
 43	unsigned int		lns_mode:1;	/* behave as LNS?
 44						 * LAC enables sequence numbers under LNS control.
 45						 */
 
 
 
 
 
 
 
 
 
 
 
 
 46	u16			l2specific_type; /* Layer 2 specific type */
 47	u8			cookie[8];	/* optional cookie */
 48	int			cookie_len;	/* 0, 4 or 8 bytes */
 49	u8			peer_cookie[8];	/* peer's cookie */
 50	int			peer_cookie_len; /* 0, 4 or 8 bytes */
 51	int			reorder_timeout; /* configured reorder timeout (in jiffies) */
 
 
 
 52	char			*ifname;
 53};
 54
 55struct l2tp_session_coll_list {
 56	spinlock_t lock;	/* for access to list */
 57	struct list_head list;
 58	refcount_t ref_count;
 59};
 60
 61/* Represents a session (pseudowire) instance.
 62 * Tracks runtime state including cookies, dataplane packet sequencing, and IO statistics.
 63 * Is linked into a per-tunnel session list and a per-net ("global") IDR tree.
 64 */
 65#define L2TP_SESSION_NAME_MAX 32
 66struct l2tp_session {
 67	int			magic;		/* should be L2TP_SESSION_MAGIC */
 68	long			dead;
 69	struct rcu_head		rcu;
 70
 71	struct l2tp_tunnel	*tunnel;	/* back pointer to tunnel context */
 
 72	u32			session_id;
 73	u32			peer_session_id;
 74	u8			cookie[8];
 75	int			cookie_len;
 76	u8			peer_cookie[8];
 77	int			peer_cookie_len;
 
 
 
 78	u16			l2specific_type;
 79	u16			hdr_len;
 80	u32			nr;		/* session NR state (receive) */
 81	u32			ns;		/* session NR state (send) */
 82	struct sk_buff_head	reorder_q;	/* receive reorder queue */
 83	u32			nr_max;		/* max NR. Depends on tunnel */
 84	u32			nr_window_size;	/* NR window size */
 85	u32			nr_oos;		/* NR of last OOS packet */
 86	int			nr_oos_count;	/* for OOS recovery */
 87	int			nr_oos_count_max;
 88	struct list_head	list;		/* per-tunnel list node */
 89	refcount_t		ref_count;
 90	struct hlist_node	hlist;		/* per-net session hlist */
 91	unsigned long		hlist_key;	/* key for session hlist */
 92	struct l2tp_session_coll_list *coll_list; /* session collision list */
 93	struct list_head	clist;		/* for coll_list */
 94
 95	char			name[L2TP_SESSION_NAME_MAX]; /* for logging */
 96	char			ifname[IFNAMSIZ];
 97	unsigned int		recv_seq:1;	/* expect receive packets with sequence numbers? */
 98	unsigned int		send_seq:1;	/* send packets with sequence numbers? */
 99	unsigned int		lns_mode:1;	/* behave as LNS?
100						 * LAC enables sequence numbers under LNS control.
101						 */
102	int			reorder_timeout; /* configured reorder timeout (in jiffies) */
 
 
 
 
 
 
 
 
 
 
103	int			reorder_skip;	/* set if skip to next nr */
 
 
104	enum l2tp_pwtype	pwtype;
105	struct l2tp_stats	stats;
106	struct work_struct	del_work;
107
108	/* Session receive handler for data packets.
109	 * Each pseudowire implementation should implement this callback in order to
110	 * handle incoming packets.  Packets are passed to the pseudowire handler after
111	 * reordering, if data sequence numbers are enabled for the session.
112	 */
113	void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
114
115	/* Session close handler.
116	 * Each pseudowire implementation may implement this callback in order to carry
117	 * out pseudowire-specific shutdown actions.
118	 * The callback is called by core after unlisting the session and purging its
119	 * reorder queue.
120	 */
121	void (*session_close)(struct l2tp_session *session);
122
123	/* Session show handler.
124	 * Pseudowire-specific implementation of debugfs session rendering.
125	 * The callback is called by l2tp_debugfs.c after rendering core session
126	 * information.
127	 */
128	void (*show)(struct seq_file *m, void *priv);
129
130	u8			priv[];		/* private data */
131};
132
133/* L2TP tunnel configuration */
 
 
134struct l2tp_tunnel_cfg {
 
 
135	enum l2tp_encap_type	encap;
136
137	/* Used only for kernel-created sockets */
138	struct in_addr		local_ip;
139	struct in_addr		peer_ip;
140#if IS_ENABLED(CONFIG_IPV6)
141	struct in6_addr		*local_ip6;
142	struct in6_addr		*peer_ip6;
143#endif
144	u16			local_udp_port;
145	u16			peer_udp_port;
146	unsigned int		use_udp_checksums:1,
147				udp6_zero_tx_checksums:1,
148				udp6_zero_rx_checksums:1;
149};
150
151/* Represents a tunnel instance.
152 * Tracks runtime state including IO statistics.
153 * Holds the tunnel socket (either passed from userspace or directly created by the kernel).
154 * Maintains a list of sessions belonging to the tunnel instance.
155 * Is linked into a per-net list of tunnels.
156 */
157#define L2TP_TUNNEL_NAME_MAX 20
158struct l2tp_tunnel {
159	unsigned long		dead;
160
161	struct rcu_head rcu;
162	spinlock_t		list_lock;	/* write-protection for session_list */
163	bool			acpt_newsess;	/* indicates whether this tunnel accepts
164						 * new sessions. Protected by list_lock.
165						 */
166	struct list_head	session_list;	/* list of sessions */
167	u32			tunnel_id;
168	u32			peer_tunnel_id;
169	int			version;	/* 2=>L2TPv2, 3=>L2TPv3 */
170
171	char			name[L2TP_TUNNEL_NAME_MAX]; /* for logging */
 
 
172	enum l2tp_encap_type	encap;
173	struct l2tp_stats	stats;
174
 
175	struct net		*l2tp_net;	/* the net we belong to */
176
177	refcount_t		ref_count;
178	struct sock		*sock;		/* parent socket */
179	int			fd;		/* parent fd, if tunnel socket was created
180						 * by userspace
181						 */
 
 
 
 
 
 
 
182
183	struct work_struct	del_work;
 
 
184};
185
186/* Pseudowire ops callbacks for use with the l2tp genetlink interface */
187struct l2tp_nl_cmd_ops {
188	/* The pseudowire session create callback is responsible for creating a session
189	 * instance for a specific pseudowire type.
190	 * It must call l2tp_session_create and l2tp_session_register to register the
191	 * session instance, as well as carry out any pseudowire-specific initialisation.
192	 * It must return >= 0 on success, or an appropriate negative errno value on failure.
193	 */
194	int (*session_create)(struct net *net, struct l2tp_tunnel *tunnel,
195			      u32 session_id, u32 peer_session_id,
196			      struct l2tp_session_cfg *cfg);
197
198	/* The pseudowire session delete callback is responsible for initiating the deletion
199	 * of a session instance.
200	 * It must call l2tp_session_delete, as well as carry out any pseudowire-specific
201	 * teardown actions.
202	 */
203	void (*session_delete)(struct l2tp_session *session);
204};
205
 
 
 
 
 
206static inline void *l2tp_session_priv(struct l2tp_session *session)
207{
208	return &session->priv[0];
209}
210
211/* Tunnel and session refcounts */
212void l2tp_tunnel_put(struct l2tp_tunnel *tunnel);
213void l2tp_session_put(struct l2tp_session *session);
214
215/* Tunnel and session lookup.
216 * These functions take a reference on the instances they return, so
217 * the caller must ensure that the reference is dropped appropriately.
218 */
219struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
220struct l2tp_tunnel *l2tp_tunnel_get_next(const struct net *net, unsigned long *key);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
222struct l2tp_session *l2tp_v3_session_get(const struct net *net, struct sock *sk, u32 session_id);
223struct l2tp_session *l2tp_v2_session_get(const struct net *net, u16 tunnel_id, u16 session_id);
224struct l2tp_session *l2tp_session_get(const struct net *net, struct sock *sk, int pver,
225				      u32 tunnel_id, u32 session_id);
226struct l2tp_session *l2tp_session_get_next(const struct net *net, struct sock *sk, int pver,
227					   u32 tunnel_id, unsigned long *key);
228struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
229						const char *ifname);
230
231/* Tunnel and session lifetime management.
232 * Creation of a new instance is a two-step process: create, then register.
233 * Destruction is triggered using the *_delete functions, and completes asynchronously.
234 */
235int l2tp_tunnel_create(int fd, int version, u32 tunnel_id,
236		       u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
237		       struct l2tp_tunnel **tunnelp);
238int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
239			 struct l2tp_tunnel_cfg *cfg);
240void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
241
242struct l2tp_session *l2tp_session_create(int priv_size,
243					 struct l2tp_tunnel *tunnel,
244					 u32 session_id, u32 peer_session_id,
245					 struct l2tp_session_cfg *cfg);
246int l2tp_session_register(struct l2tp_session *session,
247			  struct l2tp_tunnel *tunnel);
248void l2tp_session_delete(struct l2tp_session *session);
249
250/* Receive path helpers.  If data sequencing is enabled for the session these
251 * functions handle queuing and reordering prior to passing packets to the
252 * pseudowire code to be passed to userspace.
253 */
254void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
255		      unsigned char *ptr, unsigned char *optr, u16 hdrflags,
256		      int length);
 
257int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
 
 
 
 
258
259/* Transmit path helpers for sending packets over the tunnel socket. */
260void l2tp_session_set_header_len(struct l2tp_session *session, int version,
261				 enum l2tp_encap_type encap);
262int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb);
263
264/* Pseudowire management.
265 * Pseudowires should register with l2tp core on module init, and unregister
266 * on module exit.
267 */
268int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops);
269void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
270
271/* IOCTL helper for IP encap modules. */
272int l2tp_ioctl(struct sock *sk, int cmd, int *karg);
273
274struct l2tp_tunnel *l2tp_sk_to_tunnel(const struct sock *sk);
275
276static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
277{
278	switch (session->l2specific_type) {
279	case L2TP_L2SPECTYPE_DEFAULT:
280		return 4;
281	case L2TP_L2SPECTYPE_NONE:
282	default:
283		return 0;
284	}
285}
286
287static inline u32 l2tp_tunnel_dst_mtu(const struct l2tp_tunnel *tunnel)
288{
289	struct dst_entry *dst;
290	u32 mtu;
291
292	dst = sk_dst_get(tunnel->sock);
293	if (!dst)
294		return 0;
295
296	mtu = dst_mtu(dst);
297	dst_release(dst);
298
299	return mtu;
300}
301
302#ifdef CONFIG_XFRM
303static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
304{
305	struct sock *sk = tunnel->sock;
306
307	return sk && (rcu_access_pointer(sk->sk_policy[0]) ||
308		      rcu_access_pointer(sk->sk_policy[1]));
309}
 
 
 
 
 
 
 
310#else
311static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
312{
313	return false;
314}
315#endif
316
317static inline int l2tp_v3_ensure_opt_in_linear(struct l2tp_session *session, struct sk_buff *skb,
318					       unsigned char **ptr, unsigned char **optr)
319{
320	int opt_len = session->peer_cookie_len + l2tp_get_l2specific_len(session);
321
322	if (opt_len > 0) {
323		int off = *ptr - *optr;
324
325		if (!pskb_may_pull(skb, off + opt_len))
326			return -1;
327
328		if (skb->data != *optr) {
329			*optr = skb->data;
330			*ptr = skb->data + off;
331		}
332	}
333
334	return 0;
335}
336
337#define MODULE_ALIAS_L2TP_PWTYPE(type) \
338	MODULE_ALIAS("net-l2tp-type-" __stringify(type))
339
340#endif /* _L2TP_CORE_H_ */