Blame view
net/l2tp/l2tp_core.h
9.6 KB
fd558d186 l2tp: Split pppol... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * 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. */ #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 ... |
17 |
/* Per tunnel, session hash table size */ |
fd558d186 l2tp: Split pppol... |
18 19 |
#define L2TP_HASH_BITS 4 #define L2TP_HASH_SIZE (1 << L2TP_HASH_BITS) |
f7faffa3f l2tp: Add L2TPv3 ... |
20 21 22 |
/* 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... |
23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* Debug message categories for the DEBUG socket option */ enum { L2TP_MSG_DEBUG = (1 << 0), /* verbose debug (if * compiled in) */ L2TP_MSG_CONTROL = (1 << 1), /* userspace - kernel * interface */ L2TP_MSG_SEQ = (1 << 2), /* sequence numbers */ L2TP_MSG_DATA = (1 << 3), /* data packets */ }; struct sk_buff; struct l2tp_stats { |
7b7c0719c l2tp: avoid deadl... |
36 37 38 39 40 41 42 43 44 |
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... |
45 46 47 48 49 50 51 52 |
}; struct l2tp_tunnel; /* Describes a session. Contains information to determine incoming * packets and transmit outgoing ones. */ struct l2tp_session_cfg { |
f7faffa3f l2tp: Add L2TPv3 ... |
53 |
enum l2tp_pwtype pw_type; |
95c961747 net: cleanup unsi... |
54 |
unsigned int data_seq:2; /* data sequencing level |
fd558d186 l2tp: Split pppol... |
55 56 57 |
* 0 => none, 1 => IP only, * 2 => all */ |
95c961747 net: cleanup unsi... |
58 |
unsigned int recv_seq:1; /* expect receive packets with |
fd558d186 l2tp: Split pppol... |
59 |
* sequence numbers? */ |
95c961747 net: cleanup unsi... |
60 |
unsigned int send_seq:1; /* send packets with sequence |
fd558d186 l2tp: Split pppol... |
61 |
* numbers? */ |
95c961747 net: cleanup unsi... |
62 |
unsigned int lns_mode:1; /* behave as LNS? LAC enables |
fd558d186 l2tp: Split pppol... |
63 64 65 66 |
* sequence numbers under * control of LNS. */ int debug; /* bitmask of debug message * categories */ |
309795f4b l2tp: Add netlink... |
67 |
u16 vlan_id; /* VLAN pseudowire only */ |
f7faffa3f l2tp: Add L2TPv3 ... |
68 69 70 71 72 73 74 |
u16 offset; /* offset to payload */ u16 l2specific_len; /* Layer 2 specific length */ 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... |
75 76 77 78 |
int reorder_timeout; /* configured reorder timeout * (in jiffies) */ int mtu; int mru; |
309795f4b l2tp: Add netlink... |
79 |
char *ifname; |
fd558d186 l2tp: Split pppol... |
80 81 82 83 84 85 86 87 88 89 |
}; struct l2tp_session { int magic; /* should be * L2TP_SESSION_MAGIC */ struct l2tp_tunnel *tunnel; /* back pointer to tunnel * context */ u32 session_id; u32 peer_session_id; |
f7faffa3f l2tp: Add L2TPv3 ... |
90 91 92 93 94 95 96 97 98 99 100 |
u8 cookie[8]; int cookie_len; u8 peer_cookie[8]; int peer_cookie_len; u16 offset; /* offset from end of L2TP header to beginning of data */ u16 l2specific_len; u16 l2specific_type; u16 hdr_len; u32 nr; /* session NR state (receive) */ u32 ns; /* session NR state (send) */ |
fd558d186 l2tp: Split pppol... |
101 102 103 104 105 |
struct sk_buff_head reorder_q; /* receive reorder queue */ struct hlist_node hlist; /* Hash list node */ atomic_t ref_count; char name[32]; /* for logging */ |
309795f4b l2tp: Add netlink... |
106 |
char ifname[IFNAMSIZ]; |
95c961747 net: cleanup unsi... |
107 |
unsigned int data_seq:2; /* data sequencing level |
fd558d186 l2tp: Split pppol... |
108 109 110 |
* 0 => none, 1 => IP only, * 2 => all */ |
95c961747 net: cleanup unsi... |
111 |
unsigned int recv_seq:1; /* expect receive packets with |
fd558d186 l2tp: Split pppol... |
112 |
* sequence numbers? */ |
95c961747 net: cleanup unsi... |
113 |
unsigned int send_seq:1; /* send packets with sequence |
fd558d186 l2tp: Split pppol... |
114 |
* numbers? */ |
95c961747 net: cleanup unsi... |
115 |
unsigned int lns_mode:1; /* behave as LNS? LAC enables |
fd558d186 l2tp: Split pppol... |
116 117 118 119 120 121 |
* 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... |
122 |
int reorder_skip; /* set if skip to next nr */ |
fd558d186 l2tp: Split pppol... |
123 124 |
int mtu; int mru; |
f7faffa3f l2tp: Add L2TPv3 ... |
125 |
enum l2tp_pwtype pwtype; |
fd558d186 l2tp: Split pppol... |
126 |
struct l2tp_stats stats; |
f7faffa3f l2tp: Add L2TPv3 ... |
127 |
struct hlist_node global_hlist; /* Global hash list node */ |
fd558d186 l2tp: Split pppol... |
128 |
|
f7faffa3f l2tp: Add L2TPv3 ... |
129 |
int (*build_header)(struct l2tp_session *session, void *buf); |
fd558d186 l2tp: Split pppol... |
130 131 132 133 |
void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len); void (*session_close)(struct l2tp_session *session); void (*ref)(struct l2tp_session *session); void (*deref)(struct l2tp_session *session); |
f66ef2d06 l2tp: Fix L2TP_DE... |
134 |
#if defined(CONFIG_L2TP_DEBUGFS) || defined(CONFIG_L2TP_DEBUGFS_MODULE) |
0ad661404 l2tp: Add debugfs... |
135 136 |
void (*show)(struct seq_file *m, void *priv); #endif |
fd558d186 l2tp: Split pppol... |
137 138 139 140 141 142 143 144 145 |
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 ... |
146 |
enum l2tp_encap_type encap; |
789a4a2c6 l2tp: Add support... |
147 148 149 150 |
/* Used only for kernel-created sockets */ struct in_addr local_ip; struct in_addr peer_ip; |
f9bac8df9 l2tp: netlink api... |
151 152 153 154 |
#if IS_ENABLED(CONFIG_IPV6) struct in6_addr *local_ip6; struct in6_addr *peer_ip6; #endif |
789a4a2c6 l2tp: Add support... |
155 156 |
u16 local_udp_port; u16 peer_udp_port; |
7bddd0db6 l2tp: unmanaged L... |
157 |
unsigned int use_udp_checksums:1; |
fd558d186 l2tp: Split pppol... |
158 159 160 161 |
}; struct l2tp_tunnel { int magic; /* Should be L2TP_TUNNEL_MAGIC */ |
99469c32f l2tp: avoid to us... |
162 |
struct rcu_head rcu; |
fd558d186 l2tp: Split pppol... |
163 164 165 166 167 168 169 170 171 172 173 |
rwlock_t hlist_lock; /* protect session_hlist */ 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 ... |
174 |
enum l2tp_encap_type encap; |
fd558d186 l2tp: Split pppol... |
175 176 177 178 179 180 |
struct l2tp_stats stats; struct list_head list; /* Keep a list of all tunnels */ struct net *l2tp_net; /* the net we belong to */ atomic_t ref_count; |
0ad661404 l2tp: Add debugfs... |
181 182 183 |
#ifdef CONFIG_DEBUG_FS void (*show)(struct seq_file *m, void *arg); #endif |
fd558d186 l2tp: Split pppol... |
184 185 186 |
int (*recv_payload_hook)(struct sk_buff *skb); void (*old_sk_destruct)(struct sock *); struct sock *sock; /* Parent socket */ |
80d84ef3f l2tp: prevent l2t... |
187 188 |
int fd; /* Parent fd, if tunnel socket * was created by userspace */ |
fd558d186 l2tp: Split pppol... |
189 |
|
f8ccac0e4 l2tp: put tunnel ... |
190 |
struct work_struct del_work; |
fd558d186 l2tp: Split pppol... |
191 192 |
uint8_t priv[0]; /* private data */ }; |
309795f4b l2tp: Add netlink... |
193 194 195 196 |
struct l2tp_nl_cmd_ops { int (*session_create)(struct net *net, u32 tunnel_id, u32 session_id, u32 peer_session_id, struct l2tp_session_cfg *cfg); int (*session_delete)(struct l2tp_session *session); }; |
fd558d186 l2tp: Split pppol... |
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
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]; } static inline struct l2tp_tunnel *l2tp_sock_to_tunnel(struct sock *sk) { struct l2tp_tunnel *tunnel; if (sk == NULL) return NULL; sock_hold(sk); tunnel = (struct l2tp_tunnel *)(sk->sk_user_data); if (tunnel == NULL) { sock_put(sk); goto out; } BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC); out: return tunnel; } |
80d84ef3f l2tp: prevent l2t... |
226 227 |
extern struct sock *l2tp_tunnel_sock_lookup(struct l2tp_tunnel *tunnel); extern void l2tp_tunnel_sock_put(struct sock *sk); |
f7faffa3f l2tp: Add L2TPv3 ... |
228 |
extern struct l2tp_session *l2tp_session_find(struct net *net, struct l2tp_tunnel *tunnel, u32 session_id); |
fd558d186 l2tp: Split pppol... |
229 |
extern struct l2tp_session *l2tp_session_find_nth(struct l2tp_tunnel *tunnel, int nth); |
309795f4b l2tp: Add netlink... |
230 |
extern struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname); |
fd558d186 l2tp: Split pppol... |
231 232 233 234 |
extern struct l2tp_tunnel *l2tp_tunnel_find(struct net *net, u32 tunnel_id); extern struct l2tp_tunnel *l2tp_tunnel_find_nth(struct net *net, int nth); 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); |
e34f4c705 l2tp: export l2tp... |
235 |
extern void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel); |
309795f4b l2tp: Add netlink... |
236 |
extern int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel); |
fd558d186 l2tp: Split pppol... |
237 |
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); |
f6e16b299 l2tp: unhash l2tp... |
238 |
extern void __l2tp_session_unhash(struct l2tp_session *session); |
309795f4b l2tp: Add netlink... |
239 |
extern int l2tp_session_delete(struct l2tp_session *session); |
fd558d186 l2tp: Split pppol... |
240 |
extern void l2tp_session_free(struct l2tp_session *session); |
f7faffa3f l2tp: Add L2TPv3 ... |
241 |
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)); |
48f72f92b l2tp: add session... |
242 |
extern int l2tp_session_queue_purge(struct l2tp_session *session); |
fd558d186 l2tp: Split pppol... |
243 |
extern int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb); |
fd558d186 l2tp: Split pppol... |
244 |
extern int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len); |
fd558d186 l2tp: Split pppol... |
245 |
|
309795f4b l2tp: Add netlink... |
246 247 |
extern int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops); extern void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type); |
fd558d186 l2tp: Split pppol... |
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 |
/* Session reference counts. Incremented when code obtains a reference * to a session. */ static inline void l2tp_session_inc_refcount_1(struct l2tp_session *session) { atomic_inc(&session->ref_count); } static inline void l2tp_session_dec_refcount_1(struct l2tp_session *session) { if (atomic_dec_and_test(&session->ref_count)) l2tp_session_free(session); } #ifdef L2TP_REFCNT_DEBUG |
a4ca44fa5 net: l2tp: Standa... |
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
#define l2tp_session_inc_refcount(_s) \ do { \ pr_debug("l2tp_session_inc_refcount: %s:%d %s: cnt=%d ", \ __func__, __LINE__, (_s)->name, \ atomic_read(&_s->ref_count)); \ l2tp_session_inc_refcount_1(_s); \ } while (0) #define l2tp_session_dec_refcount(_s) \ do { \ pr_debug("l2tp_session_dec_refcount: %s:%d %s: cnt=%d ", \ __func__, __LINE__, (_s)->name, \ atomic_read(&_s->ref_count)); \ l2tp_session_dec_refcount_1(_s); \ } while (0) |
fd558d186 l2tp: Split pppol... |
279 280 281 282 |
#else #define l2tp_session_inc_refcount(s) l2tp_session_inc_refcount_1(s) #define l2tp_session_dec_refcount(s) l2tp_session_dec_refcount_1(s) #endif |
a4ca44fa5 net: l2tp: Standa... |
283 284 285 286 287 288 289 290 291 292 293 294 |
#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__) |
fd558d186 l2tp: Split pppol... |
295 |
#endif /* _L2TP_CORE_H_ */ |