Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
v6.8
  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_TUNNEL_MAGIC	0x42114DDA
 20#define L2TP_SESSION_MAGIC	0x0C04EB7D
 21
 22/* Per tunnel session hash table size */
 23#define L2TP_HASH_BITS	4
 24#define L2TP_HASH_SIZE	BIT(L2TP_HASH_BITS)
 25
 26/* System-wide session hash table size */
 27#define L2TP_HASH_BITS_2	8
 28#define L2TP_HASH_SIZE_2	BIT(L2TP_HASH_BITS_2)
 
 
 
 
 
 
 
 
 
 
 29
 30struct sk_buff;
 31
 32struct l2tp_stats {
 33	atomic_long_t		tx_packets;
 34	atomic_long_t		tx_bytes;
 35	atomic_long_t		tx_errors;
 36	atomic_long_t		rx_packets;
 37	atomic_long_t		rx_bytes;
 38	atomic_long_t		rx_seq_discards;
 39	atomic_long_t		rx_oos_packets;
 40	atomic_long_t		rx_errors;
 41	atomic_long_t		rx_cookie_discards;
 42	atomic_long_t		rx_invalid;
 43};
 44
 45struct l2tp_tunnel;
 46
 47/* L2TP session configuration */
 
 
 48struct l2tp_session_cfg {
 49	enum l2tp_pwtype	pw_type;
 50	unsigned int		recv_seq:1;	/* expect receive packets with sequence numbers? */
 51	unsigned int		send_seq:1;	/* send packets with sequence numbers? */
 52	unsigned int		lns_mode:1;	/* behave as LNS?
 53						 * LAC enables sequence numbers under LNS control.
 54						 */
 
 
 
 
 
 
 
 
 
 
 
 
 55	u16			l2specific_type; /* Layer 2 specific type */
 56	u8			cookie[8];	/* optional cookie */
 57	int			cookie_len;	/* 0, 4 or 8 bytes */
 58	u8			peer_cookie[8];	/* peer's cookie */
 59	int			peer_cookie_len; /* 0, 4 or 8 bytes */
 60	int			reorder_timeout; /* configured reorder timeout (in jiffies) */
 
 
 
 61	char			*ifname;
 62};
 63
 64/* Represents a session (pseudowire) instance.
 65 * Tracks runtime state including cookies, dataplane packet sequencing, and IO statistics.
 66 * Is linked into a per-tunnel session hashlist; and in the case of an L2TPv3 session into
 67 * an additional per-net ("global") hashlist.
 68 */
 69#define L2TP_SESSION_NAME_MAX 32
 70struct l2tp_session {
 71	int			magic;		/* should be L2TP_SESSION_MAGIC */
 72	long			dead;
 73
 74	struct l2tp_tunnel	*tunnel;	/* back pointer to tunnel context */
 
 75	u32			session_id;
 76	u32			peer_session_id;
 77	u8			cookie[8];
 78	int			cookie_len;
 79	u8			peer_cookie[8];
 80	int			peer_cookie_len;
 
 
 
 81	u16			l2specific_type;
 82	u16			hdr_len;
 83	u32			nr;		/* session NR state (receive) */
 84	u32			ns;		/* session NR state (send) */
 85	struct sk_buff_head	reorder_q;	/* receive reorder queue */
 86	u32			nr_max;		/* max NR. Depends on tunnel */
 87	u32			nr_window_size;	/* NR window size */
 88	u32			nr_oos;		/* NR of last OOS packet */
 89	int			nr_oos_count;	/* for OOS recovery */
 90	int			nr_oos_count_max;
 91	struct hlist_node	hlist;		/* hash list node */
 92	refcount_t		ref_count;
 93
 94	char			name[L2TP_SESSION_NAME_MAX]; /* for logging */
 95	char			ifname[IFNAMSIZ];
 96	unsigned int		recv_seq:1;	/* expect receive packets with sequence numbers? */
 97	unsigned int		send_seq:1;	/* send packets with sequence numbers? */
 98	unsigned int		lns_mode:1;	/* behave as LNS?
 99						 * LAC enables sequence numbers under LNS control.
100						 */
101	int			reorder_timeout; /* configured reorder timeout (in jiffies) */
 
 
 
 
 
 
 
 
 
 
102	int			reorder_skip;	/* set if skip to next nr */
 
 
103	enum l2tp_pwtype	pwtype;
104	struct l2tp_stats	stats;
105	struct hlist_node	global_hlist;	/* global hash list node */
106
107	/* Session receive handler for data packets.
108	 * Each pseudowire implementation should implement this callback in order to
109	 * handle incoming packets.  Packets are passed to the pseudowire handler after
110	 * reordering, if data sequence numbers are enabled for the session.
111	 */
112	void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
113
114	/* Session close handler.
115	 * Each pseudowire implementation may implement this callback in order to carry
116	 * out pseudowire-specific shutdown actions.
117	 * The callback is called by core after unhashing the session and purging its
118	 * reorder queue.
119	 */
120	void (*session_close)(struct l2tp_session *session);
121
122	/* Session show handler.
123	 * Pseudowire-specific implementation of debugfs session rendering.
124	 * The callback is called by l2tp_debugfs.c after rendering core session
125	 * information.
126	 */
127	void (*show)(struct seq_file *m, void *priv);
128
129	u8			priv[];		/* private data */
130};
131
132/* L2TP tunnel configuration */
 
 
133struct l2tp_tunnel_cfg {
 
 
134	enum l2tp_encap_type	encap;
135
136	/* Used only for kernel-created sockets */
137	struct in_addr		local_ip;
138	struct in_addr		peer_ip;
139#if IS_ENABLED(CONFIG_IPV6)
140	struct in6_addr		*local_ip6;
141	struct in6_addr		*peer_ip6;
142#endif
143	u16			local_udp_port;
144	u16			peer_udp_port;
145	unsigned int		use_udp_checksums:1,
146				udp6_zero_tx_checksums:1,
147				udp6_zero_rx_checksums:1;
148};
149
150/* Represents a tunnel instance.
151 * Tracks runtime state including IO statistics.
152 * Holds the tunnel socket (either passed from userspace or directly created by the kernel).
153 * Maintains a hashlist of sessions belonging to the tunnel instance.
154 * Is linked into a per-net list of tunnels.
155 */
156#define L2TP_TUNNEL_NAME_MAX 20
157struct l2tp_tunnel {
158	int			magic;		/* Should be L2TP_TUNNEL_MAGIC */
159
160	unsigned long		dead;
161
162	struct rcu_head rcu;
163	spinlock_t		hlist_lock;	/* write-protection for session_hlist */
164	bool			acpt_newsess;	/* indicates whether this tunnel accepts
165						 * new sessions. Protected by hlist_lock.
166						 */
167	struct hlist_head	session_hlist[L2TP_HASH_SIZE];
168						/* hashed list of sessions, hashed by id */
 
169	u32			tunnel_id;
170	u32			peer_tunnel_id;
171	int			version;	/* 2=>L2TPv2, 3=>L2TPv3 */
172
173	char			name[L2TP_TUNNEL_NAME_MAX]; /* for logging */
 
 
174	enum l2tp_encap_type	encap;
175	struct l2tp_stats	stats;
176
177	struct list_head	list;		/* list node on per-namespace list of tunnels */
178	struct net		*l2tp_net;	/* the net we belong to */
179
180	refcount_t		ref_count;
181	void (*old_sk_destruct)(struct sock *sk);
182	struct sock		*sock;		/* parent socket */
183	int			fd;		/* parent fd, if tunnel socket was created
184						 * by userspace
185						 */
 
 
 
 
 
 
186
187	struct work_struct	del_work;
 
 
188};
189
190/* Pseudowire ops callbacks for use with the l2tp genetlink interface */
191struct l2tp_nl_cmd_ops {
192	/* The pseudowire session create callback is responsible for creating a session
193	 * instance for a specific pseudowire type.
194	 * It must call l2tp_session_create and l2tp_session_register to register the
195	 * session instance, as well as carry out any pseudowire-specific initialisation.
196	 * It must return >= 0 on success, or an appropriate negative errno value on failure.
197	 */
198	int (*session_create)(struct net *net, struct l2tp_tunnel *tunnel,
199			      u32 session_id, u32 peer_session_id,
200			      struct l2tp_session_cfg *cfg);
201
202	/* The pseudowire session delete callback is responsible for initiating the deletion
203	 * of a session instance.
204	 * It must call l2tp_session_delete, as well as carry out any pseudowire-specific
205	 * teardown actions.
206	 */
207	void (*session_delete)(struct l2tp_session *session);
208};
209
 
 
 
 
 
