linux/net/8021q/vlan.h
<<
>>
Prefs
   1#ifndef __BEN_VLAN_802_1Q_INC__
   2#define __BEN_VLAN_802_1Q_INC__
   3
   4#include <linux/if_vlan.h>
   5#include <linux/u64_stats_sync.h>
   6#include <linux/list.h>
   7
   8
   9/**
  10 *      struct vlan_priority_tci_mapping - vlan egress priority mappings
  11 *      @priority: skb priority
  12 *      @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000
  13 *      @next: pointer to next struct
  14 */
  15struct vlan_priority_tci_mapping {
  16        u32                                     priority;
  17        u16                                     vlan_qos;
  18        struct vlan_priority_tci_mapping        *next;
  19};
  20
  21
  22/**
  23 *      struct vlan_pcpu_stats - VLAN percpu rx/tx stats
  24 *      @rx_packets: number of received packets
  25 *      @rx_bytes: number of received bytes
  26 *      @rx_multicast: number of received multicast packets
  27 *      @tx_packets: number of transmitted packets
  28 *      @tx_bytes: number of transmitted bytes
  29 *      @syncp: synchronization point for 64bit counters
  30 *      @rx_errors: number of rx errors
  31 *      @tx_dropped: number of tx drops
  32 */
  33struct vlan_pcpu_stats {
  34        u64                     rx_packets;
  35        u64                     rx_bytes;
  36        u64                     rx_multicast;
  37        u64                     tx_packets;
  38        u64                     tx_bytes;
  39        struct u64_stats_sync   syncp;
  40        u32                     rx_errors;
  41        u32                     tx_dropped;
  42};
  43
  44struct netpoll;
  45
  46/**
  47 *      struct vlan_dev_priv - VLAN private device data
  48 *      @nr_ingress_mappings: number of ingress priority mappings
  49 *      @ingress_priority_map: ingress priority mappings
  50 *      @nr_egress_mappings: number of egress priority mappings
  51 *      @egress_priority_map: hash of egress priority mappings
  52 *      @vlan_proto: VLAN encapsulation protocol
  53 *      @vlan_id: VLAN identifier
  54 *      @flags: device flags
  55 *      @real_dev: underlying netdevice
  56 *      @real_dev_addr: address of underlying netdevice
  57 *      @dent: proc dir entry
  58 *      @vlan_pcpu_stats: ptr to percpu rx stats
  59 */
  60struct vlan_dev_priv {
  61        unsigned int                            nr_ingress_mappings;
  62        u32                                     ingress_priority_map[8];
  63        unsigned int                            nr_egress_mappings;
  64        struct vlan_priority_tci_mapping        *egress_priority_map[16];
  65
  66        __be16                                  vlan_proto;
  67        u16                                     vlan_id;
  68        u16                                     flags;
  69
  70        struct net_device                       *real_dev;
  71        unsigned char                           real_dev_addr[ETH_ALEN];
  72
  73        struct proc_dir_entry                   *dent;
  74        struct vlan_pcpu_stats __percpu         *vlan_pcpu_stats;
  75#ifdef CONFIG_NET_POLL_CONTROLLER
  76        struct netpoll                          *netpoll;
  77#endif
  78};
  79
  80static inline struct vlan_dev_priv *vlan_dev_priv(const struct net_device *dev)
  81{
  82        return netdev_priv(dev);
  83}
  84
  85/* if this changes, algorithm will have to be reworked because this
  86 * depends on completely exhausting the VLAN identifier space.  Thus
  87 * it gives constant time look-up, but in many cases it wastes memory.
  88 */
  89#define VLAN_GROUP_ARRAY_SPLIT_PARTS  8
  90#define VLAN_GROUP_ARRAY_PART_LEN     (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS)
  91
  92enum vlan_protos {
  93        VLAN_PROTO_8021Q        = 0,
  94        VLAN_PROTO_8021AD,
  95        VLAN_PROTO_NUM,
  96};
  97
  98struct vlan_group {
  99        unsigned int            nr_vlan_devs;
 100        struct hlist_node       hlist;  /* linked list */
 101        struct net_device **vlan_devices_arrays[VLAN_PROTO_NUM]
 102                                               [VLAN_GROUP_ARRAY_SPLIT_PARTS];
 103};
 104
 105struct vlan_info {
 106        struct net_device       *real_dev; /* The ethernet(like) device
 107                                            * the vlan is attached to.
 108                                            */
 109        struct vlan_group       grp;
 110        struct list_head        vid_list;
 111        unsigned int            nr_vids;
 112        struct rcu_head         rcu;
 113};
 114
 115static inline unsigned int vlan_proto_idx(__be16 proto)
 116{
 117        switch (proto) {
 118        case __constant_htons(ETH_P_8021Q):
 119                return VLAN_PROTO_8021Q;
 120        case __constant_htons(ETH_P_8021AD):
 121                return VLAN_PROTO_8021AD;
 122        default:
 123                BUG();
 124                return 0;
 125        }
 126}
 127
 128static inline struct net_device *__vlan_group_get_device(struct vlan_group *vg,
 129                                                         unsigned int pidx,
 130                                                         u16 vlan_id)
 131{
 132        struct net_device **array;
 133
 134        array = vg->vlan_devices_arrays[pidx]
 135                                       [vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
 136        return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL;
 137}
 138
 139static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
 140                                                       __be16 vlan_proto,
 141                                                       u16 vlan_id)
 142{
 143        return __vlan_group_get_device(vg, vlan_proto_idx(vlan_proto), vlan_id);
 144}
 145
 146static inline void vlan_group_set_device(struct vlan_group *vg,
 147                                         __be16 vlan_proto, u16 vlan_id,
 148                                         struct net_device *dev)
 149{
 150        struct net_device **array;
 151        if (!vg)
 152                return;
 153        array = vg->vlan_devices_arrays[vlan_proto_idx(vlan_proto)]
 154                                       [vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
 155        array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev;
 156}
 157
 158/* Must be invoked with rcu_read_lock or with RTNL. */
 159static inline struct net_device *vlan_find_dev(struct net_device *real_dev,
 160                                               __be16 vlan_proto, u16 vlan_id)
 161{
 162        struct vlan_info *vlan_info = rcu_dereference_rtnl(real_dev->vlan_info);
 163
 164        if (vlan_info)
 165                return vlan_group_get_device(&vlan_info->grp,
 166                                             vlan_proto, vlan_id);
 167
 168        return NULL;
 169}
 170
 171#define vlan_group_for_each_dev(grp, i, dev) \
 172        for ((i) = 0; i < VLAN_PROTO_NUM * VLAN_N_VID; i++) \
 173                if (((dev) = __vlan_group_get_device((grp), (i) / VLAN_N_VID, \
 174                                                            (i) % VLAN_N_VID)))
 175
 176/* found in vlan_dev.c */
 177void vlan_dev_set_ingress_priority(const struct net_device *dev,
 178                                   u32 skb_prio, u16 vlan_prio);
 179int vlan_dev_set_egress_priority(const struct net_device *dev,
 180                                 u32 skb_prio, u16 vlan_prio);
 181int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask);
 182void vlan_dev_get_realdev_name(const struct net_device *dev, char *result);
 183
 184int vlan_check_real_dev(struct net_device *real_dev,
 185                        __be16 protocol, u16 vlan_id);
 186void vlan_setup(struct net_device *dev);
 187int register_vlan_dev(struct net_device *dev);
 188void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
 189
 190static inline u32 vlan_get_ingress_priority(struct net_device *dev,
 191                                            u16 vlan_tci)
 192{
 193        struct vlan_dev_priv *vip = vlan_dev_priv(dev);
 194
 195        return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7];
 196}
 197
 198#ifdef CONFIG_VLAN_8021Q_GVRP
 199extern int vlan_gvrp_request_join(const struct net_device *dev);
 200extern void vlan_gvrp_request_leave(const struct net_device *dev);
 201extern int vlan_gvrp_init_applicant(struct net_device *dev);
 202extern void vlan_gvrp_uninit_applicant(struct net_device *dev);
 203extern int vlan_gvrp_init(void);
 204extern void vlan_gvrp_uninit(void);
 205#else
 206static inline int vlan_gvrp_request_join(const struct net_device *dev) { return 0; }
 207static inline void vlan_gvrp_request_leave(const struct net_device *dev) {}
 208static inline int vlan_gvrp_init_applicant(struct net_device *dev) { return 0; }
 209static inline void vlan_gvrp_uninit_applicant(struct net_device *dev) {}
 210static inline int vlan_gvrp_init(void) { return 0; }
 211static inline void vlan_gvrp_uninit(void) {}
 212#endif
 213
 214#ifdef CONFIG_VLAN_8021Q_MVRP
 215extern int vlan_mvrp_request_join(const struct net_device *dev);
 216extern void vlan_mvrp_request_leave(const struct net_device *dev);
 217extern int vlan_mvrp_init_applicant(struct net_device *dev);
 218extern void vlan_mvrp_uninit_applicant(struct net_device *dev);
 219extern int vlan_mvrp_init(void);
 220extern void vlan_mvrp_uninit(void);
 221#else
 222static inline int vlan_mvrp_request_join(const struct net_device *dev) { return 0; }
 223static inline void vlan_mvrp_request_leave(const struct net_device *dev) {}
 224static inline int vlan_mvrp_init_applicant(struct net_device *dev) { return 0; }
 225static inline void vlan_mvrp_uninit_applicant(struct net_device *dev) {}
 226static inline int vlan_mvrp_init(void) { return 0; }
 227static inline void vlan_mvrp_uninit(void) {}
 228#endif
 229
 230extern const char vlan_fullname[];
 231extern const char vlan_version[];
 232extern int vlan_netlink_init(void);
 233extern void vlan_netlink_fini(void);
 234
 235extern struct rtnl_link_ops vlan_link_ops;
 236
 237extern int vlan_net_id;
 238
 239struct proc_dir_entry;
 240
 241struct vlan_net {
 242        /* /proc/net/vlan */
 243        struct proc_dir_entry *proc_vlan_dir;
 244        /* /proc/net/vlan/config */
 245        struct proc_dir_entry *proc_vlan_conf;
 246        /* Determines interface naming scheme. */
 247        unsigned short name_type;
 248};
 249
 250#endif /* !(__BEN_VLAN_802_1Q_INC__) */
 251