bridge: vlan: learn to count
Add support for per-VLAN Tx/Rx statistics. Every global vlan context gets allocated a per-cpu stats which is then set in each per-port vlan context for quick access. The br_allowed_ingress() common function is used to account for Rx packets and the br_handle_vlan() common function is used to account for Tx packets. Stats accounting is performed only if the bridge-wide vlan_stats_enabled option is set either via sysfs or netlink. A struct hole between vlan_enabled and vlan_proto is used for the new option so it is in the same cache line. Currently it is binary (on/off) but it is intentionally restricted to exactly 0 and 1 since other values will be used in the future for different purposes (e.g. per-port stats). Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
97a47facf3
commit
6dada9b10a
@@ -77,12 +77,21 @@ struct bridge_mcast_querier {
|
||||
};
|
||||
#endif
|
||||
|
||||
struct br_vlan_stats {
|
||||
u64 rx_bytes;
|
||||
u64 rx_packets;
|
||||
u64 tx_bytes;
|
||||
u64 tx_packets;
|
||||
struct u64_stats_sync syncp;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct net_bridge_vlan - per-vlan entry
|
||||
*
|
||||
* @vnode: rhashtable member
|
||||
* @vid: VLAN id
|
||||
* @flags: bridge vlan flags
|
||||
* @stats: per-cpu VLAN statistics
|
||||
* @br: if MASTER flag set, this points to a bridge struct
|
||||
* @port: if MASTER flag unset, this points to a port struct
|
||||
* @refcnt: if MASTER flag set, this is bumped for each port referencing it
|
||||
@@ -100,6 +109,7 @@ struct net_bridge_vlan {
|
||||
struct rhash_head vnode;
|
||||
u16 vid;
|
||||
u16 flags;
|
||||
struct br_vlan_stats __percpu *stats;
|
||||
union {
|
||||
struct net_bridge *br;
|
||||
struct net_bridge_port *port;
|
||||
@@ -342,6 +352,7 @@ struct net_bridge
|
||||
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
|
||||
struct net_bridge_vlan_group __rcu *vlgrp;
|
||||
u8 vlan_enabled;
|
||||
u8 vlan_stats_enabled;
|
||||
__be16 vlan_proto;
|
||||
u16 default_pvid;
|
||||
#endif
|
||||
@@ -691,6 +702,7 @@ int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
|
||||
int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
|
||||
int __br_vlan_set_proto(struct net_bridge *br, __be16 proto);
|
||||
int br_vlan_set_proto(struct net_bridge *br, unsigned long val);
|
||||
int br_vlan_set_stats(struct net_bridge *br, unsigned long val);
|
||||
int br_vlan_init(struct net_bridge *br);
|
||||
int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val);
|
||||
int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid);
|
||||
@@ -880,7 +892,6 @@ static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu(
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct nf_br_ops {
|
||||
|
Reference in New Issue
Block a user