Skip to content

Commit d63db30

Browse files
ummakynesdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 32f8c40 commit d63db30

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

include/net/flow_offload.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,20 @@ struct flow_block_offload {
260260
struct netlink_ext_ack *extack;
261261
};
262262

263+
struct flow_block_cb {
264+
struct list_head list;
265+
tc_setup_cb_t *cb;
266+
void *cb_ident;
267+
void *cb_priv;
268+
void (*release)(void *cb_priv);
269+
unsigned int refcnt;
270+
};
271+
272+
struct flow_block_cb *flow_block_cb_alloc(struct net *net, tc_setup_cb_t *cb,
273+
void *cb_ident, void *cb_priv,
274+
void (*release)(void *cb_priv));
275+
void flow_block_cb_free(struct flow_block_cb *block_cb);
276+
263277
int flow_block_cb_setup_simple(struct flow_block_offload *f,
264278
struct list_head *driver_list, tc_setup_cb_t *cb,
265279
void *cb_ident, void *cb_priv, bool ingress_only);

net/core/flow_offload.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,34 @@ void flow_rule_match_enc_opts(const struct flow_rule *rule,
166166
}
167167
EXPORT_SYMBOL(flow_rule_match_enc_opts);
168168

169+
struct flow_block_cb *flow_block_cb_alloc(struct net *net, tc_setup_cb_t *cb,
170+
void *cb_ident, void *cb_priv,
171+
void (*release)(void *cb_priv))
172+
{
173+
struct flow_block_cb *block_cb;
174+
175+
block_cb = kzalloc(sizeof(*block_cb), GFP_KERNEL);
176+
if (!block_cb)
177+
return ERR_PTR(-ENOMEM);
178+
179+
block_cb->cb = cb;
180+
block_cb->cb_ident = cb_ident;
181+
block_cb->cb_priv = cb_priv;
182+
block_cb->release = release;
183+
184+
return block_cb;
185+
}
186+
EXPORT_SYMBOL(flow_block_cb_alloc);
187+
188+
void flow_block_cb_free(struct flow_block_cb *block_cb)
189+
{
190+
if (block_cb->release)
191+
block_cb->release(block_cb->cb_priv);
192+
193+
kfree(block_cb);
194+
}
195+
EXPORT_SYMBOL(flow_block_cb_free);
196+
169197
int flow_block_cb_setup_simple(struct flow_block_offload *f,
170198
struct list_head *driver_block_list,
171199
tc_setup_cb_t *cb, void *cb_ident, void *cb_priv,

0 commit comments

Comments
 (0)