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 51271ae..b26ce34 100644 (file)
@@ -2,8 +2,77 @@
 #define __BEN_VLAN_802_1Q_INC__
 
 #include <linux/if_vlan.h>
+#include <linux/u64_stats_sync.h>
 
-extern unsigned short vlan_name_type;
+
+/**
+ *     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_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
+ *     @ingress_priority_map: ingress priority mappings
+ *     @nr_egress_mappings: number of egress priority mappings
+ *     @egress_priority_map: hash of egress priority mappings
+ *     @vlan_id: VLAN identifier
+ *     @flags: device flags
+ *     @real_dev: underlying netdevice
+ *     @real_dev_addr: address of underlying netdevice
+ *     @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;
+       u32                                     ingress_priority_map[8];
+       unsigned int                            nr_egress_mappings;
+       struct vlan_priority_tci_mapping        *egress_priority_map[16];
+
+       u16                                     vlan_id;
+       u16                                     flags;
+
+       struct net_device                       *real_dev;
+       unsigned char                           real_dev_addr[ETH_ALEN];
+
+       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)
+{
+       return netdev_priv(dev);
+}
 
 #define VLAN_GRP_HASH_SHIFT    5
 #define VLAN_GRP_HASH_SIZE     (1 << VLAN_GRP_HASH_SHIFT)
@@ -20,28 +89,51 @@ extern unsigned short vlan_name_type;
  *  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);
-int vlan_dev_set_vlan_flag(const struct net_device *dev,
-                          u32 flag, short flag_val);
+                                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);
-void vlan_dev_get_vid(const struct net_device *dev, unsigned short *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,
+                                           u16 vlan_tci)
+{
+       struct vlan_dev_info *vip = vlan_dev_info(dev);
+
+       return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7];
+}
+
+#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
 
-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;
 
@@ -50,4 +142,17 @@ static inline int is_vlan_dev(struct net_device *dev)
        return dev->priv_flags & IFF_802_1Q_VLAN;
 }
 
+extern int vlan_net_id;
+
+struct proc_dir_entry;
+
+struct vlan_net {
+       /* /proc/net/vlan */
+       struct proc_dir_entry *proc_vlan_dir;
+       /* /proc/net/vlan/config */
+       struct proc_dir_entry *proc_vlan_conf;
+       /* Determines interface naming scheme. */
+       unsigned short name_type;
+};
+
 #endif /* !(__BEN_VLAN_802_1Q_INC__) */