Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6.git] / net / 8021q / vlan.h
index 14c421e..b26ce34 100644 (file)
@@ -2,6 +2,7 @@
 #define __BEN_VLAN_802_1Q_INC__
 
 #include <linux/if_vlan.h>
+#include <linux/u64_stats_sync.h>
 
 
 /**
  */
 struct vlan_priority_tci_mapping {
        u32                                     priority;
-       unsigned short                          vlan_qos;
+       u16                                     vlan_qos;
        struct vlan_priority_tci_mapping        *next;
 };
 
+
+/**
+ *     struct vlan_rx_stats - VLAN percpu rx stats
+ *     @rx_packets: number of received packets
+ *     @rx_bytes: number of received bytes
+ *     @rx_multicast: number of received multicast packets
+ *     @syncp: synchronization point for 64bit counters
+ *     @rx_errors: number of errors
+ *     @rx_dropped: number of dropped packets
+ */
+struct vlan_rx_stats {
+       u64                     rx_packets;
+       u64                     rx_bytes;
+       u64                     rx_multicast;
+       struct u64_stats_sync   syncp;
+       unsigned long           rx_errors;
+       unsigned long           rx_dropped;
+};
+
 /**
  *     struct vlan_dev_info - VLAN private device data
  *     @nr_ingress_mappings: number of ingress priority mappings
@@ -29,6 +49,7 @@ struct vlan_priority_tci_mapping {
  *     @dent: proc dir entry
  *     @cnt_inc_headroom_on_tx: statistic - number of skb expansions on TX
  *     @cnt_encap_on_xmit: statistic - number of skb encapsulations on TX
+ *     @vlan_rx_stats: ptr to percpu rx stats
  */
 struct vlan_dev_info {
        unsigned int                            nr_ingress_mappings;
@@ -36,8 +57,8 @@ struct vlan_dev_info {
        unsigned int                            nr_egress_mappings;
        struct vlan_priority_tci_mapping        *egress_priority_map[16];
 
-       unsigned short                          vlan_id;
-       unsigned short                          flags;
+       u16                                     vlan_id;
+       u16                                     flags;
 
        struct net_device                       *real_dev;
        unsigned char                           real_dev_addr[ETH_ALEN];
@@ -45,6 +66,7 @@ struct vlan_dev_info {
        struct proc_dir_entry                   *dent;
        unsigned long                           cnt_inc_headroom_on_tx;
        unsigned long                           cnt_encap_on_xmit;
+       struct vlan_rx_stats __percpu           *vlan_rx_stats;
 };
 
 static inline struct vlan_dev_info *vlan_dev_info(const struct net_device *dev)
@@ -67,30 +89,29 @@ static inline struct vlan_dev_info *vlan_dev_info(const struct net_device *dev)
  *  Must be invoked with rcu_read_lock (ie preempt disabled)
  *  or with RTNL.
  */
-struct net_device *__find_vlan_dev(struct net_device *real_dev,
-                                  unsigned short VID); /* vlan.c */
+struct net_device *__find_vlan_dev(struct net_device *real_dev, u16 vlan_id);
 
 /* found in vlan_dev.c */
 int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
                  struct packet_type *ptype, struct net_device *orig_dev);
 void vlan_dev_set_ingress_priority(const struct net_device *dev,
-                                  u32 skb_prio, short vlan_prio);
+                                  u32 skb_prio, u16 vlan_prio);
 int vlan_dev_set_egress_priority(const struct net_device *dev,
-                                u32 skb_prio, short vlan_prio);
+                                u32 skb_prio, u16 vlan_prio);
 int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask);
 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result);
 
-int vlan_check_real_dev(struct net_device *real_dev, unsigned short vlan_id);
+int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id);
 void vlan_setup(struct net_device *dev);
 int register_vlan_dev(struct net_device *dev);
-void unregister_vlan_dev(struct net_device *dev);
+void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
 
 static inline u32 vlan_get_ingress_priority(struct net_device *dev,
-                                           unsigned short vlan_tag)
+                                           u16 vlan_tci)
 {
        struct vlan_dev_info *vip = vlan_dev_info(dev);
 
-       return vip->ingress_priority_map[(vlan_tag >> 13) & 0x7];
+       return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7];
 }
 
 #ifdef CONFIG_VLAN_8021Q_GVRP
@@ -109,8 +130,10 @@ static inline int vlan_gvrp_init(void) { return 0; }
 static inline void vlan_gvrp_uninit(void) {}
 #endif
 
-int vlan_netlink_init(void);
-void vlan_netlink_fini(void);
+extern const char vlan_fullname[];
+extern const char vlan_version[];
+extern int vlan_netlink_init(void);
+extern void vlan_netlink_fini(void);
 
 extern struct rtnl_link_ops vlan_link_ops;