forked from mirrors/linux
		
	net: flow_offload: add flow_block_cb_alloc() and flow_block_cb_free()
Add a new helper function to allocate flow_block_cb objects. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									32f8c4093a
								
							
						
					
					
						commit
						d63db30c85
					
				
					 2 changed files with 42 additions and 0 deletions
				
			
		| 
						 | 
					@ -260,6 +260,20 @@ struct flow_block_offload {
 | 
				
			||||||
	struct netlink_ext_ack *extack;
 | 
						struct netlink_ext_ack *extack;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct flow_block_cb {
 | 
				
			||||||
 | 
						struct list_head	list;
 | 
				
			||||||
 | 
						tc_setup_cb_t		*cb;
 | 
				
			||||||
 | 
						void			*cb_ident;
 | 
				
			||||||
 | 
						void			*cb_priv;
 | 
				
			||||||
 | 
						void			(*release)(void *cb_priv);
 | 
				
			||||||
 | 
						unsigned int		refcnt;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct flow_block_cb *flow_block_cb_alloc(struct net *net, tc_setup_cb_t *cb,
 | 
				
			||||||
 | 
										  void *cb_ident, void *cb_priv,
 | 
				
			||||||
 | 
										  void (*release)(void *cb_priv));
 | 
				
			||||||
 | 
					void flow_block_cb_free(struct flow_block_cb *block_cb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int flow_block_cb_setup_simple(struct flow_block_offload *f,
 | 
					int flow_block_cb_setup_simple(struct flow_block_offload *f,
 | 
				
			||||||
			       struct list_head *driver_list, tc_setup_cb_t *cb,
 | 
								       struct list_head *driver_list, tc_setup_cb_t *cb,
 | 
				
			||||||
			       void *cb_ident, void *cb_priv, bool ingress_only);
 | 
								       void *cb_ident, void *cb_priv, bool ingress_only);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -166,6 +166,34 @@ void flow_rule_match_enc_opts(const struct flow_rule *rule,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(flow_rule_match_enc_opts);
 | 
					EXPORT_SYMBOL(flow_rule_match_enc_opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct flow_block_cb *flow_block_cb_alloc(struct net *net, tc_setup_cb_t *cb,
 | 
				
			||||||
 | 
										  void *cb_ident, void *cb_priv,
 | 
				
			||||||
 | 
										  void (*release)(void *cb_priv))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct flow_block_cb *block_cb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						block_cb = kzalloc(sizeof(*block_cb), GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!block_cb)
 | 
				
			||||||
 | 
							return ERR_PTR(-ENOMEM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						block_cb->cb = cb;
 | 
				
			||||||
 | 
						block_cb->cb_ident = cb_ident;
 | 
				
			||||||
 | 
						block_cb->cb_priv = cb_priv;
 | 
				
			||||||
 | 
						block_cb->release = release;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return block_cb;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(flow_block_cb_alloc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void flow_block_cb_free(struct flow_block_cb *block_cb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (block_cb->release)
 | 
				
			||||||
 | 
							block_cb->release(block_cb->cb_priv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kfree(block_cb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(flow_block_cb_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int flow_block_cb_setup_simple(struct flow_block_offload *f,
 | 
					int flow_block_cb_setup_simple(struct flow_block_offload *f,
 | 
				
			||||||
			       struct list_head *driver_block_list,
 | 
								       struct list_head *driver_block_list,
 | 
				
			||||||
			       tc_setup_cb_t *cb, void *cb_ident, void *cb_priv,
 | 
								       tc_setup_cb_t *cb, void *cb_ident, void *cb_priv,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue