|
@@ -88,8 +88,102 @@ extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev,
|
|
|
__be16 vlan_proto, u16 vlan_id);
|
|
|
extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
|
|
|
extern u16 vlan_dev_vlan_id(const struct net_device *dev);
|
|
|
-extern u16 vlan_dev_get_egress_qos_mask(struct net_device *dev,
|
|
|
- u32 skprio);
|
|
|
+
|
|
|
+/**
|
|
|
+ * 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;
|
|
|
+ u16 vlan_qos;
|
|
|
+ struct vlan_priority_tci_mapping *next;
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * struct vlan_pcpu_stats - VLAN percpu rx/tx stats
|
|
|
+ * @rx_packets: number of received packets
|
|
|
+ * @rx_bytes: number of received bytes
|
|
|
+ * @rx_multicast: number of received multicast packets
|
|
|
+ * @tx_packets: number of transmitted packets
|
|
|
+ * @tx_bytes: number of transmitted bytes
|
|
|
+ * @syncp: synchronization point for 64bit counters
|
|
|
+ * @rx_errors: number of rx errors
|
|
|
+ * @tx_dropped: number of tx drops
|
|
|
+ */
|
|
|
+struct vlan_pcpu_stats {
|
|
|
+ u64 rx_packets;
|
|
|
+ u64 rx_bytes;
|
|
|
+ u64 rx_multicast;
|
|
|
+ u64 tx_packets;
|
|
|
+ u64 tx_bytes;
|
|
|
+ struct u64_stats_sync syncp;
|
|
|
+ u32 rx_errors;
|
|
|
+ u32 tx_dropped;
|
|
|
+};
|
|
|
+
|
|
|
+struct proc_dir_entry;
|
|
|
+struct netpoll;
|
|
|
+
|
|
|
+/**
|
|
|
+ * struct vlan_dev_priv - VLAN private device data
|
|
|
+ * @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
|
|
|
+ * @vlan_proto: VLAN encapsulation protocol
|
|
|
+ * @vlan_id: VLAN identifier
|
|
|
+ * @flags: device flags
|
|
|
+ * @real_dev: underlying netdevice
|
|
|
+ * @real_dev_addr: address of underlying netdevice
|
|
|
+ * @dent: proc dir entry
|
|
|
+ * @vlan_pcpu_stats: ptr to percpu rx stats
|
|
|
+ */
|
|
|
+struct vlan_dev_priv {
|
|
|
+ unsigned int nr_ingress_mappings;
|
|
|
+ u32 ingress_priority_map[8];
|
|
|
+ unsigned int nr_egress_mappings;
|
|
|
+ struct vlan_priority_tci_mapping *egress_priority_map[16];
|
|
|
+
|
|
|
+ __be16 vlan_proto;
|
|
|
+ u16 vlan_id;
|
|
|
+ u16 flags;
|
|
|
+
|
|
|
+ struct net_device *real_dev;
|
|
|
+ unsigned char real_dev_addr[ETH_ALEN];
|
|
|
+
|
|
|
+ struct proc_dir_entry *dent;
|
|
|
+ struct vlan_pcpu_stats __percpu *vlan_pcpu_stats;
|
|
|
+#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
+ struct netpoll *netpoll;
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
+static inline struct vlan_dev_priv *vlan_dev_priv(const struct net_device *dev)
|
|
|
+{
|
|
|
+ return netdev_priv(dev);
|
|
|
+}
|
|
|
+
|
|
|
+static inline u16
|
|
|
+vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
|
|
|
+{
|
|
|
+ struct vlan_priority_tci_mapping *mp;
|
|
|
+
|
|
|
+ smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */
|
|
|
+
|
|
|
+ mp = vlan_dev_priv(dev)->egress_priority_map[(skprio & 0xF)];
|
|
|
+ while (mp) {
|
|
|
+ if (mp->priority == skprio) {
|
|
|
+ return mp->vlan_qos; /* This should already be shifted
|
|
|
+ * to mask correctly with the
|
|
|
+ * VLAN's TCI */
|
|
|
+ }
|
|
|
+ mp = mp->next;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
extern bool vlan_do_receive(struct sk_buff **skb);
|
|
|
extern struct sk_buff *vlan_untag(struct sk_buff *skb);
|
|
|
|