l2tp: cleanup comments
[linux-2.6-block.git] / net / l2tp / l2tp_core.h
CommitLineData
d2912cb1 1/* SPDX-License-Identifier: GPL-2.0-only */
20dcb110 2/* L2TP internal definitions.
fd558d18
JC
3 *
4 * Copyright (c) 2008,2009 Katalix Systems Ltd
fd558d18 5 */
fbea9e07 6#include <linux/refcount.h>
fd558d18
JC
7
8#ifndef _L2TP_CORE_H_
9#define _L2TP_CORE_H_
10
1f5cd2a0
GN
11#include <net/dst.h>
12#include <net/sock.h>
13
d6a61ec9
GN
14#ifdef CONFIG_XFRM
15#include <net/xfrm.h>
16#endif
17
fd558d18
JC
18/* Just some random numbers */
19#define L2TP_TUNNEL_MAGIC 0x42114DDA
20#define L2TP_SESSION_MAGIC 0x0C04EB7D
21
f7faffa3 22/* Per tunnel, session hash table size */
fd558d18
JC
23#define L2TP_HASH_BITS 4
24#define L2TP_HASH_SIZE (1 << L2TP_HASH_BITS)
25
f7faffa3
JC
26/* System-wide, session hash table size */
27#define L2TP_HASH_BITS_2 8
28#define L2TP_HASH_SIZE_2 (1 << L2TP_HASH_BITS_2)
29
fd558d18
JC
30struct sk_buff;
31
32struct l2tp_stats {
7b7c0719
TP
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;
fd558d18
JC
42};
43
44struct l2tp_tunnel;
45
46/* Describes a session. Contains information to determine incoming
47 * packets and transmit outgoing ones.
48 */
49struct l2tp_session_cfg {
f7faffa3 50 enum l2tp_pwtype pw_type;
20dcb110
TP
51 unsigned int recv_seq:1; /* expect receive packets with sequence numbers? */
52 unsigned int send_seq:1; /* send packets with sequence numbers? */
53 unsigned int lns_mode:1; /* behave as LNS?
54 * LAC enables sequence numbers under LNS control.
55 */
56 int debug; /* bitmask of debug message categories */
f7faffa3
JC
57 u16 l2specific_type; /* Layer 2 specific type */
58 u8 cookie[8]; /* optional cookie */
59 int cookie_len; /* 0, 4 or 8 bytes */
60 u8 peer_cookie[8]; /* peer's cookie */
61 int peer_cookie_len; /* 0, 4 or 8 bytes */
20dcb110 62 int reorder_timeout; /* configured reorder timeout (in jiffies) */
309795f4 63 char *ifname;
fd558d18
JC
64};
65
66struct l2tp_session {
20dcb110 67 int magic; /* should be L2TP_SESSION_MAGIC */
b228a940 68 long dead;
fd558d18 69
20dcb110 70 struct l2tp_tunnel *tunnel; /* back pointer to tunnel context */
fd558d18
JC
71 u32 session_id;
72 u32 peer_session_id;
f7faffa3
JC
73 u8 cookie[8];
74 int cookie_len;
75 u8 peer_cookie[8];
76 int peer_cookie_len;
f7faffa3
JC
77 u16 l2specific_type;
78 u16 hdr_len;
79 u32 nr; /* session NR state (receive) */
80 u32 ns; /* session NR state (send) */
fd558d18 81 struct sk_buff_head reorder_q; /* receive reorder queue */
8a1631d5
JC
82 u32 nr_max; /* max NR. Depends on tunnel */
83 u32 nr_window_size; /* NR window size */
a0dbd822 84 u32 nr_oos; /* NR of last OOS packet */
20dcb110 85 int nr_oos_count; /* for OOS recovery */
a0dbd822 86 int nr_oos_count_max;
20dcb110 87 struct hlist_node hlist; /* hash list node */
f00c854c 88 refcount_t ref_count;
fd558d18
JC
89
90 char name[32]; /* for logging */
309795f4 91 char ifname[IFNAMSIZ];
20dcb110
TP
92 unsigned int recv_seq:1; /* expect receive packets with sequence numbers? */
93 unsigned int send_seq:1; /* send packets with sequence numbers? */
94 unsigned int lns_mode:1; /* behave as LNS?
95 * LAC enables sequence numbers under LNS control.
96 */
97 int debug; /* bitmask of debug message categories */
98 int reorder_timeout; /* configured reorder timeout (in jiffies) */
38d40b3f 99 int reorder_skip; /* set if skip to next nr */
f7faffa3 100 enum l2tp_pwtype pwtype;
fd558d18 101 struct l2tp_stats stats;
20dcb110 102 struct hlist_node global_hlist; /* global hash list node */
fd558d18 103
f7faffa3 104 int (*build_header)(struct l2tp_session *session, void *buf);
fd558d18
JC
105 void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
106 void (*session_close)(struct l2tp_session *session);
0ad66140 107 void (*show)(struct seq_file *m, void *priv);
20dcb110 108 u8 priv[]; /* private data */
fd558d18
JC
109};
110
111/* Describes the tunnel. It contains info to track all the associated
112 * sessions so incoming packets can be sorted out
113 */
114struct l2tp_tunnel_cfg {
20dcb110 115 int debug; /* bitmask of debug message categories */
0d76751f 116 enum l2tp_encap_type encap;
789a4a2c
JC
117
118 /* Used only for kernel-created sockets */
119 struct in_addr local_ip;
120 struct in_addr peer_ip;
f9bac8df
CE
121#if IS_ENABLED(CONFIG_IPV6)
122 struct in6_addr *local_ip6;
123 struct in6_addr *peer_ip6;
124#endif
789a4a2c
JC
125 u16 local_udp_port;
126 u16 peer_udp_port;
6b649fea
TH
127 unsigned int use_udp_checksums:1,
128 udp6_zero_tx_checksums:1,
129 udp6_zero_rx_checksums:1;
fd558d18
JC
130};
131
132struct l2tp_tunnel {
133 int magic; /* Should be L2TP_TUNNEL_MAGIC */
62b982ee
SD
134
135 unsigned long dead;
136
99469c32 137 struct rcu_head rcu;
fd558d18 138 rwlock_t hlist_lock; /* protect session_hlist */
20dcb110
TP
139 bool acpt_newsess; /* indicates whether this tunnel accepts
140 * new sessions. Protected by hlist_lock.
f3c66d4e 141 */
fd558d18 142 struct hlist_head session_hlist[L2TP_HASH_SIZE];
20dcb110 143 /* hashed list of sessions, hashed by id */
fd558d18
JC
144 u32 tunnel_id;
145 u32 peer_tunnel_id;
146 int version; /* 2=>L2TPv2, 3=>L2TPv3 */
147
148 char name[20]; /* for logging */
20dcb110 149 int debug; /* bitmask of debug message categories */
0d76751f 150 enum l2tp_encap_type encap;
fd558d18
JC
151 struct l2tp_stats stats;
152
20dcb110 153 struct list_head list; /* list node on per-namespace list of tunnels */
fd558d18
JC
154 struct net *l2tp_net; /* the net we belong to */
155
fbea9e07 156 refcount_t ref_count;
fd558d18 157 void (*old_sk_destruct)(struct sock *);
20dcb110
TP
158 struct sock *sock; /* parent socket */
159 int fd; /* parent fd, if tunnel socket was created
160 * by userspace
161 */
fd558d18 162
f8ccac0e 163 struct work_struct del_work;
fd558d18
JC
164};
165
309795f4 166struct l2tp_nl_cmd_ops {
f026bc29
GN
167 int (*session_create)(struct net *net, struct l2tp_tunnel *tunnel,
168 u32 session_id, u32 peer_session_id,
169 struct l2tp_session_cfg *cfg);
309795f4
JC
170 int (*session_delete)(struct l2tp_session *session);
171};
172
fd558d18
JC
173static inline void *l2tp_session_priv(struct l2tp_session *session)
174{
175 return &session->priv[0];
176}
177
54652eb1 178struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
5846c131 179struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth);
01e28b92
GN
180struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel,
181 u32 session_id);
5846c131 182
d00fa9ad 183void l2tp_tunnel_free(struct l2tp_tunnel *tunnel);
54652eb1 184
01e28b92 185struct l2tp_session *l2tp_session_get(const struct net *net, u32 session_id);
a4346210 186struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth);
9aaef50c 187struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
a4346210 188 const char *ifname);
c1b1203d
JP
189
190int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id,
191 u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
192 struct l2tp_tunnel **tunnelp);
6b9f3423
GN
193int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
194 struct l2tp_tunnel_cfg *cfg);
195
62b982ee 196void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
c1b1203d
JP
197struct l2tp_session *l2tp_session_create(int priv_size,
198 struct l2tp_tunnel *tunnel,
199 u32 session_id, u32 peer_session_id,
200 struct l2tp_session_cfg *cfg);
3953ae7b
GN
201int l2tp_session_register(struct l2tp_session *session,
202 struct l2tp_tunnel *tunnel);
203
c1b1203d
JP
204void __l2tp_session_unhash(struct l2tp_session *session);
205int l2tp_session_delete(struct l2tp_session *session);
206void l2tp_session_free(struct l2tp_session *session);
207void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
208 unsigned char *ptr, unsigned char *optr, u16 hdrflags,
2b139e6b 209 int length);
c1b1203d 210int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
bb5016ea 211void l2tp_session_set_header_len(struct l2tp_session *session, int version);
c1b1203d
JP
212
213int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb,
214 int hdr_len);
215
216int l2tp_nl_register_ops(enum l2tp_pwtype pw_type,
217 const struct l2tp_nl_cmd_ops *ops);
218void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
72fb96e7 219int l2tp_ioctl(struct sock *sk, int cmd, unsigned long arg);
309795f4 220
54652eb1
GN
221static inline void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel)
222{
223 refcount_inc(&tunnel->ref_count);
224}
225
226static inline void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel)
227{
228 if (refcount_dec_and_test(&tunnel->ref_count))
d00fa9ad 229 l2tp_tunnel_free(tunnel);
54652eb1
GN
230}
231
fd558d18
JC
232/* Session reference counts. Incremented when code obtains a reference
233 * to a session.
234 */
9ff672ba 235static inline void l2tp_session_inc_refcount(struct l2tp_session *session)
fd558d18 236{
f00c854c 237 refcount_inc(&session->ref_count);
fd558d18
JC
238}
239
9ff672ba 240static inline void l2tp_session_dec_refcount(struct l2tp_session *session)
fd558d18 241{
f00c854c 242 if (refcount_dec_and_test(&session->ref_count))
fd558d18
JC
243 l2tp_session_free(session);
244}
245
62e7b6a5
LB
246static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
247{
248 switch (session->l2specific_type) {
249 case L2TP_L2SPECTYPE_DEFAULT:
250 return 4;
251 case L2TP_L2SPECTYPE_NONE:
252 default:
253 return 0;
254 }
255}
256
1f5cd2a0
GN
257static inline u32 l2tp_tunnel_dst_mtu(const struct l2tp_tunnel *tunnel)
258{
259 struct dst_entry *dst;
260 u32 mtu;
261
262 dst = sk_dst_get(tunnel->sock);
263 if (!dst)
264 return 0;
265
266 mtu = dst_mtu(dst);
267 dst_release(dst);
268
269 return mtu;
270}
271
d6a61ec9
GN
272#ifdef CONFIG_XFRM
273static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
274{
275 struct sock *sk = tunnel->sock;
276
277 return sk && (rcu_access_pointer(sk->sk_policy[0]) ||
278 rcu_access_pointer(sk->sk_policy[1]));
279}
280#else
281static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
282{
283 return false;
284}
285#endif
286
4522a70d
JW
287static inline int l2tp_v3_ensure_opt_in_linear(struct l2tp_session *session, struct sk_buff *skb,
288 unsigned char **ptr, unsigned char **optr)
289{
290 int opt_len = session->peer_cookie_len + l2tp_get_l2specific_len(session);
291
292 if (opt_len > 0) {
293 int off = *ptr - *optr;
294
295 if (!pskb_may_pull(skb, off + opt_len))
296 return -1;
297
298 if (skb->data != *optr) {
299 *optr = skb->data;
300 *ptr = skb->data + off;
301 }
302 }
303
304 return 0;
305}
306
a4ca44fa
JP
307#define l2tp_printk(ptr, type, func, fmt, ...) \
308do { \
309 if (((ptr)->debug) & (type)) \
310 func(fmt, ##__VA_ARGS__); \
311} while (0)
312
313#define l2tp_warn(ptr, type, fmt, ...) \
314 l2tp_printk(ptr, type, pr_warn, fmt, ##__VA_ARGS__)
315#define l2tp_info(ptr, type, fmt, ...) \
316 l2tp_printk(ptr, type, pr_info, fmt, ##__VA_ARGS__)
317#define l2tp_dbg(ptr, type, fmt, ...) \
318 l2tp_printk(ptr, type, pr_debug, fmt, ##__VA_ARGS__)
319
f1f39f91 320#define MODULE_ALIAS_L2TP_PWTYPE(type) \
321 MODULE_ALIAS("net-l2tp-type-" __stringify(type))
322
fd558d18 323#endif /* _L2TP_CORE_H_ */