1
2
3
4
5
6
7
8
9
10#include <linux/refcount.h>
11
12#ifndef _L2TP_CORE_H_
13#define _L2TP_CORE_H_
14
15
16#define L2TP_TUNNEL_MAGIC 0x42114DDA
17#define L2TP_SESSION_MAGIC 0x0C04EB7D
18
19
20#define L2TP_HASH_BITS 4
21#define L2TP_HASH_SIZE (1 << L2TP_HASH_BITS)
22
23
24#define L2TP_HASH_BITS_2 8
25#define L2TP_HASH_SIZE_2 (1 << L2TP_HASH_BITS_2)
26
27struct sk_buff;
28
29struct l2tp_stats {
30 atomic_long_t tx_packets;
31 atomic_long_t tx_bytes;
32 atomic_long_t tx_errors;
33 atomic_long_t rx_packets;
34 atomic_long_t rx_bytes;
35 atomic_long_t rx_seq_discards;
36 atomic_long_t rx_oos_packets;
37 atomic_long_t rx_errors;
38 atomic_long_t rx_cookie_discards;
39};
40
41struct l2tp_tunnel;
42
43
44
45
46struct l2tp_session_cfg {
47 enum l2tp_pwtype pw_type;
48 unsigned int data_seq:2;
49
50
51
52 unsigned int recv_seq:1;
53
54 unsigned int send_seq:1;
55
56 unsigned int lns_mode:1;
57
58
59 int debug;
60
61 u16 vlan_id;
62 u16 l2specific_type;
63 u8 cookie[8];
64 int cookie_len;
65 u8 peer_cookie[8];
66 int peer_cookie_len;
67 int reorder_timeout;
68
69 int mtu;
70 int mru;
71 char *ifname;
72};
73
74struct l2tp_session {
75 int magic;
76
77 long dead;
78
79 struct l2tp_tunnel *tunnel;
80
81 u32 session_id;
82 u32 peer_session_id;
83 u8 cookie[8];
84 int cookie_len;
85 u8 peer_cookie[8];
86 int peer_cookie_len;
87 u16 l2specific_type;
88 u16 hdr_len;
89 u32 nr;
90 u32 ns;
91 struct sk_buff_head reorder_q;
92 u32 nr_max;
93 u32 nr_window_size;
94 u32 nr_oos;
95 int nr_oos_count;
96 int nr_oos_count_max;
97 struct hlist_node hlist;
98 refcount_t ref_count;
99
100 char name[32];
101 char ifname[IFNAMSIZ];
102 unsigned int data_seq:2;
103
104
105
106 unsigned int recv_seq:1;
107
108 unsigned int send_seq:1;
109
110 unsigned int lns_mode:1;
111
112
113 int debug;
114
115 int reorder_timeout;
116
117 int reorder_skip;
118 int mtu;
119 int mru;
120 enum l2tp_pwtype pwtype;
121 struct l2tp_stats stats;
122 struct hlist_node global_hlist;
123
124 int (*build_header)(struct l2tp_session *session, void *buf);
125 void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
126 void (*session_close)(struct l2tp_session *session);
127#if IS_ENABLED(CONFIG_L2TP_DEBUGFS)
128 void (*show)(struct seq_file *m, void *priv);
129#endif
130 uint8_t priv[0];
131};
132
133
134
135
136struct l2tp_tunnel_cfg {
137 int debug;
138
139 enum l2tp_encap_type encap;
140
141
142 struct in_addr local_ip;
143 struct in_addr peer_ip;
144#if IS_ENABLED(CONFIG_IPV6)
145 struct in6_addr *local_ip6;
146 struct in6_addr *peer_ip6;
147#endif
148 u16 local_udp_port;
149 u16 peer_udp_port;
150 unsigned int use_udp_checksums:1,
151 udp6_zero_tx_checksums:1,
152 udp6_zero_rx_checksums:1;
153};
154
155struct l2tp_tunnel {
156 int magic;
157
158 unsigned long dead;
159
160 struct rcu_head rcu;
161 rwlock_t hlist_lock;
162 bool acpt_newsess;
163
164
165
166 struct hlist_head session_hlist[L2TP_HASH_SIZE];
167
168
169 u32 tunnel_id;
170 u32 peer_tunnel_id;
171 int version;
172
173 char name[20];
174 int debug;
175
176 enum l2tp_encap_type encap;
177 struct l2tp_stats stats;
178
179 struct list_head list;
180 struct net *l2tp_net;
181
182 refcount_t ref_count;
183 void (*old_sk_destruct)(struct sock *);
184 struct sock *sock;
185 int fd;
186
187
188 struct work_struct del_work;
189
190 uint8_t priv[0];
191};
192
193struct l2tp_nl_cmd_ops {
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 int (*session_delete)(struct l2tp_session *session);
198};
199
200static inline void *l2tp_tunnel_priv(struct l2tp_tunnel *tunnel)
201{
202 return &tunnel->priv[0];
203}
204
205static inline void *l2tp_session_priv(struct l2tp_session *session)
206{
207 return &session->priv[0];
208}
209
210struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
211struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth);
212
213void l2tp_tunnel_free(struct l2tp_tunnel *tunnel);
214
215struct l2tp_session *l2tp_session_get(const struct net *net,
216 struct l2tp_tunnel *tunnel,
217 u32 session_id);
218struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth);
219struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
220 const char *ifname);
221
222int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id,
223 u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
224 struct l2tp_tunnel **tunnelp);
225int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
226 struct l2tp_tunnel_cfg *cfg);
227
228void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel);
229void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
230struct l2tp_session *l2tp_session_create(int priv_size,
231 struct l2tp_tunnel *tunnel,
232 u32 session_id, u32 peer_session_id,
233 struct l2tp_session_cfg *cfg);
234int l2tp_session_register(struct l2tp_session *session,
235 struct l2tp_tunnel *tunnel);
236
237void __l2tp_session_unhash(struct l2tp_session *session);
238int l2tp_session_delete(struct l2tp_session *session);
239void l2tp_session_free(struct l2tp_session *session);
240void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
241 unsigned char *ptr, unsigned char *optr, u16 hdrflags,
242 int length);
243int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
244void l2tp_session_set_header_len(struct l2tp_session *session, int version);
245
246int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb,
247 int hdr_len);
248
249int l2tp_nl_register_ops(enum l2tp_pwtype pw_type,
250 const struct l2tp_nl_cmd_ops *ops);
251void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
252int l2tp_ioctl(struct sock *sk, int cmd, unsigned long arg);
253
254static inline void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel)
255{
256 refcount_inc(&tunnel->ref_count);
257}
258
259static inline void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel)
260{
261 if (refcount_dec_and_test(&tunnel->ref_count))
262 l2tp_tunnel_free(tunnel);
263}
264
265
266
267
268static inline void l2tp_session_inc_refcount(struct l2tp_session *session)
269{
270 refcount_inc(&session->ref_count);
271}
272
273static inline void l2tp_session_dec_refcount(struct l2tp_session *session)
274{
275 if (refcount_dec_and_test(&session->ref_count))
276 l2tp_session_free(session);
277}
278
279static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
280{
281 switch (session->l2specific_type) {
282 case L2TP_L2SPECTYPE_DEFAULT:
283 return 4;
284 case L2TP_L2SPECTYPE_NONE:
285 default:
286 return 0;
287 }
288}
289
290static inline int l2tp_v3_ensure_opt_in_linear(struct l2tp_session *session, struct sk_buff *skb,
291 unsigned char **ptr, unsigned char **optr)
292{
293 int opt_len = session->peer_cookie_len + l2tp_get_l2specific_len(session);
294
295 if (opt_len > 0) {
296 int off = *ptr - *optr;
297
298 if (!pskb_may_pull(skb, off + opt_len))
299 return -1;
300
301 if (skb->data != *optr) {
302 *optr = skb->data;
303 *ptr = skb->data + off;
304 }
305 }
306
307 return 0;
308}
309
310#define l2tp_printk(ptr, type, func, fmt, ...) \
311do { \
312 if (((ptr)->debug) & (type)) \
313 func(fmt, ##__VA_ARGS__); \
314} while (0)
315
316#define l2tp_warn(ptr, type, fmt, ...) \
317 l2tp_printk(ptr, type, pr_warn, fmt, ##__VA_ARGS__)
318#define l2tp_info(ptr, type, fmt, ...) \
319 l2tp_printk(ptr, type, pr_info, fmt, ##__VA_ARGS__)
320#define l2tp_dbg(ptr, type, fmt, ...) \
321 l2tp_printk(ptr, type, pr_debug, fmt, ##__VA_ARGS__)
322
323#define MODULE_ALIAS_L2TP_PWTYPE(type) \
324 MODULE_ALIAS("net-l2tp-type-" __stringify(type))
325
326#endif
327