210static inline void *l2tp_session_priv(struct l2tp_session *session)
211{
212	return &session->priv[0];
213}
214
215/* Tunnel and session refcounts */
216void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel);
217void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel);
218void l2tp_session_inc_refcount(struct l2tp_session *session);
219void l2tp_session_dec_refcount(struct l2tp_session *session);
220
221/* Tunnel and session lookup.
222 * These functions take a reference on the instances they return, so
223 * the caller must ensure that the reference is dropped appropriately.
224 */
225struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
226struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth);
227struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel,
228					     u32 session_id);
229
230struct l2tp_session *l2tp_session_get(const struct net *net, u32 session_id);
231struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth);
232struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
233						const char *ifname);
234
235/* Tunnel and session lifetime management.
236 * Creation of a new instance is a two-step process: create, then register.
237 * Destruction is triggered using the *_delete functions, and completes asynchronously.
238 */
239int l2tp_tunnel_create(int fd, int version, u32 tunnel_id,
 
 
 
 
240		       u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
241		       struct l2tp_tunnel **tunnelp);
242int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
243			 struct l2tp_tunnel_cfg *cfg);
244void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
245
246struct l2tp_session *l2tp_session_create(int priv_size,
247					 struct l2tp_tunnel *tunnel,
248					 u32 session_id, u32 peer_session_id,
249					 struct l2tp_session_cfg *cfg);
250int l2tp_session_register(struct l2tp_session *session,
251			  struct l2tp_tunnel *tunnel);
252void l2tp_session_delete(struct l2tp_session *session);
253
254/* Receive path helpers.  If data sequencing is enabled for the session these
255 * functions handle queuing and reordering prior to passing packets to the
256 * pseudowire code to be passed to userspace.
257 */
258void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
259		      unsigned char *ptr, unsigned char *optr, u16 hdrflags,
260		      int length);
 
