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