0001
0002
0003
0004
0005
0006 #include <linux/refcount.h>
0007
0008 #ifndef _L2TP_CORE_H_
0009 #define _L2TP_CORE_H_
0010
0011 #include <net/dst.h>
0012 #include <net/sock.h>
0013
0014 #ifdef CONFIG_XFRM
0015 #include <net/xfrm.h>
0016 #endif
0017
0018
0019 #define L2TP_TUNNEL_MAGIC 0x42114DDA
0020 #define L2TP_SESSION_MAGIC 0x0C04EB7D
0021
0022
0023 #define L2TP_HASH_BITS 4
0024 #define L2TP_HASH_SIZE BIT(L2TP_HASH_BITS)
0025
0026
0027 #define L2TP_HASH_BITS_2 8
0028 #define L2TP_HASH_SIZE_2 BIT(L2TP_HASH_BITS_2)
0029
0030 struct sk_buff;
0031
0032 struct l2tp_stats {
0033 atomic_long_t tx_packets;
0034 atomic_long_t tx_bytes;
0035 atomic_long_t tx_errors;
0036 atomic_long_t rx_packets;
0037 atomic_long_t rx_bytes;
0038 atomic_long_t rx_seq_discards;
0039 atomic_long_t rx_oos_packets;
0040 atomic_long_t rx_errors;
0041 atomic_long_t rx_cookie_discards;
0042 atomic_long_t rx_invalid;
0043 };
0044
0045 struct l2tp_tunnel;
0046
0047
0048 struct l2tp_session_cfg {
0049 enum l2tp_pwtype pw_type;
0050 unsigned int recv_seq:1;
0051 unsigned int send_seq:1;
0052 unsigned int lns_mode:1;
0053
0054
0055 u16 l2specific_type;
0056 u8 cookie[8];
0057 int cookie_len;
0058 u8 peer_cookie[8];
0059 int peer_cookie_len;
0060 int reorder_timeout;
0061 char *ifname;
0062 };
0063
0064
0065
0066
0067
0068
0069 #define L2TP_SESSION_NAME_MAX 32
0070 struct l2tp_session {
0071 int magic;
0072 long dead;
0073
0074 struct l2tp_tunnel *tunnel;
0075 u32 session_id;
0076 u32 peer_session_id;
0077 u8 cookie[8];
0078 int cookie_len;
0079 u8 peer_cookie[8];
0080 int peer_cookie_len;
0081 u16 l2specific_type;
0082 u16 hdr_len;
0083 u32 nr;
0084 u32 ns;
0085 struct sk_buff_head reorder_q;
0086 u32 nr_max;
0087 u32 nr_window_size;
0088 u32 nr_oos;
0089 int nr_oos_count;
0090 int nr_oos_count_max;
0091 struct hlist_node hlist;
0092 refcount_t ref_count;
0093
0094 char name[L2TP_SESSION_NAME_MAX];
0095 char ifname[IFNAMSIZ];
0096 unsigned int recv_seq:1;
0097 unsigned int send_seq:1;
0098 unsigned int lns_mode:1;
0099
0100
0101 int reorder_timeout;
0102 int reorder_skip;
0103 enum l2tp_pwtype pwtype;
0104 struct l2tp_stats stats;
0105 struct hlist_node global_hlist;
0106
0107
0108
0109
0110
0111
0112 void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
0113
0114
0115
0116
0117
0118
0119
0120 void (*session_close)(struct l2tp_session *session);
0121
0122
0123
0124
0125
0126
0127 void (*show)(struct seq_file *m, void *priv);
0128
0129 u8 priv[];
0130 };
0131
0132
0133 struct l2tp_tunnel_cfg {
0134 enum l2tp_encap_type encap;
0135
0136
0137 struct in_addr local_ip;
0138 struct in_addr peer_ip;
0139 #if IS_ENABLED(CONFIG_IPV6)
0140 struct in6_addr *local_ip6;
0141 struct in6_addr *peer_ip6;
0142 #endif
0143 u16 local_udp_port;
0144 u16 peer_udp_port;
0145 unsigned int use_udp_checksums:1,
0146 udp6_zero_tx_checksums:1,
0147 udp6_zero_rx_checksums:1;
0148 };
0149
0150
0151
0152
0153
0154
0155
0156 #define L2TP_TUNNEL_NAME_MAX 20
0157 struct l2tp_tunnel {
0158 int magic;
0159
0160 unsigned long dead;
0161
0162 struct rcu_head rcu;
0163 spinlock_t hlist_lock;
0164 bool acpt_newsess;
0165
0166
0167 struct hlist_head session_hlist[L2TP_HASH_SIZE];
0168
0169 u32 tunnel_id;
0170 u32 peer_tunnel_id;
0171 int version;
0172
0173 char name[L2TP_TUNNEL_NAME_MAX];
0174 enum l2tp_encap_type encap;
0175 struct l2tp_stats stats;
0176
0177 struct list_head list;
0178 struct net *l2tp_net;
0179
0180 refcount_t ref_count;
0181 void (*old_sk_destruct)(struct sock *sk);
0182 struct sock *sock;
0183 int fd;
0184
0185
0186
0187 struct work_struct del_work;
0188 };
0189
0190
0191 struct l2tp_nl_cmd_ops {
0192
0193
0194
0195
0196
0197
0198 int (*session_create)(struct net *net, struct l2tp_tunnel *tunnel,
0199 u32 session_id, u32 peer_session_id,
0200 struct l2tp_session_cfg *cfg);
0201
0202
0203
0204
0205
0206
0207 void (*session_delete)(struct l2tp_session *session);
0208 };
0209
0210 static inline void *l2tp_session_priv(struct l2tp_session *session)
0211 {
0212 return &session->priv[0];
0213 }
0214
0215
0216 void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel);
0217 void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel);
0218 void l2tp_session_inc_refcount(struct l2tp_session *session);
0219 void l2tp_session_dec_refcount(struct l2tp_session *session);
0220
0221
0222
0223
0224
0225 struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
0226 struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth);
0227 struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel,
0228 u32 session_id);
0229
0230 struct l2tp_session *l2tp_session_get(const struct net *net, u32 session_id);
0231 struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth);
0232 struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
0233 const char *ifname);
0234
0235
0236
0237
0238
0239 int l2tp_tunnel_create(int fd, int version, u32 tunnel_id,
0240 u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg,
0241 struct l2tp_tunnel **tunnelp);
0242 int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
0243 struct l2tp_tunnel_cfg *cfg);
0244 void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel);
0245
0246 struct l2tp_session *l2tp_session_create(int priv_size,
0247 struct l2tp_tunnel *tunnel,
0248 u32 session_id, u32 peer_session_id,
0249 struct l2tp_session_cfg *cfg);
0250 int l2tp_session_register(struct l2tp_session *session,
0251 struct l2tp_tunnel *tunnel);
0252 void l2tp_session_delete(struct l2tp_session *session);
0253
0254
0255
0256
0257
0258 void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
0259 unsigned char *ptr, unsigned char *optr, u16 hdrflags,
0260 int length);
0261 int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
0262
0263
0264 void l2tp_session_set_header_len(struct l2tp_session *session, int version);
0265 int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb);
0266
0267
0268
0269
0270
0271 int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops);
0272 void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type);
0273
0274
0275 int l2tp_ioctl(struct sock *sk, int cmd, unsigned long arg);
0276
0277
0278
0279
0280 struct l2tp_tunnel *l2tp_sk_to_tunnel(struct sock *sk);
0281
0282 static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
0283 {
0284 switch (session->l2specific_type) {
0285 case L2TP_L2SPECTYPE_DEFAULT:
0286 return 4;
0287 case L2TP_L2SPECTYPE_NONE:
0288 default:
0289 return 0;
0290 }
0291 }
0292
0293 static inline u32 l2tp_tunnel_dst_mtu(const struct l2tp_tunnel *tunnel)
0294 {
0295 struct dst_entry *dst;
0296 u32 mtu;
0297
0298 dst = sk_dst_get(tunnel->sock);
0299 if (!dst)
0300 return 0;
0301
0302 mtu = dst_mtu(dst);
0303 dst_release(dst);
0304
0305 return mtu;
0306 }
0307
0308 #ifdef CONFIG_XFRM
0309 static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
0310 {
0311 struct sock *sk = tunnel->sock;
0312
0313 return sk && (rcu_access_pointer(sk->sk_policy[0]) ||
0314 rcu_access_pointer(sk->sk_policy[1]));
0315 }
0316 #else
0317 static inline bool l2tp_tunnel_uses_xfrm(const struct l2tp_tunnel *tunnel)
0318 {
0319 return false;
0320 }
0321 #endif
0322
0323 static inline int l2tp_v3_ensure_opt_in_linear(struct l2tp_session *session, struct sk_buff *skb,
0324 unsigned char **ptr, unsigned char **optr)
0325 {
0326 int opt_len = session->peer_cookie_len + l2tp_get_l2specific_len(session);
0327
0328 if (opt_len > 0) {
0329 int off = *ptr - *optr;
0330
0331 if (!pskb_may_pull(skb, off + opt_len))
0332 return -1;
0333
0334 if (skb->data != *optr) {
0335 *optr = skb->data;
0336 *ptr = skb->data + off;
0337 }
0338 }
0339
0340 return 0;
0341 }
0342
0343 #define MODULE_ALIAS_L2TP_PWTYPE(type) \
0344 MODULE_ALIAS("net-l2tp-type-" __stringify(type))
0345
0346 #endif