261int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
262
263/* Transmit path helpers for sending packets over the tunnel socket. */
264void l2tp_session_set_header_len(struct l2tp_session *session, int version);
265int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb);
266
267/* Pseudowire management.
268 * Pseudowires should register with l2tp core on module init, and unregister
269 * on module exit.
270 */
271int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops);
272void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
273
274/* IOCTL helper for IP encap modules. */
275int l2tp_ioctl(struct sock *sk, int cmd, int *karg);
 
276
277/* Extract the tunnel structure from a socket's sk_user_data pointer,
278 * validating the tunnel magic feather.
279 */
280struct l2tp_tunnel *l2tp_sk_to_tunnel(struct sock *sk);
281
282static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
283{
284	switch (session->l2specific_type) {
285	case L2TP_L2SPECTYPE_DEFAULT:
286		return 4;
287	case L2TP_L2SPECTYPE_NONE:
288	default:
289		return 0;
290	}
291}
292
293static inline u32 l2tp_tunnel_dst_mtu(const struct l2tp_tunnel *tunnel)
294{
295	struct dst_entry *dst;
296	u32 mtu;
297
298	dst = sk_dst_get(tunnel->sock);
299	if (!dst)
300		return 0;
301
302	mtu = dst_mtu(dst);
303	dst_release(dst);
304
305	return mtu;
306}
307
308#ifdef CONFIG_XFRM
309static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
310{
311	struct sock *sk = tunnel->sock;
312
313	return sk && (rcu_access_pointer(sk->sk_policy[0]) ||
314		      rcu_access_pointer(sk->sk_policy[1]));
315}
 
 
 
 
 
 
 
316#else
317static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
318{
319	return false;
320}
321#endif
322
323static inline int l2tp_v3_ensure_opt_in_linear(struct l2tp_session *session, struct sk_buff *skb,
324					       unsigned char **ptr, unsigned char **optr)
325{
326	int opt_len = session->peer_cookie_len + l2tp_get_l2specific_len(session);
327
328	if (opt_len > 0) {
329		int off = *ptr - *optr;
330
331		if (!pskb_may_pull(skb, off + opt_len))
332			return -1;
333
334		if (skb->data != *optr) {
335			*optr = skb->data;
336			*ptr = skb->data + off;
337		}
338	}
339
340	return 0;
341}
342
343#define MODULE_ALIAS_L2TP_PWTYPE(type) \
344	MODULE_ALIAS("net-l2tp-type-" __stringify(type))
345
346#endif /* _L2TP_CORE_H_ */
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_ */