forked from mirrors/linux
		
	net/sched: cls_flower: Hardware offloaded filters statistics support
Introduce a new command in ndo_setup_tc() for hardware offloaded filters, to call the NIC driver, and make it update the statistics. This will be done before dumping the filter and its statistics. Signed-off-by: Amir Vadai <amirva@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									9fea47d93b
								
							
						
					
					
						commit
						10cbc68434
					
				
					 2 changed files with 22 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -426,6 +426,7 @@ static inline bool tc_flags_valid(u32 flags)
 | 
			
		|||
enum tc_fl_command {
 | 
			
		||||
	TC_CLSFLOWER_REPLACE,
 | 
			
		||||
	TC_CLSFLOWER_DESTROY,
 | 
			
		||||
	TC_CLSFLOWER_STATS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct tc_cls_flower_offload {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,6 +210,25 @@ static void fl_hw_replace_filter(struct tcf_proto *tp,
 | 
			
		|||
	dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, &tc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f)
 | 
			
		||||
{
 | 
			
		||||
	struct net_device *dev = tp->q->dev_queue->dev;
 | 
			
		||||
	struct tc_cls_flower_offload offload = {0};
 | 
			
		||||
	struct tc_to_netdev tc;
 | 
			
		||||
 | 
			
		||||
	if (!tc_should_offload(dev, 0))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	offload.command = TC_CLSFLOWER_STATS;
 | 
			
		||||
	offload.cookie = (unsigned long)f;
 | 
			
		||||
	offload.exts = &f->exts;
 | 
			
		||||
 | 
			
		||||
	tc.type = TC_SETUP_CLSFLOWER;
 | 
			
		||||
	tc.cls_flower = &offload;
 | 
			
		||||
 | 
			
		||||
	dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, &tc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool fl_destroy(struct tcf_proto *tp, bool force)
 | 
			
		||||
{
 | 
			
		||||
	struct cls_fl_head *head = rtnl_dereference(tp->root);
 | 
			
		||||
| 
						 | 
				
			
			@ -662,6 +681,8 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
 | 
			
		|||
			goto nla_put_failure;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fl_hw_update_stats(tp, f);
 | 
			
		||||
 | 
			
		||||
	if (fl_dump_key_val(skb, key->eth.dst, TCA_FLOWER_KEY_ETH_DST,
 | 
			
		||||
			    mask->eth.dst, TCA_FLOWER_KEY_ETH_DST_MASK,
 | 
			
		||||
			    sizeof(key->eth.dst)) ||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue