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 7 8 /** 9 * struct vlan_priority_tci_mapping - vlan egress priority mappings 10 * @priority: skb priority 11 * @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000 12 * @next: pointer to next struct 13 */ 14 struct vlan_priority_tci_mapping { 15 u32 priority; 16 u16 vlan_qos; 17 struct vlan_priority_tci_mapping *next; 18 }; 19 20 21 /** 22 * struct vlan_pcpu_stats - VLAN percpu rx/tx stats 23 * @rx_packets: number of received packets 24 * @rx_bytes: number of received bytes 25 * @rx_multicast: number of received multicast packets 26 * @tx_packets: number of transmitted packets 27 * @tx_bytes: number of transmitted bytes 28 * @syncp: synchronization point for 64bit counters 29 * @rx_errors: number of rx errors 30 * @tx_dropped: number of tx drops 31 */ 32 struct vlan_pcpu_stats { 33 u64 rx_packets; 34 u64 rx_bytes; 35 u64 rx_multicast; 36 u64 tx_packets; 37 u64 tx_bytes; 38 struct u64_stats_sync syncp; 39 u32 rx_errors; 40 u32 tx_dropped; 41 }; 42 43 /** 44 * struct vlan_dev_info - VLAN private device data 45 * @nr_ingress_mappings: number of ingress priority mappings 46 * @ingress_priority_map: ingress priority mappings 47 * @nr_egress_mappings: number of egress priority mappings 48 * @egress_priority_map: hash of egress priority mappings 49 * @vlan_id: VLAN identifier 50 * @flags: device flags 51 * @real_dev: underlying netdevice 52 * @real_dev_addr: address of underlying netdevice 53 * @dent: proc dir entry 54 * @vlan_pcpu_stats: ptr to percpu rx stats 55 */ 56 struct vlan_dev_info { 57 unsigned int nr_ingress_mappings; 58 u32 ingress_priority_map[8]; 59 unsigned int nr_egress_mappings; 60 struct vlan_priority_tci_mapping *egress_priority_map[16]; 61 62 u16 vlan_id; 63 u16 flags; 64 65 struct net_device *real_dev; 66 unsigned char real_dev_addr[ETH_ALEN]; 67 68 struct proc_dir_entry *dent; 69 struct vlan_pcpu_stats __percpu *vlan_pcpu_stats; 70 }; 71 72 static inline struct vlan_dev_info *vlan_dev_info(const struct net_device *dev) 73 { 74 return netdev_priv(dev); 75 } 76 77 static inline struct net_device *vlan_group_get_device(struct vlan_group *vg, 78 u16 vlan_id) 79 { 80 struct net_device **array; 81 array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; 82 return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL; 83 } 84 85 static inline void vlan_group_set_device(struct vlan_group *vg, 86 u16 vlan_id, 87 struct net_device *dev) 88 { 89 struct net_device **array; 90 if (!vg) 91 return; 92 array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; 93 array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev; 94 } 95 96 /* Must be invoked with rcu_read_lock or with RTNL. */ 97 static inline struct net_device *vlan_find_dev(struct net_device *real_dev, 98 u16 vlan_id) 99 { 100 struct vlan_group *grp = rcu_dereference_rtnl(real_dev->vlgrp); 101 102 if (grp) 103 return vlan_group_get_device(grp, vlan_id); 104 105 return NULL; 106 } 107 108 /* found in vlan_dev.c */ 109 void vlan_dev_set_ingress_priority(const struct net_device *dev, 110 u32 skb_prio, u16 vlan_prio); 111 int vlan_dev_set_egress_priority(const struct net_device *dev, 112 u32 skb_prio, u16 vlan_prio); 113 int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask); 114 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result); 115 116 int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id); 117 void vlan_setup(struct net_device *dev); 118 int register_vlan_dev(struct net_device *dev); 119 void unregister_vlan_dev(struct net_device *dev, struct list_head *head); 120 121 static inline u32 vlan_get_ingress_priority(struct net_device *dev, 122 u16 vlan_tci) 123 { 124 struct vlan_dev_info *vip = vlan_dev_info(dev); 125 126 return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7]; 127 } 128 129 #ifdef CONFIG_VLAN_8021Q_GVRP 130 extern int vlan_gvrp_request_join(const struct net_device *dev); 131 extern void vlan_gvrp_request_leave(const struct net_device *dev); 132 extern int vlan_gvrp_init_applicant(struct net_device *dev); 133 extern void vlan_gvrp_uninit_applicant(struct net_device *dev); 134 extern int vlan_gvrp_init(void); 135 extern void vlan_gvrp_uninit(void); 136 #else 137 static inline int vlan_gvrp_request_join(const struct net_device *dev) { return 0; } 138 static inline void vlan_gvrp_request_leave(const struct net_device *dev) {} 139 static inline int vlan_gvrp_init_applicant(struct net_device *dev) { return 0; } 140 static inline void vlan_gvrp_uninit_applicant(struct net_device *dev) {} 141 static inline int vlan_gvrp_init(void) { return 0; } 142 static inline void vlan_gvrp_uninit(void) {} 143 #endif 144 145 extern const char vlan_fullname[]; 146 extern const char vlan_version[]; 147 extern int vlan_netlink_init(void); 148 extern void vlan_netlink_fini(void); 149 150 extern struct rtnl_link_ops vlan_link_ops; 151 152 extern int vlan_net_id; 153 154 struct proc_dir_entry; 155 156 struct vlan_net { 157 /* /proc/net/vlan */ 158 struct proc_dir_entry *proc_vlan_dir; 159 /* /proc/net/vlan/config */ 160 struct proc_dir_entry *proc_vlan_conf; 161 /* Determines interface naming scheme. */ 162 unsigned short name_type; 163 }; 164 165 #endif /* !(__BEN_VLAN_802_1Q_INC__) */ 166