2005-04-16 15:20:36 -07:00
# ifndef __BEN_VLAN_802_1Q_INC__
# define __BEN_VLAN_802_1Q_INC__
# include <linux/if_vlan.h>
2010-06-24 00:55:06 +00:00
# include <linux/u64_stats_sync.h>
2005-04-16 15:20:36 -07:00
2008-07-08 03:23:57 -07:00
/**
* 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 ;
2008-07-08 03:24:44 -07:00
u16 vlan_qos ;
2008-07-08 03:23:57 -07:00
struct vlan_priority_tci_mapping * next ;
} ;
2009-11-17 04:53:09 +00:00
/**
* struct vlan_rx_stats - VLAN percpu rx stats
* @ rx_packets : number of received packets
* @ rx_bytes : number of received bytes
2010-06-24 00:55:06 +00:00
* @ rx_multicast : number of received multicast packets
* @ syncp : synchronization point for 64 bit counters
2009-11-17 04:53:09 +00:00
* @ rx_errors : number of errors
*/
struct vlan_rx_stats {
2010-06-24 00:55:06 +00:00
u64 rx_packets ;
u64 rx_bytes ;
u64 rx_multicast ;
struct u64_stats_sync syncp ;
unsigned long rx_errors ;
2009-11-17 04:53:09 +00:00
} ;
2008-07-08 03:23:57 -07:00
/**
* 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
2009-11-17 04:53:09 +00:00
* @ vlan_rx_stats : ptr to percpu rx stats
2008-07-08 03:23:57 -07:00
*/
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 ] ;
2008-07-08 03:24:44 -07:00
u16 vlan_id ;
u16 flags ;
2008-07-08 03:23:57 -07:00
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 ;
2010-02-16 15:20:26 +00:00
struct vlan_rx_stats __percpu * vlan_rx_stats ;
2008-07-08 03:23:57 -07:00
} ;
static inline struct vlan_dev_info * vlan_dev_info ( const struct net_device * dev )
{
return netdev_priv ( dev ) ;
}
2005-04-16 15:20:36 -07:00
# define VLAN_GRP_HASH_SHIFT 5
# define VLAN_GRP_HASH_SIZE (1 << VLAN_GRP_HASH_SHIFT)
# define VLAN_GRP_HASH_MASK (VLAN_GRP_HASH_SIZE - 1)
/* Find a VLAN device by the MAC address of its Ethernet device, and
* it ' s VLAN ID . The default configuration is to have VLAN ' s scope
* to be box - wide , so the MAC will be ignored . The mac will only be
* looked at if we are configured to have a separate set of VLANs per
* each MAC addressable interface . Note that this latter option does
* NOT follow the spec for VLANs , but may be useful for doing very
* large quantities of VLAN MUX / DEMUX onto FrameRelay or ATM PVCs .
*
* Must be invoked with rcu_read_lock ( ie preempt disabled )
* or with RTNL .
*/
2008-07-08 03:24:44 -07:00
struct net_device * __find_vlan_dev ( struct net_device * real_dev , u16 vlan_id ) ;
2005-04-16 15:20:36 -07:00
/* found in vlan_dev.c */
int vlan_skb_recv ( struct sk_buff * skb , struct net_device * dev ,
2007-02-09 23:24:25 +09:00
struct packet_type * ptype , struct net_device * orig_dev ) ;
2007-06-13 12:05:22 -07:00
void vlan_dev_set_ingress_priority ( const struct net_device * dev ,
2008-07-08 03:24:44 -07:00
u32 skb_prio , u16 vlan_prio ) ;
2007-06-13 12:05:22 -07:00
int vlan_dev_set_egress_priority ( const struct net_device * dev ,
2008-07-08 03:24:44 -07:00
u32 skb_prio , u16 vlan_prio ) ;
2008-07-05 21:26:27 -07:00
int vlan_dev_change_flags ( const struct net_device * dev , u32 flag , u32 mask ) ;
2007-06-13 12:05:22 -07:00
void vlan_dev_get_realdev_name ( const struct net_device * dev , char * result ) ;
2005-04-16 15:20:36 -07:00
2008-07-08 03:24:44 -07:00
int vlan_check_real_dev ( struct net_device * real_dev , u16 vlan_id ) ;
2007-06-13 12:07:54 -07:00
void vlan_setup ( struct net_device * dev ) ;
int register_vlan_dev ( struct net_device * dev ) ;
2009-10-27 07:06:36 +00:00
void unregister_vlan_dev ( struct net_device * dev , struct list_head * head ) ;
2007-06-13 12:07:54 -07:00
2008-07-08 03:23:36 -07:00
static inline u32 vlan_get_ingress_priority ( struct net_device * dev ,
2008-07-08 03:24:44 -07:00
u16 vlan_tci )
2008-07-08 03:23:36 -07:00
{
struct vlan_dev_info * vip = vlan_dev_info ( dev ) ;
2009-10-26 18:40:35 -07:00
return vip - > ingress_priority_map [ ( vlan_tci > > VLAN_PRIO_SHIFT ) & 0x7 ] ;
2008-07-08 03:23:36 -07:00
}
2008-07-05 21:26:57 -07:00
# 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
2008-10-28 22:12:36 -07:00
extern const char vlan_fullname [ ] ;
extern const char vlan_version [ ] ;
extern int vlan_netlink_init ( void ) ;
extern void vlan_netlink_fini ( void ) ;
2007-06-13 12:07:54 -07:00
extern struct rtnl_link_ops vlan_link_ops ;
2008-04-02 00:08:01 -07:00
static inline int is_vlan_dev ( struct net_device * dev )
{
return dev - > priv_flags & IFF_802_1Q_VLAN ;
}
2008-04-16 00:49:09 -07:00
extern int vlan_net_id ;
2008-04-16 00:51:51 -07:00
struct proc_dir_entry ;
2008-04-16 00:49:09 -07:00
struct vlan_net {
2008-04-16 00:51:51 -07:00
/* /proc/net/vlan */
struct proc_dir_entry * proc_vlan_dir ;
/* /proc/net/vlan/config */
struct proc_dir_entry * proc_vlan_conf ;
2008-04-16 00:54:39 -07:00
/* Determines interface naming scheme. */
unsigned short name_type ;
2008-04-16 00:49:09 -07:00
} ;
2005-04-16 15:20:36 -07:00
# endif /* !(__BEN_VLAN_802_1Q_INC__) */