1 #ifndef __BEN_VLAN_802_1Q_INC__ 2 #define __BEN_VLAN_802_1Q_INC__ 3 4 #include <linux/if_vlan.h> 5 6 7 /** 8 * struct vlan_priority_tci_mapping - vlan egress priority mappings 9 * @priority: skb priority 10 * @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000 11 * @next: pointer to next struct 12 */ 13 struct vlan_priority_tci_mapping { 14 u32 priority; 15 u16 vlan_qos; 16 struct vlan_priority_tci_mapping *next; 17 }; 18 19 /** 20 * struct vlan_dev_info - VLAN private device data 21 * @nr_ingress_mappings: number of ingress priority mappings 22 * @ingress_priority_map: ingress priority mappings 23 * @nr_egress_mappings: number of egress priority mappings 24 * @egress_priority_map: hash of egress priority mappings 25 * @vlan_id: VLAN identifier 26 * @flags: device flags 27 * @real_dev: underlying netdevice 28 * @real_dev_addr: address of underlying netdevice 29 * @dent: proc dir entry 30 * @cnt_inc_headroom_on_tx: statistic - number of skb expansions on TX 31 * @cnt_encap_on_xmit: statistic - number of skb encapsulations on TX 32 */ 33 struct vlan_dev_info { 34 unsigned int nr_ingress_mappings; 35 u32 ingress_priority_map[8]; 36 unsigned int nr_egress_mappings; 37 struct vlan_priority_tci_mapping *egress_priority_map[16]; 38 39 u16 vlan_id; 40 u16 flags; 41 42 struct net_device *real_dev; 43 unsigned char real_dev_addr[ETH_ALEN]; 44 45 struct proc_dir_entry *dent; 46 unsigned long cnt_inc_headroom_on_tx; 47 unsigned long cnt_encap_on_xmit; 48 }; 49 50 static inline struct vlan_dev_info *vlan_dev_info(const struct net_device *dev) 51 { 52 return netdev_priv(dev); 53 } 54 55 #define VLAN_GRP_HASH_SHIFT 5 56 #define VLAN_GRP_HASH_SIZE (1 << VLAN_GRP_HASH_SHIFT) 57 #define VLAN_GRP_HASH_MASK (VLAN_GRP_HASH_SIZE - 1) 58 59 /* Find a VLAN device by the MAC address of its Ethernet device, and 60 * it's VLAN ID. The default configuration is to have VLAN's scope 61 * to be box-wide, so the MAC will be ignored. The mac will only be 62 * looked at if we are configured to have a separate set of VLANs per 63 * each MAC addressable interface. Note that this latter option does 64 * NOT follow the spec for VLANs, but may be useful for doing very 65 * large quantities of VLAN MUX/DEMUX onto FrameRelay or ATM PVCs. 66 * 67 * Must be invoked with rcu_read_lock (ie preempt disabled) 68 * or with RTNL. 69 */ 70 struct net_device *__find_vlan_dev(struct net_device *real_dev, u16 vlan_id); 71 72 /* found in vlan_dev.c */ 73 int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, 74 struct packet_type *ptype, struct net_device *orig_dev); 75 void vlan_dev_set_ingress_priority(const struct net_device *dev, 76 u32 skb_prio, u16 vlan_prio); 77 int vlan_dev_set_egress_priority(const struct net_device *dev, 78 u32 skb_prio, u16 vlan_prio); 79 int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask); 80 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result); 81 82 int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id); 83 void vlan_setup(struct net_device *dev); 84 int register_vlan_dev(struct net_device *dev); 85 void unregister_vlan_dev(struct net_device *dev); 86 87 static inline u32 vlan_get_ingress_priority(struct net_device *dev, 88 u16 vlan_tci) 89 { 90 struct vlan_dev_info *vip = vlan_dev_info(dev); 91 92 return vip->ingress_priority_map[(vlan_tci >> 13) & 0x7]; 93 } 94 95 #ifdef CONFIG_VLAN_8021Q_GVRP 96 extern int vlan_gvrp_request_join(const struct net_device *dev); 97 extern void vlan_gvrp_request_leave(const struct net_device *dev); 98 extern int vlan_gvrp_init_applicant(struct net_device *dev); 99 extern void vlan_gvrp_uninit_applicant(struct net_device *dev); 100 extern int vlan_gvrp_init(void); 101 extern void vlan_gvrp_uninit(void); 102 #else 103 static inline int vlan_gvrp_request_join(const struct net_device *dev) { return 0; } 104 static inline void vlan_gvrp_request_leave(const struct net_device *dev) {} 105 static inline int vlan_gvrp_init_applicant(struct net_device *dev) { return 0; } 106 static inline void vlan_gvrp_uninit_applicant(struct net_device *dev) {} 107 static inline int vlan_gvrp_init(void) { return 0; } 108 static inline void vlan_gvrp_uninit(void) {} 109 #endif 110 111 extern const char vlan_fullname[]; 112 extern const char vlan_version[]; 113 extern int vlan_netlink_init(void); 114 extern void vlan_netlink_fini(void); 115 116 extern struct rtnl_link_ops vlan_link_ops; 117 118 static inline int is_vlan_dev(struct net_device *dev) 119 { 120 return dev->priv_flags & IFF_802_1Q_VLAN; 121 } 122 123 extern int vlan_net_id; 124 125 struct proc_dir_entry; 126 127 struct vlan_net { 128 /* /proc/net/vlan */ 129 struct proc_dir_entry *proc_vlan_dir; 130 /* /proc/net/vlan/config */ 131 struct proc_dir_entry *proc_vlan_conf; 132 /* Determines interface naming scheme. */ 133 unsigned short name_type; 134 }; 135 136 #endif /* !(__BEN_VLAN_802_1Q_INC__) */ 137