Lines Matching +full:data +full:- +full:out
1 /* SPDX-License-Identifier: GPL-2.0 */
20 rule->action.num_entries = num_actions; in flow_rule_alloc()
21 /* Pre-fill each action hw_stats with DONT_CARE. in flow_rule_alloc()
25 rule->action.entries[i].hw_stats = FLOW_ACTION_HW_STATS_DONT_CARE; in flow_rule_alloc()
41 fl_action->action.num_entries = num_actions; in offload_action_alloc()
42 /* Pre-fill each action hw_stats with DONT_CARE. in offload_action_alloc()
46 fl_action->action.entries[i].hw_stats = FLOW_ACTION_HW_STATS_DONT_CARE; in offload_action_alloc()
52 const struct flow_match *__m = &(__rule)->match; \
53 struct flow_dissector *__d = (__m)->dissector; \
55 (__out)->key = skb_flow_dissector_target(__d, __type, (__m)->key); \
56 (__out)->mask = skb_flow_dissector_target(__d, __type, (__m)->mask); \
59 struct flow_match_meta *out) in flow_rule_match_meta() argument
61 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_META, out); in flow_rule_match_meta()
66 struct flow_match_basic *out) in flow_rule_match_basic() argument
68 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_BASIC, out); in flow_rule_match_basic()
73 struct flow_match_control *out) in flow_rule_match_control() argument
75 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CONTROL, out); in flow_rule_match_control()
80 struct flow_match_eth_addrs *out) in flow_rule_match_eth_addrs() argument
82 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS, out); in flow_rule_match_eth_addrs()
87 struct flow_match_vlan *out) in flow_rule_match_vlan() argument
89 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_VLAN, out); in flow_rule_match_vlan()
94 struct flow_match_vlan *out) in flow_rule_match_cvlan() argument
96 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CVLAN, out); in flow_rule_match_cvlan()
101 struct flow_match_arp *out) in flow_rule_match_arp() argument
103 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ARP, out); in flow_rule_match_arp()
108 struct flow_match_ipv4_addrs *out) in flow_rule_match_ipv4_addrs() argument
110 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPV4_ADDRS, out); in flow_rule_match_ipv4_addrs()
115 struct flow_match_ipv6_addrs *out) in flow_rule_match_ipv6_addrs() argument
117 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPV6_ADDRS, out); in flow_rule_match_ipv6_addrs()
122 struct flow_match_ip *out) in flow_rule_match_ip() argument
124 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IP, out); in flow_rule_match_ip()
129 struct flow_match_ports *out) in flow_rule_match_ports() argument
131 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PORTS, out); in flow_rule_match_ports()
136 struct flow_match_ports_range *out) in flow_rule_match_ports_range() argument
138 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PORTS_RANGE, out); in flow_rule_match_ports_range()
143 struct flow_match_tcp *out) in flow_rule_match_tcp() argument
145 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_TCP, out); in flow_rule_match_tcp()
150 struct flow_match_ipsec *out) in flow_rule_match_ipsec() argument
152 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_IPSEC, out); in flow_rule_match_ipsec()
157 struct flow_match_icmp *out) in flow_rule_match_icmp() argument
159 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ICMP, out); in flow_rule_match_icmp()
164 struct flow_match_mpls *out) in flow_rule_match_mpls() argument
166 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_MPLS, out); in flow_rule_match_mpls()
171 struct flow_match_control *out) in flow_rule_match_enc_control() argument
173 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL, out); in flow_rule_match_enc_control()
178 struct flow_match_ipv4_addrs *out) in flow_rule_match_enc_ipv4_addrs() argument
180 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS, out); in flow_rule_match_enc_ipv4_addrs()
185 struct flow_match_ipv6_addrs *out) in flow_rule_match_enc_ipv6_addrs() argument
187 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS, out); in flow_rule_match_enc_ipv6_addrs()
192 struct flow_match_ip *out) in flow_rule_match_enc_ip() argument
194 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_IP, out); in flow_rule_match_enc_ip()
199 struct flow_match_ports *out) in flow_rule_match_enc_ports() argument
201 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_PORTS, out); in flow_rule_match_enc_ports()
206 struct flow_match_enc_keyid *out) in flow_rule_match_enc_keyid() argument
208 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_KEYID, out); in flow_rule_match_enc_keyid()
213 struct flow_match_enc_opts *out) in flow_rule_match_enc_opts() argument
215 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_ENC_OPTS, out); in flow_rule_match_enc_opts()
219 struct flow_action_cookie *flow_action_cookie_create(void *data, in flow_action_cookie_create() argument
228 cookie->cookie_len = len; in flow_action_cookie_create()
229 memcpy(cookie->cookie, data, len); in flow_action_cookie_create()
241 struct flow_match_ct *out) in flow_rule_match_ct() argument
243 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CT, out); in flow_rule_match_ct()
248 struct flow_match_pppoe *out) in flow_rule_match_pppoe() argument
250 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PPPOE, out); in flow_rule_match_pppoe()
255 struct flow_match_l2tpv3 *out) in flow_rule_match_l2tpv3() argument
257 FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_L2TPV3, out); in flow_rule_match_l2tpv3()
269 return ERR_PTR(-ENOMEM); in flow_block_cb_alloc()
271 block_cb->cb = cb; in flow_block_cb_alloc()
272 block_cb->cb_ident = cb_ident; in flow_block_cb_alloc()
273 block_cb->cb_priv = cb_priv; in flow_block_cb_alloc()
274 block_cb->release = release; in flow_block_cb_alloc()
282 if (block_cb->release) in flow_block_cb_free()
283 block_cb->release(block_cb->cb_priv); in flow_block_cb_free()
294 list_for_each_entry(block_cb, &block->cb_list, list) { in flow_block_cb_lookup()
295 if (block_cb->cb == cb && in flow_block_cb_lookup()
296 block_cb->cb_ident == cb_ident) in flow_block_cb_lookup()
306 return block_cb->cb_priv; in flow_block_cb_priv()
312 block_cb->refcnt++; in flow_block_cb_incref()
318 return --block_cb->refcnt; in flow_block_cb_decref()
328 if (block_cb->cb == cb && in flow_block_cb_is_busy()
329 block_cb->cb_ident == cb_ident) in flow_block_cb_is_busy()
346 f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in flow_block_cb_setup_simple()
347 return -EOPNOTSUPP; in flow_block_cb_setup_simple()
349 f->driver_block_list = driver_block_list; in flow_block_cb_setup_simple()
351 switch (f->command) { in flow_block_cb_setup_simple()
354 return -EBUSY; in flow_block_cb_setup_simple()
361 list_add_tail(&block_cb->driver_list, driver_block_list); in flow_block_cb_setup_simple()
364 block_cb = flow_block_cb_lookup(f->block, cb, cb_ident); in flow_block_cb_setup_simple()
366 return -ENOENT; in flow_block_cb_setup_simple()
369 list_del(&block_cb->driver_list); in flow_block_cb_setup_simple()
372 return -EOPNOTSUPP; in flow_block_cb_setup_simple()
398 indr_dev->cb = cb; in flow_indr_dev_alloc()
399 indr_dev->cb_priv = cb_priv; in flow_indr_dev_alloc()
400 refcount_set(&indr_dev->refcnt, 1); in flow_indr_dev_alloc()
406 void *data; member
424 bo.command = cur->command; in existing_qdiscs_register()
425 bo.binder_type = cur->binder_type; in existing_qdiscs_register()
427 cb(cur->dev, cur->sch, cb_priv, cur->type, &bo, cur->data, cur->cleanup); in existing_qdiscs_register()
428 list_splice(&bo.cb_list, cur->cb_list); in existing_qdiscs_register()
438 if (indr_dev->cb == cb && in flow_indr_dev_register()
439 indr_dev->cb_priv == cb_priv) { in flow_indr_dev_register()
440 refcount_inc(&indr_dev->refcnt); in flow_indr_dev_register()
449 return -ENOMEM; in flow_indr_dev_register()
452 list_add(&indr_dev->list, &flow_block_indr_dev_list); in flow_indr_dev_register()
469 if (this->release == release && in __flow_block_indr_cleanup()
470 this->indr.cb_priv == cb_priv) in __flow_block_indr_cleanup()
471 list_move(&this->indr.list, cleanup_list); in __flow_block_indr_cleanup()
480 list_del(&this->indr.list); in flow_block_indr_notify()
481 this->indr.cleanup(this); in flow_block_indr_notify()
493 if (this->cb == cb && in flow_indr_dev_unregister()
494 this->cb_priv == cb_priv && in flow_indr_dev_unregister()
495 refcount_dec_and_test(&this->refcnt)) { in flow_indr_dev_unregister()
497 list_del(&indr_dev->list); in flow_indr_dev_unregister()
518 struct net_device *dev, struct Qdisc *sch, void *data, in flow_block_indr_init() argument
522 flow_block->indr.binder_type = bo->binder_type; in flow_block_indr_init()
523 flow_block->indr.data = data; in flow_block_indr_init()
524 flow_block->indr.cb_priv = cb_priv; in flow_block_indr_init()
525 flow_block->indr.dev = dev; in flow_block_indr_init()
526 flow_block->indr.sch = sch; in flow_block_indr_init()
527 flow_block->indr.cleanup = cleanup; in flow_block_indr_init()
535 struct Qdisc *sch, void *data, in flow_indr_block_cb_alloc() argument
543 goto out; in flow_indr_block_cb_alloc()
545 flow_block_indr_init(block_cb, bo, dev, sch, data, indr_cb_priv, cleanup); in flow_indr_block_cb_alloc()
546 list_add(&block_cb->indr.list, &flow_block_indr_list); in flow_indr_block_cb_alloc()
548 out: in flow_indr_block_cb_alloc()
553 static struct flow_indir_dev_info *find_indir_dev(void *data) in find_indir_dev() argument
558 if (cur->data == data) in find_indir_dev()
564 static int indir_dev_add(void *data, struct net_device *dev, struct Qdisc *sch, in indir_dev_add() argument
570 info = find_indir_dev(data); in indir_dev_add()
572 return -EEXIST; in indir_dev_add()
576 return -ENOMEM; in indir_dev_add()
578 info->data = data; in indir_dev_add()
579 info->dev = dev; in indir_dev_add()
580 info->sch = sch; in indir_dev_add()
581 info->type = type; in indir_dev_add()
582 info->cleanup = cleanup; in indir_dev_add()
583 info->command = bo->command; in indir_dev_add()
584 info->binder_type = bo->binder_type; in indir_dev_add()
585 info->cb_list = bo->cb_list_head; in indir_dev_add()
587 list_add(&info->list, &flow_indir_dev_list); in indir_dev_add()
591 static int indir_dev_remove(void *data) in indir_dev_remove() argument
595 info = find_indir_dev(data); in indir_dev_remove()
597 return -ENOENT; in indir_dev_remove()
599 list_del(&info->list); in indir_dev_remove()
606 enum tc_setup_type type, void *data, in flow_indr_dev_setup_offload() argument
616 if (bo->command == FLOW_BLOCK_BIND) in flow_indr_dev_setup_offload()
617 indir_dev_add(data, dev, sch, type, cleanup, bo); in flow_indr_dev_setup_offload()
618 else if (bo->command == FLOW_BLOCK_UNBIND) in flow_indr_dev_setup_offload()
619 indir_dev_remove(data); in flow_indr_dev_setup_offload()
623 err = this->cb(dev, sch, this->cb_priv, type, bo, data, cleanup); in flow_indr_dev_setup_offload()
630 return (bo && list_empty(&bo->cb_list)) ? -EOPNOTSUPP : count; in flow_indr_dev_setup_offload()