Blame view
net/l2tp/l2tp_core.h
9.28 KB
fd558d186 l2tp: Split pppol... |
1 2 3 4 5 6 7 8 9 |
/* * L2TP internal definitions. * * Copyright (c) 2008,2009 Katalix Systems Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ |
fbea9e076 net, l2tp: conver... |
10 |
#include <linux/refcount.h> |
fd558d186 l2tp: Split pppol... |
11 12 13 14 15 16 17 |
#ifndef _L2TP_CORE_H_ #define _L2TP_CORE_H_ /* Just some random numbers */ #define L2TP_TUNNEL_MAGIC 0x42114DDA #define L2TP_SESSION_MAGIC 0x0C04EB7D |
f7faffa3f l2tp: Add L2TPv3 ... |
18 |
/* Per tunnel, session hash table size */ |
fd558d186 l2tp: Split pppol... |
19 20 |
#define L2TP_HASH_BITS 4 #define L2TP_HASH_SIZE (1 << L2TP_HASH_BITS) |
f7faffa3f l2tp: Add L2TPv3 ... |
21 22 23 |
/* System-wide, session hash table size */ #define L2TP_HASH_BITS_2 8 #define L2TP_HASH_SIZE_2 (1 << L2TP_HASH_BITS_2) |
fd558d186 l2tp: Split pppol... |
24 25 26 |
struct sk_buff; struct l2tp_stats { |
7b7c0719c l2tp: avoid deadl... |
27 28 29 30 31 32 33 34 35 |
atomic_long_t tx_packets; atomic_long_t tx_bytes; atomic_long_t tx_errors; atomic_long_t rx_packets; atomic_long_t rx_bytes; atomic_long_t rx_seq_discards; atomic_long_t rx_oos_packets; atomic_long_t rx_errors; atomic_long_t rx_cookie_discards; |
fd558d186 l2tp: Split pppol... |
36 37 38 39 40 41 42 43 |
}; struct l2tp_tunnel; /* Describes a session. Contains information to determine incoming * packets and transmit outgoing ones. */ struct l2tp_session_cfg { |
f7faffa3f l2tp: Add L2TPv3 ... |
44 |
enum l2tp_pwtype pw_type; |
95c961747 net: cleanup unsi... |
45 |
unsigned int data_seq:2; /* data sequencing level |
fd558d186 l2tp: Split pppol... |
46 47 48 |
* 0 => none, 1 => IP only, * 2 => all */ |
95c961747 net: cleanup unsi... |
49 |
unsigned int recv_seq:1; /* expect receive packets with |
fd558d186 l2tp: Split pppol... |
50 |
* sequence numbers? */ |
95c961747 net: cleanup unsi... |
51 |
unsigned int send_seq:1; /* send packets with sequence |
fd558d186 l2tp: Split pppol... |
52 |
* numbers? */ |
95c961747 net: cleanup unsi... |
53 |
unsigned int lns_mode:1; /* behave as LNS? LAC enables |
fd558d186 l2tp: Split pppol... |
54 55 56 57 |
* sequence numbers under * control of LNS. */ int debug; /* bitmask of debug message * categories */ |
309795f4b l2tp: Add netlink... |
58 |
u16 vlan_id; /* VLAN pseudowire only */ |
f7faffa3f l2tp: Add L2TPv3 ... |
59 60 61 62 63 |
u16 l2specific_type; /* Layer 2 specific type */ u8 cookie[8]; /* optional cookie */ int cookie_len; /* 0, 4 or 8 bytes */ u8 peer_cookie[8]; /* peer's cookie */ int peer_cookie_len; /* 0, 4 or 8 bytes */ |
fd558d186 l2tp: Split pppol... |
64 65 66 67 |
int reorder_timeout; /* configured reorder timeout * (in jiffies) */ int mtu; int mru; |
309795f4b l2tp: Add netlink... |
68 |
char *ifname; |
fd558d186 l2tp: Split pppol... |
69 70 71 72 73 |
}; struct l2tp_session { int magic; /* should be * L2TP_SESSION_MAGIC */ |
b228a9406 l2tp: fix race be... |
74 |
long dead; |
fd558d186 l2tp: Split pppol... |
75 76 77 78 79 |
struct l2tp_tunnel *tunnel; /* back pointer to tunnel * context */ u32 session_id; u32 peer_session_id; |
f7faffa3f l2tp: Add L2TPv3 ... |
80 81 82 83 |
u8 cookie[8]; int cookie_len; u8 peer_cookie[8]; int peer_cookie_len; |
f7faffa3f l2tp: Add L2TPv3 ... |
84 85 86 87 |
u16 l2specific_type; u16 hdr_len; u32 nr; /* session NR state (receive) */ u32 ns; /* session NR state (send) */ |
fd558d186 l2tp: Split pppol... |
88 |
struct sk_buff_head reorder_q; /* receive reorder queue */ |
8a1631d58 l2tp: make datapa... |
89 90 |
u32 nr_max; /* max NR. Depends on tunnel */ u32 nr_window_size; /* NR window size */ |
a0dbd8222 l2tp: make datapa... |
91 92 93 |
u32 nr_oos; /* NR of last OOS packet */ int nr_oos_count; /* For OOS recovery */ int nr_oos_count_max; |
fd558d186 l2tp: Split pppol... |
94 |
struct hlist_node hlist; /* Hash list node */ |
f00c854c9 net, l2tp: conver... |
95 |
refcount_t ref_count; |
fd558d186 l2tp: Split pppol... |
96 97 |
char name[32]; /* for logging */ |
309795f4b l2tp: Add netlink... |
98 |
char ifname[IFNAMSIZ]; |
95c961747 net: cleanup unsi... |
99 |
unsigned int data_seq:2; /* data sequencing level |
fd558d186 l2tp: Split pppol... |
100 101 102 |
* 0 => none, 1 => IP only, * 2 => all */ |
95c961747 net: cleanup unsi... |
103 |
unsigned int recv_seq:1; /* expect receive packets with |
fd558d186 l2tp: Split pppol... |
104 |
* sequence numbers? */ |
95c961747 net: cleanup unsi... |
105 |
unsigned int send_seq:1; /* send packets with sequence |
fd558d186 l2tp: Split pppol... |
106 |
* numbers? */ |
95c961747 net: cleanup unsi... |
107 |
unsigned int lns_mode:1; /* behave as LNS? LAC enables |
fd558d186 l2tp: Split pppol... |
108 109 110 111 112 113 |
* sequence numbers under * control of LNS. */ int debug; /* bitmask of debug message * categories */ int reorder_timeout; /* configured reorder timeout * (in jiffies) */ |
38d40b3f4 l2tp: fix reorder... |
114 |
int reorder_skip; /* set if skip to next nr */ |
fd558d186 l2tp: Split pppol... |
115 116 |
int mtu; int mru; |
f7faffa3f l2tp: Add L2TPv3 ... |
117 |
enum l2tp_pwtype pwtype; |
fd558d186 l2tp: Split pppol... |
118 |
struct l2tp_stats stats; |
f7faffa3f l2tp: Add L2TPv3 ... |
119 |
struct hlist_node global_hlist; /* Global hash list node */ |
fd558d186 l2tp: Split pppol... |
120 |
|
f7faffa3f l2tp: Add L2TPv3 ... |
121 |
int (*build_header)(struct l2tp_session *session, void *buf); |
fd558d186 l2tp: Split pppol... |
122 123 |
void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len); void (*session_close)(struct l2tp_session *session); |
9dd79945b l2tp: use IS_ENAB... |
124 |
#if IS_ENABLED(CONFIG_L2TP_DEBUGFS) |
0ad661404 l2tp: Add debugfs... |
125 126 |
void (*show)(struct seq_file *m, void *priv); #endif |
fd558d186 l2tp: Split pppol... |
127 128 129 130 131 132 133 134 135 |
uint8_t priv[0]; /* private data */ }; /* Describes the tunnel. It contains info to track all the associated * sessions so incoming packets can be sorted out */ struct l2tp_tunnel_cfg { int debug; /* bitmask of debug message * categories */ |
0d76751fa l2tp: Add L2TPv3 ... |
136 |
enum l2tp_encap_type encap; |
789a4a2c6 l2tp: Add support... |
137 138 139 140 |
/* Used only for kernel-created sockets */ struct in_addr local_ip; struct in_addr peer_ip; |
f9bac8df9 l2tp: netlink api... |
141 142 143 144 |
#if IS_ENABLED(CONFIG_IPV6) struct in6_addr *local_ip6; struct in6_addr *peer_ip6; #endif |
789a4a2c6 l2tp: Add support... |
145 146 |
u16 local_udp_port; u16 peer_udp_port; |
6b649feaf l2tp: Add support... |
147 148 149 |
unsigned int use_udp_checksums:1, udp6_zero_tx_checksums:1, udp6_zero_rx_checksums:1; |
fd558d186 l2tp: Split pppol... |
150 151 152 153 |
}; struct l2tp_tunnel { int magic; /* Should be L2TP_TUNNEL_MAGIC */ |
62b982eeb l2tp: fix race co... |
154 155 |
unsigned long dead; |
99469c32f l2tp: avoid to us... |
156 |
struct rcu_head rcu; |
fd558d186 l2tp: Split pppol... |
157 |
rwlock_t hlist_lock; /* protect session_hlist */ |
f3c66d4e1 l2tp: prevent cre... |
158 159 160 161 |
bool acpt_newsess; /* Indicates whether this * tunnel accepts new sessions. * Protected by hlist_lock. */ |
fd558d186 l2tp: Split pppol... |
162 163 164 165 166 167 168 169 170 171 |
struct hlist_head session_hlist[L2TP_HASH_SIZE]; /* hashed list of sessions, * hashed by id */ u32 tunnel_id; u32 peer_tunnel_id; int version; /* 2=>L2TPv2, 3=>L2TPv3 */ char name[20]; /* for logging */ int debug; /* bitmask of debug message * categories */ |
0d76751fa l2tp: Add L2TPv3 ... |
172 |
enum l2tp_encap_type encap; |
fd558d186 l2tp: Split pppol... |
173 174 175 176 |
struct l2tp_stats stats; struct list_head list; /* Keep a list of all tunnels */ struct net *l2tp_net; /* the net we belong to */ |
fbea9e076 net, l2tp: conver... |
177 |
refcount_t ref_count; |
0ad661404 l2tp: Add debugfs... |
178 179 180 |
#ifdef CONFIG_DEBUG_FS void (*show)(struct seq_file *m, void *arg); #endif |
fd558d186 l2tp: Split pppol... |
181 182 183 |
int (*recv_payload_hook)(struct sk_buff *skb); void (*old_sk_destruct)(struct sock *); struct sock *sock; /* Parent socket */ |
80d84ef3f l2tp: prevent l2t... |
184 185 |
int fd; /* Parent fd, if tunnel socket * was created by userspace */ |
fd558d186 l2tp: Split pppol... |
186 |
|
f8ccac0e4 l2tp: put tunnel ... |
187 |
struct work_struct del_work; |
fd558d186 l2tp: Split pppol... |
188 189 |
uint8_t priv[0]; /* private data */ }; |
309795f4b l2tp: Add netlink... |
190 |
struct l2tp_nl_cmd_ops { |
f026bc29a l2tp: pass tunnel... |
191 192 193 |
int (*session_create)(struct net *net, struct l2tp_tunnel *tunnel, u32 session_id, u32 peer_session_id, struct l2tp_session_cfg *cfg); |
309795f4b l2tp: Add netlink... |
194 195 |
int (*session_delete)(struct l2tp_session *session); }; |
fd558d186 l2tp: Split pppol... |
196 197 198 199 200 201 202 203 204 |
static inline void *l2tp_tunnel_priv(struct l2tp_tunnel *tunnel) { return &tunnel->priv[0]; } static inline void *l2tp_session_priv(struct l2tp_session *session) { return &session->priv[0]; } |
54652eb12 l2tp: hold tunnel... |
205 |
struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id); |
5846c131c l2tp: hold refere... |
206 |
struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth); |
d00fa9adc l2tp: fix races w... |
207 |
void l2tp_tunnel_free(struct l2tp_tunnel *tunnel); |
54652eb12 l2tp: hold tunnel... |
208 |
|
9aaef50c4 l2tp: define para... |
209 |
struct l2tp_session *l2tp_session_get(const struct net *net, |
61b9a0477 l2tp: fix race in... |
210 |
struct l2tp_tunnel *tunnel, |
a4346210c l2tp: remove ->re... |
211 212 |
u32 session_id); struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth); |
9aaef50c4 l2tp: define para... |
213 |
struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net, |
a4346210c l2tp: remove ->re... |
214 |
const char *ifname); |
c1b1203d6 net: misc: Remove... |
215 216 217 218 |
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); |
6b9f34239 l2tp: fix races i... |
219 220 |
int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net, struct l2tp_tunnel_cfg *cfg); |
c1b1203d6 net: misc: Remove... |
221 |
void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel); |
62b982eeb l2tp: fix race co... |
222 |
void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel); |
c1b1203d6 net: misc: Remove... |
223 224 225 226 |
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); |
3953ae7b2 l2tp: don't regis... |
227 228 |
int l2tp_session_register(struct l2tp_session *session, struct l2tp_tunnel *tunnel); |
c1b1203d6 net: misc: Remove... |
229 230 231 232 233 234 235 236 |
void __l2tp_session_unhash(struct l2tp_session *session); int l2tp_session_delete(struct l2tp_session *session); void l2tp_session_free(struct l2tp_session *session); 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)); int l2tp_session_queue_purge(struct l2tp_session *session); int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb); |
bb5016eac l2tp: fix manual ... |
237 |
void l2tp_session_set_header_len(struct l2tp_session *session, int version); |
c1b1203d6 net: misc: Remove... |
238 239 240 241 242 243 244 |
int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len); int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops); void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type); |
72fb96e7b l2tp: do not use ... |
245 |
int l2tp_ioctl(struct sock *sk, int cmd, unsigned long arg); |
309795f4b l2tp: Add netlink... |
246 |
|
54652eb12 l2tp: hold tunnel... |
247 248 249 250 251 252 253 254 |
static inline void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel) { refcount_inc(&tunnel->ref_count); } static inline void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel) { if (refcount_dec_and_test(&tunnel->ref_count)) |
d00fa9adc l2tp: fix races w... |
255 |
l2tp_tunnel_free(tunnel); |
54652eb12 l2tp: hold tunnel... |
256 |
} |
fd558d186 l2tp: Split pppol... |
257 258 259 |
/* Session reference counts. Incremented when code obtains a reference * to a session. */ |
9ff672ba4 l2tp: remove l2tp... |
260 |
static inline void l2tp_session_inc_refcount(struct l2tp_session *session) |
fd558d186 l2tp: Split pppol... |
261 |
{ |
f00c854c9 net, l2tp: conver... |
262 |
refcount_inc(&session->ref_count); |
fd558d186 l2tp: Split pppol... |
263 |
} |
9ff672ba4 l2tp: remove l2tp... |
264 |
static inline void l2tp_session_dec_refcount(struct l2tp_session *session) |
fd558d186 l2tp: Split pppol... |
265 |
{ |
f00c854c9 net, l2tp: conver... |
266 |
if (refcount_dec_and_test(&session->ref_count)) |
fd558d186 l2tp: Split pppol... |
267 268 |
l2tp_session_free(session); } |
62e7b6a57 l2tp: remove l2sp... |
269 270 271 272 273 274 275 276 277 278 |
static inline int l2tp_get_l2specific_len(struct l2tp_session *session) { switch (session->l2specific_type) { case L2TP_L2SPECTYPE_DEFAULT: return 4; case L2TP_L2SPECTYPE_NONE: default: return 0; } } |
a4ca44fa5 net: l2tp: Standa... |
279 280 281 282 283 284 285 286 287 288 289 290 |
#define l2tp_printk(ptr, type, func, fmt, ...) \ do { \ if (((ptr)->debug) & (type)) \ func(fmt, ##__VA_ARGS__); \ } while (0) #define l2tp_warn(ptr, type, fmt, ...) \ l2tp_printk(ptr, type, pr_warn, fmt, ##__VA_ARGS__) #define l2tp_info(ptr, type, fmt, ...) \ l2tp_printk(ptr, type, pr_info, fmt, ##__VA_ARGS__) #define l2tp_dbg(ptr, type, fmt, ...) \ l2tp_printk(ptr, type, pr_debug, fmt, ##__VA_ARGS__) |
f1f39f911 l2tp: auto load t... |
291 292 |
#define MODULE_ALIAS_L2TP_PWTYPE(type) \ MODULE_ALIAS("net-l2tp-type-" __stringify(type)) |
fd558d186 l2tp: Split pppol... |
293 |
#endif /* _L2TP_CORE_H_ */ |