Lines Matching +full:num +full:- +full:ports
1 // SPDX-License-Identifier: GPL-2.0-only
39 u8 num; member
43 u8 num; member
59 data->v4.src_addr, data->src_port, in mtk_flow_set_ipv4_addr()
60 data->v4.dst_addr, data->dst_port); in mtk_flow_set_ipv4_addr()
68 data->v6.src_addr.s6_addr32, data->src_port, in mtk_flow_set_ipv6_addr()
69 data->v6.dst_addr.s6_addr32, data->dst_port); in mtk_flow_set_ipv6_addr()
75 void *dest = eth + act->mangle.offset; in mtk_flow_offload_mangle_eth()
76 const void *src = &act->mangle.val; in mtk_flow_offload_mangle_eth()
78 if (act->mangle.offset > 8) in mtk_flow_offload_mangle_eth()
81 if (act->mangle.mask == 0xffff) { in mtk_flow_offload_mangle_eth()
86 memcpy(dest, src, act->mangle.mask ? 2 : 4); in mtk_flow_offload_mangle_eth()
97 return -ENODEV; in mtk_flow_get_wdma_info()
100 return -1; in mtk_flow_get_wdma_info()
106 path = &stack.path[stack.num_paths - 1]; in mtk_flow_get_wdma_info()
107 if (path->type != DEV_PATH_MTK_WDMA) in mtk_flow_get_wdma_info()
108 return -1; in mtk_flow_get_wdma_info()
110 info->wdma_idx = path->mtk_wdma.wdma_idx; in mtk_flow_get_wdma_info()
111 info->queue = path->mtk_wdma.queue; in mtk_flow_get_wdma_info()
112 info->bss = path->mtk_wdma.bss; in mtk_flow_get_wdma_info()
113 info->wcid = path->mtk_wdma.wcid; in mtk_flow_get_wdma_info()
123 u32 val = ntohl(act->mangle.val); in mtk_flow_mangle_ports()
125 switch (act->mangle.offset) { in mtk_flow_mangle_ports()
127 if (act->mangle.mask == ~htonl(0xffff)) in mtk_flow_mangle_ports()
128 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
130 data->src_port = cpu_to_be16(val >> 16); in mtk_flow_mangle_ports()
133 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
136 return -EINVAL; in mtk_flow_mangle_ports()
148 switch (act->mangle.offset) { in mtk_flow_mangle_ipv4()
150 dest = &data->v4.src_addr; in mtk_flow_mangle_ipv4()
153 dest = &data->v4.dst_addr; in mtk_flow_mangle_ipv4()
156 return -EINVAL; in mtk_flow_mangle_ipv4()
159 memcpy(dest, &act->mangle.val, sizeof(u32)); in mtk_flow_mangle_ipv4()
172 return -ENODEV; in mtk_flow_get_dsa_port()
174 if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK) in mtk_flow_get_dsa_port()
175 return -ENODEV; in mtk_flow_get_dsa_port()
179 return dp->index; in mtk_flow_get_dsa_port()
181 return -ENODEV; in mtk_flow_get_dsa_port()
205 return -EINVAL; in mtk_flow_set_output_device()
216 if (dev == eth->netdev[0]) in mtk_flow_set_output_device()
218 else if (dev == eth->netdev[1]) in mtk_flow_set_output_device()
220 else if (dev == eth->netdev[2]) in mtk_flow_set_output_device()
223 return -EOPNOTSUPP; in mtk_flow_set_output_device()
229 queue = pse_port - 1; in mtk_flow_set_output_device()
250 int wed_index = -1; in mtk_flow_offload_replace()
256 if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) in mtk_flow_offload_replace()
257 return -EEXIST; in mtk_flow_offload_replace()
264 return -EOPNOTSUPP; in mtk_flow_offload_replace()
271 addr_type = match.key->addr_type; in mtk_flow_offload_replace()
273 return -EOPNOTSUPP; in mtk_flow_offload_replace()
280 l4proto = match.key->ip_proto; in mtk_flow_offload_replace()
282 return -EOPNOTSUPP; in mtk_flow_offload_replace()
292 memcpy(data.eth.h_dest, match.key->dst, ETH_ALEN); in mtk_flow_offload_replace()
293 memcpy(data.eth.h_source, match.key->src, ETH_ALEN); in mtk_flow_offload_replace()
295 return -EOPNOTSUPP; in mtk_flow_offload_replace()
303 if (match.key->vlan_tpid != cpu_to_be16(ETH_P_8021Q)) in mtk_flow_offload_replace()
304 return -EOPNOTSUPP; in mtk_flow_offload_replace()
306 data.vlan_in = match.key->vlan_id; in mtk_flow_offload_replace()
316 return -EOPNOTSUPP; in mtk_flow_offload_replace()
319 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
320 switch (act->id) { in mtk_flow_offload_replace()
323 return -EOPNOTSUPP; in mtk_flow_offload_replace()
324 if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) in mtk_flow_offload_replace()
328 odev = act->dev; in mtk_flow_offload_replace()
333 if (data.vlan.num == 1 || in mtk_flow_offload_replace()
334 act->vlan.proto != htons(ETH_P_8021Q)) in mtk_flow_offload_replace()
335 return -EOPNOTSUPP; in mtk_flow_offload_replace()
337 data.vlan.id = act->vlan.vid; in mtk_flow_offload_replace()
338 data.vlan.proto = act->vlan.proto; in mtk_flow_offload_replace()
339 data.vlan.num++; in mtk_flow_offload_replace()
344 if (data.pppoe.num == 1) in mtk_flow_offload_replace()
345 return -EOPNOTSUPP; in mtk_flow_offload_replace()
347 data.pppoe.sid = act->pppoe.sid; in mtk_flow_offload_replace()
348 data.pppoe.num++; in mtk_flow_offload_replace()
351 return -EOPNOTSUPP; in mtk_flow_offload_replace()
357 return -EINVAL; in mtk_flow_offload_replace()
365 struct flow_match_ports ports; in mtk_flow_offload_replace() local
368 return -EOPNOTSUPP; in mtk_flow_offload_replace()
370 flow_rule_match_ports(rule, &ports); in mtk_flow_offload_replace()
371 data.src_port = ports.key->src; in mtk_flow_offload_replace()
372 data.dst_port = ports.key->dst; in mtk_flow_offload_replace()
374 return -EOPNOTSUPP; in mtk_flow_offload_replace()
382 data.v4.src_addr = addrs.key->src; in mtk_flow_offload_replace()
383 data.v4.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
393 data.v6.src_addr = addrs.key->src; in mtk_flow_offload_replace()
394 data.v6.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
399 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
400 if (act->id != FLOW_ACTION_MANGLE) in mtk_flow_offload_replace()
404 return -EOPNOTSUPP; in mtk_flow_offload_replace()
406 switch (act->mangle.htype) { in mtk_flow_offload_replace()
418 return -EOPNOTSUPP; in mtk_flow_offload_replace()
434 if (data.vlan.num == 1) { in mtk_flow_offload_replace()
436 return -EOPNOTSUPP; in mtk_flow_offload_replace()
440 if (data.pppoe.num == 1) in mtk_flow_offload_replace()
453 return -ENOMEM; in mtk_flow_offload_replace()
455 entry->cookie = f->cookie; in mtk_flow_offload_replace()
456 memcpy(&entry->data, &foe, sizeof(entry->data)); in mtk_flow_offload_replace()
457 entry->wed_index = wed_index; in mtk_flow_offload_replace()
458 entry->ppe_index = ppe_index; in mtk_flow_offload_replace()
460 err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
464 err = rhashtable_insert_fast(ð->flow_table, &entry->node, in mtk_flow_offload_replace()
472 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
485 entry = rhashtable_lookup(ð->flow_table, &f->cookie, in mtk_flow_offload_destroy()
488 return -ENOENT; in mtk_flow_offload_destroy()
490 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_destroy()
491 rhashtable_remove_fast(ð->flow_table, &entry->node, in mtk_flow_offload_destroy()
493 if (entry->wed_index >= 0) in mtk_flow_offload_destroy()
494 mtk_wed_flow_remove(entry->wed_index); in mtk_flow_offload_destroy()
507 entry = rhashtable_lookup(ð->flow_table, &f->cookie, in mtk_flow_offload_stats()
510 return -ENOENT; in mtk_flow_offload_stats()
512 idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_stats()
513 f->stats.lastused = jiffies - idle * HZ; in mtk_flow_offload_stats()
515 if (entry->hash != 0xFFFF && in mtk_flow_offload_stats()
516 mtk_foe_entry_get_mib(eth->ppe[entry->ppe_index], entry->hash, in mtk_flow_offload_stats()
518 f->stats.pkts += diff.packets; in mtk_flow_offload_stats()
519 f->stats.bytes += diff.bytes; in mtk_flow_offload_stats()
533 switch (cls->command) { in mtk_flow_offload_cmd()
544 err = -EOPNOTSUPP; in mtk_flow_offload_cmd()
561 eth = mac->hw; in mtk_eth_setup_tc_block_cb()
564 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
567 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
576 struct mtk_eth *eth = mac->hw; in mtk_eth_setup_tc_block()
581 if (!eth->soc->offload_version) in mtk_eth_setup_tc_block()
582 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
584 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in mtk_eth_setup_tc_block()
585 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
588 f->driver_block_list = &block_cb_list; in mtk_eth_setup_tc_block()
590 switch (f->command) { in mtk_eth_setup_tc_block()
592 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
603 list_add_tail(&block_cb->driver_list, &block_cb_list); in mtk_eth_setup_tc_block()
606 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
608 return -ENOENT; in mtk_eth_setup_tc_block()
612 list_del(&block_cb->driver_list); in mtk_eth_setup_tc_block()
616 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
628 return -EOPNOTSUPP; in mtk_eth_setup_tc()
634 return rhashtable_init(ð->flow_table, &mtk_flow_ht_params); in mtk_eth_offload_init()