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_id: VLAN identifier
  53 *      @flags: device flags
  54 *      @real_dev: underlying netdevice
  55 *      @real_dev_addr: address of underlying netdevice
  56 *      @dent: proc dir entry
  57 *      @vlan_pcpu_stats: ptr to percpu rx stats
  58 */
  59struct vlan_dev_priv {
  60        unsigned int                            nr_ingress_mappings;
  61        u32                                     ingress_priority_map[8];
  62        unsigned int                            nr_egress_mappings;
  63        struct vlan_priority_tci_mapping        *egress_priority_map[16];
  64
  65        u16                                     vlan_id;
  66        u16                                     flags;
  67
  68        struct net_device                       *real_dev;
  69        unsigned char                           real_dev_addr[ETH_ALEN];
  70
  71        struct proc_dir_entry                   *dent;
  72        struct vlan_pcpu_stats __percpu         *vlan_pcpu_stats;
  73#ifdef CONFIG_NET_POLL_CONTROLLER
  74        struct netpoll                          *netpoll;
  75#endif
  76};
  77
  78static inline struct vlan_dev_priv *vlan_dev_priv(const struct net_device *dev)
  79{
  80        return netdev_priv(dev);
  81}
  82
  83/* if this changes, algorithm will have to be reworked because this
  84 * depends on completely exhausting the VLAN identifier space.  Thus
  85 * it gives constant time look-up, but in many cases it wastes memory.
  86 */
  87#define VLAN_GROUP_ARRAY_SPLIT_PARTS  8
  88#define VLAN_GROUP_ARRAY_PART_LEN     (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS)
  89
  90struct vlan_group {
  91        unsigned int            nr_vlan_devs;
  92        struct hlist_node       hlist;  /* linked list */
  93        struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS];
  94};
  95
  96struct vlan_info {
  97        struct net_device       *real_dev; /* The ethernet(like) device
  98                                            * the vlan is attached to.
  99                                            */
 100        struct vlan_group       grp;
 101        struct list_head        vid_list;
 102        unsigned int            nr_vids;
 103        struct rcu_head         rcu;
 104};
 105
 106static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
 107                                                       u16 vlan_id)
 108{
 109        struct net_device **array;
 110        array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
 111        return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL;
 112}
 113
 114static inline void vlan_group_set_device(struct vlan_group *vg,
 115                                         u16 vlan_id,
 116                                         struct net_device *dev)
 117{
 118        struct net_device **array;
 119        if (!vg)
 120                return;
 121        array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
 122        array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev;
 123}
 124
 125/* Must be invoked with rcu_read_lock or with RTNL. */
 126static inline struct net_device *vlan_find_dev(struct net_device *real_dev,
 127                                               u16 vlan_id)
 128{
 129        struct vlan_info *vlan_info = rcu_dereference_rtnl(real_dev->vlan_info);
 130
 131        if (vlan_info)
 132                return vlan_group_get_device(&vlan_info->grp, vlan_id);
 133
 134        return NULL;
 135}
 136
 137/* found in vlan_dev.c */
 138void vlan_dev_set_ingress_priority(const struct net_device *dev,
 139                                   u32 skb_prio, u16 vlan_prio);
 140int vlan_dev_set_egress_priority(const struct net_device *dev,
 141                                 u32 skb_prio, u16 vlan_prio);
 142int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask);
 143void vlan_dev_get_realdev_name(const struct net_device *dev, char *result);
 144
 145int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id);
 146void vlan_setup(struct net_device *dev);
 147int register_vlan_dev(struct net_device *dev);
 148void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
 149
 150static inline u32 vlan_get_ingress_priority(struct net_device *dev,
 151                                            u16 vlan_tci)
 152{
 153        struct vlan_dev_priv *vip = vlan_dev_priv(dev);
 154
 155        return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7];
 156}
 157
 158#ifdef CONFIG_VLAN_8021Q_GVRP
 159extern int vlan_gvrp_request_join(const struct net_device *dev);
 160extern void vlan_gvrp_request_leave(const struct net_device *dev);
 161extern int vlan_gvrp_init_applicant(struct net_device *dev);
 162extern void vlan_gvrp_uninit_applicant(struct net_device *dev);
 163extern int vlan_gvrp_init(void);
 164extern void vlan_gvrp_uninit(void);
 165#else
 166static inline int vlan_gvrp_request_join(const struct net_device *dev) { return 0; }
 167static inline void vlan_gvrp_request_leave(const struct net_device *dev) {}
 168static inline int vlan_gvrp_init_applicant(struct net_device *dev) { return 0; }
 169static inline void vlan_gvrp_uninit_applicant(struct net_device *dev) {}
 170static inline int vlan_gvrp_init(void) { return 0; }
 171static inline void vlan_gvrp_uninit(void) {}
 172#endif
 173
 174extern const char vlan_fullname[];
 175extern const char vlan_version[];
 176extern int vlan_netlink_init(void);
 177extern void vlan_netlink_fini(void);
 178
 179extern struct rtnl_link_ops vlan_link_ops;
 180
 181extern int vlan_net_id;
 182
 183struct proc_dir_entry;
 184
 185struct vlan_net {
 186        /* /proc/net/vlan */
 187        struct proc_dir_entry *proc_vlan_dir;
 188        /* /proc/net/vlan/config */
 189        struct proc_dir_entry *proc_vlan_conf;
 190        /* Determines interface naming scheme. */
 191        unsigned short name_type;
 192};
 193
 194#endif /* !(__BEN_VLAN_802_1Q_INC__) */
 195
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.