Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
l2tp
l2tp_core.h
Go to the documentation of this file.
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 */
27
enum
{
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
36
struct
sk_buff
;
37
38
struct
l2tp_stats
{
39
u64
tx_packets
;
40
u64
tx_bytes
;
41
u64
tx_errors
;
42
u64
rx_packets
;
43
u64
rx_bytes
;
44
u64
rx_seq_discards
;
45
u64
rx_oos_packets
;
46
u64
rx_errors
;
47
u64
rx_cookie_discards
;
48
struct
u64_stats_sync
syncp
;
49
};
50
51
struct
l2tp_tunnel
;
52
53
/* Describes a session. Contains information to determine incoming
54
* packets and transmit outgoing ones.
55
*/
56
struct
l2tp_session_cfg
{
57
enum
l2tp_pwtype
pw_type
;
58
unsigned
int
data_seq
:2;
/* data sequencing level
59
* 0 => none, 1 => IP only,
60
* 2 => all
61
*/
62
unsigned
int
recv_seq
:1;
/* expect receive packets with
63
* sequence numbers? */
64
unsigned
int
send_seq
:1;
/* send packets with sequence
65
* numbers? */
66
unsigned
int
lns_mode
:1;
/* behave as LNS? LAC enables
67
* sequence numbers under
68
* control of LNS. */
69
int
debug
;
/* bitmask of debug message
70
* categories */
71
u16
vlan_id
;
/* VLAN pseudowire only */
72
u16
offset
;
/* offset to payload */
73
u16
l2specific_len
;
/* Layer 2 specific length */
74
u16
l2specific_type
;
/* Layer 2 specific type */
75
u8
cookie
[8];
/* optional cookie */
76
int
cookie_len
;
/* 0, 4 or 8 bytes */
77
u8
peer_cookie
[8];
/* peer's cookie */
78
int
peer_cookie_len
;
/* 0, 4 or 8 bytes */
79
int
reorder_timeout
;
/* configured reorder timeout
80
* (in jiffies) */
81
int
mtu
;
82
int
mru
;
83
char
*
ifname
;
84
};
85
86
struct
l2tp_session
{
87
int
magic
;
/* should be
88
* L2TP_SESSION_MAGIC */
89
90
struct
l2tp_tunnel
*
tunnel
;
/* back pointer to tunnel
91
* context */
92
u32
session_id
;
93
u32
peer_session_id
;
94
u8
cookie
[8];
95
int
cookie_len
;
96
u8
peer_cookie
[8];
97
int
peer_cookie_len
;
98
u16
offset
;
/* offset from end of L2TP header
99
to beginning of data */
100
u16
l2specific_len
;
101
u16
l2specific_type
;
102
u16
hdr_len
;
103
u32
nr
;
/* session NR state (receive) */
104
u32
ns
;
/* session NR state (send) */
105
struct
sk_buff_head
reorder_q
;
/* receive reorder queue */
106
struct
hlist_node
hlist
;
/* Hash list node */
107
atomic_t
ref_count
;
108
109
char
name
[32];
/* for logging */
110
char
ifname
[
IFNAMSIZ
];
111
unsigned
int
data_seq
:2;
/* data sequencing level
112
* 0 => none, 1 => IP only,
113
* 2 => all
114
*/
115
unsigned
int
recv_seq
:1;
/* expect receive packets with
116
* sequence numbers? */
117
unsigned
int
send_seq
:1;
/* send packets with sequence
118
* numbers? */
119
unsigned
int
lns_mode
:1;
/* behave as LNS? LAC enables
120
* sequence numbers under
121
* control of LNS. */
122
int
debug
;
/* bitmask of debug message
123
* categories */
124
int
reorder_timeout
;
/* configured reorder timeout
125
* (in jiffies) */
126
int
reorder_skip
;
/* set if skip to next nr */
127
int
mtu
;
128
int
mru
;
129
enum
l2tp_pwtype
pwtype
;
130
struct
l2tp_stats
stats
;
131
struct
hlist_node
global_hlist
;
/* Global hash list node */
132
133
int
(*
build_header
)(
struct
l2tp_session
*session,
void
*
buf
);
134
void
(*
recv_skb
)(
struct
l2tp_session
*session,
struct
sk_buff
*
skb
,
int
data_len
);
135
void
(*
session_close
)(
struct
l2tp_session
*session);
136
void
(*
ref
)(
struct
l2tp_session
*session);
137
void
(*
deref
)(
struct
l2tp_session
*session);
138
#if defined(CONFIG_L2TP_DEBUGFS) || defined(CONFIG_L2TP_DEBUGFS_MODULE)
139
void
(*show)(
struct
seq_file
*
m
,
void
*
priv
);
140
#endif
141
uint8_t
priv
[0];
/* private data */
142
};
143
144
/* Describes the tunnel. It contains info to track all the associated
145
* sessions so incoming packets can be sorted out
146
*/
147
struct
l2tp_tunnel_cfg
{
148
int
debug
;
/* bitmask of debug message
149
* categories */
150
enum
l2tp_encap_type
encap
;
151
152
/* Used only for kernel-created sockets */
153
struct
in_addr
local_ip
;
154
struct
in_addr
peer_ip
;
155
#if IS_ENABLED(CONFIG_IPV6)
156
struct
in6_addr
*local_ip6;
157
struct
in6_addr
*peer_ip6;
158
#endif
159
u16
local_udp_port
;
160
u16
peer_udp_port
;
161
unsigned
int
use_udp_checksums
:1;
162
};
163
164
struct
l2tp_tunnel
{
165
int
magic
;
/* Should be L2TP_TUNNEL_MAGIC */
166
struct
rcu_head
rcu
;
167
rwlock_t
hlist_lock
;
/* protect session_hlist */
168
struct
hlist_head
session_hlist
[
L2TP_HASH_SIZE
];
169
/* hashed list of sessions,
170
* hashed by id */
171
u32
tunnel_id
;
172
u32
peer_tunnel_id
;
173
int
version
;
/* 2=>L2TPv2, 3=>L2TPv3 */
174
175
char
name
[20];
/* for logging */
176
int
debug
;
/* bitmask of debug message
177
* categories */
178
enum
l2tp_encap_type
encap
;
179
struct
l2tp_stats
stats
;
180
181
struct
list_head
list
;
/* Keep a list of all tunnels */
182
struct
net
*
l2tp_net
;
/* the net we belong to */
183
184
atomic_t
ref_count
;
185
#ifdef CONFIG_DEBUG_FS
186
void
(*show)(
struct
seq_file
*
m
,
void
*
arg
);
187
#endif
188
int
(*
recv_payload_hook
)(
struct
sk_buff
*
skb
);
189
void
(*
old_sk_destruct
)(
struct
sock
*);
190
struct
sock
*
sock
;
/* Parent socket */
191
int
fd
;
192
193
uint8_t
priv
[0];
/* private data */
194
};
195
196
struct
l2tp_nl_cmd_ops
{
197
int
(*
session_create
)(
struct
net
*
net
,
u32
tunnel_id,
u32
session_id,
u32
peer_session_id,
struct
l2tp_session_cfg
*
cfg
);
198
int
(*
session_delete
)(
struct
l2tp_session
*session);
199
};
200
201
static
inline
void
*l2tp_tunnel_priv(
struct
l2tp_tunnel
*
tunnel
)
202
{
203
return
&tunnel->
priv
[0];
204
}
205
206
static
inline
void
*l2tp_session_priv(
struct
l2tp_session
*session)
207
{
208
return
&session->
priv
[0];
209
}
210
211
static
inline
struct
l2tp_tunnel
*l2tp_sock_to_tunnel(
struct
sock
*
sk
)
212
{
213
struct
l2tp_tunnel
*tunnel;
214
215
if
(sk ==
NULL
)
216
return
NULL
;
217
218
sock_hold(sk);
219
tunnel = (
struct
l2tp_tunnel
*)(sk->
sk_user_data
);
220
if
(tunnel ==
NULL
) {
221
sock_put(sk);
222
goto
out
;
223
}
224
225
BUG_ON
(tunnel->
magic
!=
L2TP_TUNNEL_MAGIC
);
226
227
out
:
228
return
tunnel;
229
}
230
231
extern
struct
l2tp_session
*
l2tp_session_find
(
struct
net
*
net
,
struct
l2tp_tunnel
*tunnel,
u32
session_id
);
232
extern
struct
l2tp_session
*
l2tp_session_find_nth
(
struct
l2tp_tunnel
*tunnel,
int
nth);
233
extern
struct
l2tp_session
*
l2tp_session_find_by_ifname
(
struct
net
*
net
,
char
*
ifname
);
234
extern
struct
l2tp_tunnel
*
l2tp_tunnel_find
(
struct
net
*
net
,
u32
tunnel_id
);
235
extern
struct
l2tp_tunnel
*
l2tp_tunnel_find_nth
(
struct
net
*
net
,
int
nth);
236
237
extern
int
l2tp_tunnel_create
(
struct
net
*
net
,
int
fd
,
int
version
,
u32
tunnel_id
,
u32
peer_tunnel_id
,
struct
l2tp_tunnel_cfg
*
cfg
,
struct
l2tp_tunnel
**tunnelp);
238
extern
int
l2tp_tunnel_delete
(
struct
l2tp_tunnel
*tunnel);
239
extern
struct
l2tp_session
*
l2tp_session_create
(
int
priv_size,
struct
l2tp_tunnel
*tunnel,
u32
session_id
,
u32
peer_session_id
,
struct
l2tp_session_cfg
*
cfg
);
240
extern
int
l2tp_session_delete
(
struct
l2tp_session
*session);
241
extern
void
l2tp_session_free
(
struct
l2tp_session
*session);
242
extern
void
l2tp_recv_common
(
struct
l2tp_session
*session,
struct
sk_buff
*
skb
,
unsigned
char
*
ptr
,
unsigned
char
*optr,
u16
hdrflags,
int
length
,
int
(*payload_hook)(
struct
sk_buff
*skb));
243
extern
int
l2tp_udp_encap_recv
(
struct
sock
*sk,
struct
sk_buff
*skb);
244
245
extern
int
l2tp_xmit_skb
(
struct
l2tp_session
*session,
struct
sk_buff
*skb,
int
hdr_len
);
246
247
extern
int
l2tp_nl_register_ops
(
enum
l2tp_pwtype
pw_type,
const
struct
l2tp_nl_cmd_ops
*ops);
248
extern
void
l2tp_nl_unregister_ops
(
enum
l2tp_pwtype
pw_type);
249
250
/* Session reference counts. Incremented when code obtains a reference
251
* to a session.
252
*/
253
static
inline
void
l2tp_session_inc_refcount_1(
struct
l2tp_session
*session)
254
{
255
atomic_inc
(&session->
ref_count
);
256
}
257
258
static
inline
void
l2tp_session_dec_refcount_1(
struct
l2tp_session
*session)
259
{
260
if
(
atomic_dec_and_test
(&session->
ref_count
))
261
l2tp_session_free
(session);
262
}
263
264
#ifdef L2TP_REFCNT_DEBUG
265
#define l2tp_session_inc_refcount(_s) \
266
do { \
267
pr_debug("l2tp_session_inc_refcount: %s:%d %s: cnt=%d\n", \
268
__func__, __LINE__, (_s)->name, \
269
atomic_read(&_s->ref_count)); \
270
l2tp_session_inc_refcount_1(_s); \
271
} while (0)
272
#define l2tp_session_dec_refcount(_s) \
273
do { \
274
pr_debug("l2tp_session_dec_refcount: %s:%d %s: cnt=%d\n", \
275
__func__, __LINE__, (_s)->name, \
276
atomic_read(&_s->ref_count)); \
277
l2tp_session_dec_refcount_1(_s); \
278
} while (0)
279
#else
280
#define l2tp_session_inc_refcount(s) l2tp_session_inc_refcount_1(s)
281
#define l2tp_session_dec_refcount(s) l2tp_session_dec_refcount_1(s)
282
#endif
283
284
#define l2tp_printk(ptr, type, func, fmt, ...) \
285
do { \
286
if (((ptr)->debug) & (type)) \
287
func(fmt, ##__VA_ARGS__); \
288
} while (0)
289
290
#define l2tp_warn(ptr, type, fmt, ...) \
291
l2tp_printk(ptr, type, pr_warn, fmt, ##__VA_ARGS__)
292
#define l2tp_info(ptr, type, fmt, ...) \
293
l2tp_printk(ptr, type, pr_info, fmt, ##__VA_ARGS__)
294
#define l2tp_dbg(ptr, type, fmt, ...) \
295
l2tp_printk(ptr, type, pr_debug, fmt, ##__VA_ARGS__)
296
297
#endif
/* _L2TP_CORE_H_ */
Generated on Thu Jan 10 2013 14:59:49 for Linux Kernel by
1.8.2