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 /* found in vlan_dev.c */ 78 int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, 79 struct packet_type *ptype, struct net_device *orig_dev); 80 void vlan_dev_set_ingress_priority(const struct net_device *dev, 81 u32 skb_prio, u16 vlan_prio); 82 int vlan_dev_set_egress_priority(const struct net_device *dev, 83 u32 skb_prio, u16 vlan_prio); 84 int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask); 85 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result); 86 87 int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id); 88 void vlan_setup(struct net_device *dev); 89 int register_vlan_dev(struct net_device *dev); 90 void unregister_vlan_dev(struct net_device *dev, struct list_head *head); 91 92 static inline u32 vlan_get_ingress_priority(struct net_device *dev, 93 u16 vlan_tci) 94 { 95 struct vlan_dev_info *vip = vlan_dev_info(dev); 96 97 return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7]; 98 } 99 100 #ifdef CONFIG_VLAN_8021Q_GVRP 101 extern int vlan_gvrp_request_join(const struct net_device *dev); 102 extern void vlan_gvrp_request_leave(const struct net_device *dev); 103 extern int vlan_gvrp_init_applicant(struct net_device *dev); 104 extern void vlan_gvrp_uninit_applicant(struct net_device *dev); 105 extern int vlan_gvrp_init(void); 106 extern void vlan_gvrp_uninit(void); 107 #else 108 static inline int vlan_gvrp_request_join(const struct net_device *dev) { return 0; } 109 static inline void vlan_gvrp_request_leave(const struct net_device *dev) {} 110 static inline int vlan_gvrp_init_applicant(struct net_device *dev) { return 0; } 111 static inline void vlan_gvrp_uninit_applicant(struct net_device *dev) {} 112 static inline int vlan_gvrp_init(void) { return 0; } 113 static inline void vlan_gvrp_uninit(void) {} 114 #endif 115 116 extern const char vlan_fullname[]; 117 extern const char vlan_version[]; 118 extern int vlan_netlink_init(void); 119 extern void vlan_netlink_fini(void); 120 121 extern struct rtnl_link_ops vlan_link_ops; 122 123 static inline int is_vlan_dev(struct net_device *dev) 124 { 125 return dev->priv_flags & IFF_802_1Q_VLAN; 126 } 127 128 extern int vlan_net_id; 129 130 struct proc_dir_entry; 131 132 struct vlan_net { 133 /* /proc/net/vlan */ 134 struct proc_dir_entry *proc_vlan_dir; 135 /* /proc/net/vlan/config */ 136 struct proc_dir_entry *proc_vlan_conf; 137 /* Determines interface naming scheme. */ 138 unsigned short name_type; 139 }; 140 141 #endif /* !(__BEN_VLAN_802_1Q_INC__) */ 142