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