Lines Matching +full:data +full:- +full:out
1 /* SPDX-License-Identifier: GPL-2.0 */
19 rule->action.num_entries = num_actions; in flow_rule_alloc()
20 /* Pre-fill each action hw_stats with DONT_CARE. in flow_rule_alloc()
24 rule->action.entries[i].hw_stats = FLOW_ACTION_HW_STATS_DONT_CARE; in flow_rule_alloc()
31 const struct flow_match *__m = &(__rule)->match; \
32 struct flow_dissector *__d = (__m)->dissector; \
34 (__out)->key = skb_flow_dissector_target(__d, __type, (__m)->key); \
35 (__out)->mask = skb_flow_dissector_target(__d, __type, (__m)->mask); \
38 struct flow_match_meta *out) in flow_rule_match_meta() argument
40 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_META, out); in flow_rule_match_meta()
45 struct flow_match_basic *out) in flow_rule_match_basic() argument
47 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_BASIC, out); in flow_rule_match_basic()
52 struct flow_match_control *out) in flow_rule_match_control() argument
54 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CONTROL, out); in flow_rule_match_control()
59 struct flow_match_eth_addrs *out) in flow_rule_match_eth_addrs() argument
61 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS, out); in flow_rule_match_eth_addrs()
66 struct flow_match_vlan *out) in flow_rule_match_vlan() argument
68 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_VLAN, out); in flow_rule_match_vlan()
73 struct flow_match_vlan *out) in flow_rule_match_cvlan() argument
75 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CVLAN, out); in flow_rule_match_cvlan()
80 struct flow_match_ipv4_addrs *out) in flow_rule_match_ipv4_addrs() argument
82 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPV4_ADDRS, out); in flow_rule_match_ipv4_addrs()
87 struct flow_match_ipv6_addrs *out) in flow_rule_match_ipv6_addrs() argument
89 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPV6_ADDRS, out); in flow_rule_match_ipv6_addrs()
94 struct flow_match_ip *out) in flow_rule_match_ip() argument
96 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IP, out); in flow_rule_match_ip()
101 struct flow_match_ports *out) in flow_rule_match_ports() argument
103 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PORTS, out); in flow_rule_match_ports()
108 struct flow_match_tcp *out) in flow_rule_match_tcp() argument
110 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_TCP, out); in flow_rule_match_tcp()
115 struct flow_match_icmp *out) in flow_rule_match_icmp() argument
117 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ICMP, out); in flow_rule_match_icmp()
122 struct flow_match_mpls *out) in flow_rule_match_mpls() argument
124 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_MPLS, out); in flow_rule_match_mpls()
129 struct flow_match_control *out) in flow_rule_match_enc_control() argument
131 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL, out); in flow_rule_match_enc_control()
136 struct flow_match_ipv4_addrs *out) in flow_rule_match_enc_ipv4_addrs() argument
138 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS, out); in flow_rule_match_enc_ipv4_addrs()
143 struct flow_match_ipv6_addrs *out) in flow_rule_match_enc_ipv6_addrs() argument
145 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS, out); in flow_rule_match_enc_ipv6_addrs()
150 struct flow_match_ip *out) in flow_rule_match_enc_ip() argument
152 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IP, out); in flow_rule_match_enc_ip()
157 struct flow_match_ports *out) in flow_rule_match_enc_ports() argument
159 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_PORTS, out); in flow_rule_match_enc_ports()
164 struct flow_match_enc_keyid *out) in flow_rule_match_enc_keyid() argument
166 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_KEYID, out); in flow_rule_match_enc_keyid()
171 struct flow_match_enc_opts *out) in flow_rule_match_enc_opts() argument
173 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_OPTS, out); in flow_rule_match_enc_opts()
177 struct flow_action_cookie *flow_action_cookie_create(void *data, in flow_action_cookie_create() argument
186 cookie->cookie_len = len; in flow_action_cookie_create()
187 memcpy(cookie->cookie, data, len); in flow_action_cookie_create()
199 struct flow_match_ct *out) in flow_rule_match_ct() argument
201 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CT, out); in flow_rule_match_ct()
213 return ERR_PTR(-ENOMEM); in flow_block_cb_alloc()
215 block_cb->cb = cb; in flow_block_cb_alloc()
216 block_cb->cb_ident = cb_ident; in flow_block_cb_alloc()
217 block_cb->cb_priv = cb_priv; in flow_block_cb_alloc()
218 block_cb->release = release; in flow_block_cb_alloc()
226 if (block_cb->release) in flow_block_cb_free()
227 block_cb->release(block_cb->cb_priv); in flow_block_cb_free()
238 list_for_each_entry(block_cb, &block->cb_list, list) { in flow_block_cb_lookup()
239 if (block_cb->cb == cb && in flow_block_cb_lookup()
240 block_cb->cb_ident == cb_ident) in flow_block_cb_lookup()
250 return block_cb->cb_priv; in flow_block_cb_priv()
256 block_cb->refcnt++; in flow_block_cb_incref()
262 return --block_cb->refcnt; in flow_block_cb_decref()
272 if (block_cb->cb == cb && in flow_block_cb_is_busy()
273 block_cb->cb_ident == cb_ident) in flow_block_cb_is_busy()
290 f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in flow_block_cb_setup_simple()
291 return -EOPNOTSUPP; in flow_block_cb_setup_simple()
293 f->driver_block_list = driver_block_list; in flow_block_cb_setup_simple()
295 switch (f->command) { in flow_block_cb_setup_simple()
298 return -EBUSY; in flow_block_cb_setup_simple()
305 list_add_tail(&block_cb->driver_list, driver_block_list); in flow_block_cb_setup_simple()
308 block_cb = flow_block_cb_lookup(f->block, cb, cb_ident); in flow_block_cb_setup_simple()
310 return -ENOENT; in flow_block_cb_setup_simple()
313 list_del(&block_cb->driver_list); in flow_block_cb_setup_simple()
316 return -EOPNOTSUPP; in flow_block_cb_setup_simple()
342 indr_dev->cb = cb; in flow_indr_dev_alloc()
343 indr_dev->cb_priv = cb_priv; in flow_indr_dev_alloc()
344 refcount_set(&indr_dev->refcnt, 1); in flow_indr_dev_alloc()
350 void *data; member
368 bo.command = cur->command; in existing_qdiscs_register()
369 bo.binder_type = cur->binder_type; in existing_qdiscs_register()
371 cb(cur->dev, cur->sch, cb_priv, cur->type, &bo, cur->data, cur->cleanup); in existing_qdiscs_register()
372 list_splice(&bo.cb_list, cur->cb_list); in existing_qdiscs_register()
382 if (indr_dev->cb == cb && in flow_indr_dev_register()
383 indr_dev->cb_priv == cb_priv) { in flow_indr_dev_register()
384 refcount_inc(&indr_dev->refcnt); in flow_indr_dev_register()
393 return -ENOMEM; in flow_indr_dev_register()
396 list_add(&indr_dev->list, &flow_block_indr_dev_list); in flow_indr_dev_register()
411 if (this->release == release && in __flow_block_indr_cleanup()
412 this->indr.cb_priv == cb_priv) in __flow_block_indr_cleanup()
413 list_move(&this->indr.list, cleanup_list); in __flow_block_indr_cleanup()
422 list_del(&this->indr.list); in flow_block_indr_notify()
423 this->indr.cleanup(this); in flow_block_indr_notify()
435 if (this->cb == cb && in flow_indr_dev_unregister()
436 this->cb_priv == cb_priv && in flow_indr_dev_unregister()
437 refcount_dec_and_test(&this->refcnt)) { in flow_indr_dev_unregister()
439 list_del(&indr_dev->list); in flow_indr_dev_unregister()
459 struct net_device *dev, struct Qdisc *sch, void *data, in flow_block_indr_init() argument
463 flow_block->indr.binder_type = bo->binder_type; in flow_block_indr_init()
464 flow_block->indr.data = data; in flow_block_indr_init()
465 flow_block->indr.cb_priv = cb_priv; in flow_block_indr_init()
466 flow_block->indr.dev = dev; in flow_block_indr_init()
467 flow_block->indr.sch = sch; in flow_block_indr_init()
468 flow_block->indr.cleanup = cleanup; in flow_block_indr_init()
476 struct Qdisc *sch, void *data, in flow_indr_block_cb_alloc() argument
484 goto out; in flow_indr_block_cb_alloc()
486 flow_block_indr_init(block_cb, bo, dev, sch, data, indr_cb_priv, cleanup); in flow_indr_block_cb_alloc()
487 list_add(&block_cb->indr.list, &flow_block_indr_list); in flow_indr_block_cb_alloc()
489 out: in flow_indr_block_cb_alloc()
494 static struct flow_indir_dev_info *find_indir_dev(void *data) in find_indir_dev() argument
499 if (cur->data == data) in find_indir_dev()
505 static int indir_dev_add(void *data, struct net_device *dev, struct Qdisc *sch, in indir_dev_add() argument
511 info = find_indir_dev(data); in indir_dev_add()
513 return -EEXIST; in indir_dev_add()
517 return -ENOMEM; in indir_dev_add()
519 info->data = data; in indir_dev_add()
520 info->dev = dev; in indir_dev_add()
521 info->sch = sch; in indir_dev_add()
522 info->type = type; in indir_dev_add()
523 info->cleanup = cleanup; in indir_dev_add()
524 info->command = bo->command; in indir_dev_add()
525 info->binder_type = bo->binder_type; in indir_dev_add()
526 info->cb_list = bo->cb_list_head; in indir_dev_add()
528 list_add(&info->list, &flow_indir_dev_list); in indir_dev_add()
532 static int indir_dev_remove(void *data) in indir_dev_remove() argument
536 info = find_indir_dev(data); in indir_dev_remove()
538 return -ENOENT; in indir_dev_remove()
540 list_del(&info->list); in indir_dev_remove()
547 enum tc_setup_type type, void *data, in flow_indr_dev_setup_offload() argument
555 if (bo->command == FLOW_BLOCK_BIND) in flow_indr_dev_setup_offload()
556 indir_dev_add(data, dev, sch, type, cleanup, bo); in flow_indr_dev_setup_offload()
557 else if (bo->command == FLOW_BLOCK_UNBIND) in flow_indr_dev_setup_offload()
558 indir_dev_remove(data); in flow_indr_dev_setup_offload()
561 this->cb(dev, sch, this->cb_priv, type, bo, data, cleanup); in flow_indr_dev_setup_offload()
565 return list_empty(&bo->cb_list) ? -EOPNOTSUPP : 0; in flow_indr_dev_setup_offload()