hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/net/l2tp/l2tp_core.h
....@@ -1,11 +1,7 @@
1
-/*
2
- * L2TP internal definitions.
1
+/* SPDX-License-Identifier: GPL-2.0-only */
2
+/* L2TP internal definitions.
33 *
44 * 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.
95 */
106 #include <linux/refcount.h>
117
....@@ -19,17 +15,17 @@
1915 #include <net/xfrm.h>
2016 #endif
2117
22
-/* Just some random numbers */
18
+/* Random numbers used for internal consistency checks of tunnel and session structures */
2319 #define L2TP_TUNNEL_MAGIC 0x42114DDA
2420 #define L2TP_SESSION_MAGIC 0x0C04EB7D
2521
26
-/* Per tunnel, session hash table size */
22
+/* Per tunnel session hash table size */
2723 #define L2TP_HASH_BITS 4
28
-#define L2TP_HASH_SIZE (1 << L2TP_HASH_BITS)
24
+#define L2TP_HASH_SIZE BIT(L2TP_HASH_BITS)
2925
30
-/* System-wide, session hash table size */
26
+/* System-wide session hash table size */
3127 #define L2TP_HASH_BITS_2 8
32
-#define L2TP_HASH_SIZE_2 (1 << L2TP_HASH_BITS_2)
28
+#define L2TP_HASH_SIZE_2 BIT(L2TP_HASH_BITS_2)
3329
3430 struct sk_buff;
3531
....@@ -43,41 +39,39 @@
4339 atomic_long_t rx_oos_packets;
4440 atomic_long_t rx_errors;
4541 atomic_long_t rx_cookie_discards;
42
+ atomic_long_t rx_invalid;
4643 };
4744
4845 struct l2tp_tunnel;
4946
50
-/* Describes a session. Contains information to determine incoming
51
- * packets and transmit outgoing ones.
52
- */
47
+/* L2TP session configuration */
5348 struct l2tp_session_cfg {
5449 enum l2tp_pwtype pw_type;
55
- unsigned int recv_seq:1; /* expect receive packets with
56
- * sequence numbers? */
57
- unsigned int send_seq:1; /* send packets with sequence
58
- * numbers? */
59
- unsigned int lns_mode:1; /* behave as LNS? LAC enables
60
- * sequence numbers under
61
- * control of LNS. */
62
- int debug; /* bitmask of debug message
63
- * categories */
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
+ */
6455 u16 l2specific_type; /* Layer 2 specific type */
6556 u8 cookie[8]; /* optional cookie */
6657 int cookie_len; /* 0, 4 or 8 bytes */
6758 u8 peer_cookie[8]; /* peer's cookie */
6859 int peer_cookie_len; /* 0, 4 or 8 bytes */
69
- int reorder_timeout; /* configured reorder timeout
70
- * (in jiffies) */
60
+ int reorder_timeout; /* configured reorder timeout (in jiffies) */
7161 char *ifname;
7262 };
7363
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
7470 struct l2tp_session {
75
- int magic; /* should be
76
- * L2TP_SESSION_MAGIC */
71
+ int magic; /* should be L2TP_SESSION_MAGIC */
7772 long dead;
7873
79
- struct l2tp_tunnel *tunnel; /* back pointer to tunnel
80
- * context */
74
+ struct l2tp_tunnel *tunnel; /* back pointer to tunnel context */
8175 u32 session_id;
8276 u32 peer_session_id;
8377 u8 cookie[8];
....@@ -92,42 +86,51 @@
9286 u32 nr_max; /* max NR. Depends on tunnel */
9387 u32 nr_window_size; /* NR window size */
9488 u32 nr_oos; /* NR of last OOS packet */
95
- int nr_oos_count; /* For OOS recovery */
89
+ int nr_oos_count; /* for OOS recovery */
9690 int nr_oos_count_max;
97
- struct hlist_node hlist; /* Hash list node */
91
+ struct hlist_node hlist; /* hash list node */
9892 refcount_t ref_count;
9993
100
- char name[32]; /* for logging */
94
+ char name[L2TP_SESSION_NAME_MAX]; /* for logging */
10195 char ifname[IFNAMSIZ];
102
- unsigned int recv_seq:1; /* expect receive packets with
103
- * sequence numbers? */
104
- unsigned int send_seq:1; /* send packets with sequence
105
- * numbers? */
106
- unsigned int lns_mode:1; /* behave as LNS? LAC enables
107
- * sequence numbers under
108
- * control of LNS. */
109
- int debug; /* bitmask of debug message
110
- * categories */
111
- int reorder_timeout; /* configured reorder timeout
112
- * (in jiffies) */
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) */
113102 int reorder_skip; /* set if skip to next nr */
114103 enum l2tp_pwtype pwtype;
115104 struct l2tp_stats stats;
116
- struct hlist_node global_hlist; /* Global hash list node */
105
+ struct hlist_node global_hlist; /* global hash list node */
117106
118
- int (*build_header)(struct l2tp_session *session, void *buf);
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
+ */
119112 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
+ */
120120 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
+ */
121127 void (*show)(struct seq_file *m, void *priv);
122
- uint8_t priv[0]; /* private data */
128
+
129
+ u8 priv[]; /* private data */
123130 };
124131
125
-/* Describes the tunnel. It contains info to track all the associated
126
- * sessions so incoming packets can be sorted out
127
- */
132
+/* L2TP tunnel configuration */
128133 struct l2tp_tunnel_cfg {
129
- int debug; /* bitmask of debug message
130
- * categories */
131134 enum l2tp_encap_type encap;
132135
133136 /* Used only for kernel-created sockets */
....@@ -144,6 +147,13 @@
144147 udp6_zero_rx_checksums:1;
145148 };
146149
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
147157 struct l2tp_tunnel {
148158 int magic; /* Should be L2TP_TUNNEL_MAGIC */
149159
....@@ -151,40 +161,50 @@
151161
152162 struct rcu_head rcu;
153163 rwlock_t hlist_lock; /* protect session_hlist */
154
- bool acpt_newsess; /* Indicates whether this
155
- * tunnel accepts new sessions.
156
- * Protected by hlist_lock.
164
+ bool acpt_newsess; /* indicates whether this tunnel accepts
165
+ * new sessions. Protected by hlist_lock.
157166 */
158167 struct hlist_head session_hlist[L2TP_HASH_SIZE];
159
- /* hashed list of sessions,
160
- * hashed by id */
168
+ /* hashed list of sessions, hashed by id */
161169 u32 tunnel_id;
162170 u32 peer_tunnel_id;
163171 int version; /* 2=>L2TPv2, 3=>L2TPv3 */
164172
165
- char name[20]; /* for logging */
166
- int debug; /* bitmask of debug message
167
- * categories */
173
+ char name[L2TP_TUNNEL_NAME_MAX]; /* for logging */
168174 enum l2tp_encap_type encap;
169175 struct l2tp_stats stats;
170176
171
- struct list_head list; /* Keep a list of all tunnels */
177
+ struct list_head list; /* list node on per-namespace list of tunnels */
172178 struct net *l2tp_net; /* the net we belong to */
173179
174180 refcount_t ref_count;
175
- void (*old_sk_destruct)(struct sock *);
176
- struct sock *sock; /* Parent socket */
177
- int fd; /* Parent fd, if tunnel socket
178
- * was created by userspace */
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
+ */
179186
180187 struct work_struct del_work;
181188 };
182189
190
+/* Pseudowire ops callbacks for use with the l2tp genetlink interface */
183191 struct 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
+ */
184198 int (*session_create)(struct net *net, struct l2tp_tunnel *tunnel,
185199 u32 session_id, u32 peer_session_id,
186200 struct l2tp_session_cfg *cfg);
187
- int (*session_delete)(struct l2tp_session *session);
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);
188208 };
189209
190210 static inline void *l2tp_session_priv(struct l2tp_session *session)
....@@ -192,73 +212,72 @@
192212 return &session->priv[0];
193213 }
194214
215
+/* Tunnel and session refcounts */
216
+void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel);
217
+void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel);
218
+void l2tp_session_inc_refcount(struct l2tp_session *session);
219
+void 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
+ */
195225 struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
196226 struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth);
197227 struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel,
198228 u32 session_id);
199
-
200
-void l2tp_tunnel_free(struct l2tp_tunnel *tunnel);
201229
202230 struct l2tp_session *l2tp_session_get(const struct net *net, u32 session_id);
203231 struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth);
204232 struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
205233 const char *ifname);
206234
207
-int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id,
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
+ */
239
+int l2tp_tunnel_create(int fd, int version, u32 tunnel_id,
208240 u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
209241 struct l2tp_tunnel **tunnelp);
210242 int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
211243 struct l2tp_tunnel_cfg *cfg);
212
-
213244 void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
245
+
214246 struct l2tp_session *l2tp_session_create(int priv_size,
215247 struct l2tp_tunnel *tunnel,
216248 u32 session_id, u32 peer_session_id,
217249 struct l2tp_session_cfg *cfg);
218250 int l2tp_session_register(struct l2tp_session *session,
219251 struct l2tp_tunnel *tunnel);
252
+void l2tp_session_delete(struct l2tp_session *session);
220253
221
-void __l2tp_session_unhash(struct l2tp_session *session);
222
-int l2tp_session_delete(struct l2tp_session *session);
223
-void l2tp_session_free(struct l2tp_session *session);
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
+ */
224258 void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
225259 unsigned char *ptr, unsigned char *optr, u16 hdrflags,
226260 int length);
227261 int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
262
+
263
+/* Transmit path helpers for sending packets over the tunnel socket. */
228264 void l2tp_session_set_header_len(struct l2tp_session *session, int version);
265
+int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb);
229266
230
-int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb,
231
- int hdr_len);
232
-
233
-int l2tp_nl_register_ops(enum l2tp_pwtype pw_type,
234
- const struct l2tp_nl_cmd_ops *ops);
267
+/* Pseudowire management.
268
+ * Pseudowires should register with l2tp core on module init, and unregister
269
+ * on module exit.
270
+ */
271
+int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops);
235272 void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
273
+
274
+/* IOCTL helper for IP encap modules. */
236275 int l2tp_ioctl(struct sock *sk, int cmd, unsigned long arg);
237276
238
-static inline void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel)
239
-{
240
- refcount_inc(&tunnel->ref_count);
241
-}
242
-
243
-static inline void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel)
244
-{
245
- if (refcount_dec_and_test(&tunnel->ref_count))
246
- l2tp_tunnel_free(tunnel);
247
-}
248
-
249
-/* Session reference counts. Incremented when code obtains a reference
250
- * to a session.
277
+/* Extract the tunnel structure from a socket's sk_user_data pointer,
278
+ * validating the tunnel magic feather.
251279 */
252
-static inline void l2tp_session_inc_refcount(struct l2tp_session *session)
253
-{
254
- refcount_inc(&session->ref_count);
255
-}
256
-
257
-static inline void l2tp_session_dec_refcount(struct l2tp_session *session)
258
-{
259
- if (refcount_dec_and_test(&session->ref_count))
260
- l2tp_session_free(session);
261
-}
280
+struct l2tp_tunnel *l2tp_sk_to_tunnel(struct sock *sk);
262281
263282 static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
264283 {
....@@ -320,19 +339,6 @@
320339
321340 return 0;
322341 }
323
-
324
-#define l2tp_printk(ptr, type, func, fmt, ...) \
325
-do { \
326
- if (((ptr)->debug) & (type)) \
327
- func(fmt, ##__VA_ARGS__); \
328
-} while (0)
329
-
330
-#define l2tp_warn(ptr, type, fmt, ...) \
331
- l2tp_printk(ptr, type, pr_warn, fmt, ##__VA_ARGS__)
332
-#define l2tp_info(ptr, type, fmt, ...) \
333
- l2tp_printk(ptr, type, pr_info, fmt, ##__VA_ARGS__)
334
-#define l2tp_dbg(ptr, type, fmt, ...) \
335
- l2tp_printk(ptr, type, pr_debug, fmt, ##__VA_ARGS__)
336342
337343 #define MODULE_ALIAS_L2TP_PWTYPE(type) \
338344 MODULE_ALIAS("net-l2tp-type-" __stringify(type))