Lines Matching +full:dsa +full:- +full:v4

1 // SPDX-License-Identifier: GPL-2.0-only
12 #include <net/dsa.h>
23 } v4; 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()
114 info->amsdu = path->mtk_wdma.amsdu; in mtk_flow_get_wdma_info()
124 u32 val = ntohl(act->mangle.val); in mtk_flow_mangle_ports()
126 switch (act->mangle.offset) { in mtk_flow_mangle_ports()
128 if (act->mangle.mask == ~htonl(0xffff)) in mtk_flow_mangle_ports()
129 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
131 data->src_port = cpu_to_be16(val >> 16); in mtk_flow_mangle_ports()
134 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
137 return -EINVAL; in mtk_flow_mangle_ports()
149 switch (act->mangle.offset) { in mtk_flow_mangle_ipv4()
151 dest = &data->v4.src_addr; in mtk_flow_mangle_ipv4()
154 dest = &data->v4.dst_addr; in mtk_flow_mangle_ipv4()
157 return -EINVAL; in mtk_flow_mangle_ipv4()
160 memcpy(dest, &act->mangle.val, sizeof(u32)); in mtk_flow_mangle_ipv4()
173 return -ENODEV; in mtk_flow_get_dsa_port()
175 if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK) in mtk_flow_get_dsa_port()
176 return -ENODEV; in mtk_flow_get_dsa_port()
180 return dp->index; in mtk_flow_get_dsa_port()
182 return -ENODEV; in mtk_flow_get_dsa_port()
209 return -EINVAL; in mtk_flow_set_output_device()
220 if (dev == eth->netdev[0]) in mtk_flow_set_output_device()
222 else if (dev == eth->netdev[1]) in mtk_flow_set_output_device()
224 else if (dev == eth->netdev[2]) in mtk_flow_set_output_device()
227 return -EOPNOTSUPP; in mtk_flow_set_output_device()
233 queue = pse_port - 1; in mtk_flow_set_output_device()
254 int wed_index = -1; in mtk_flow_offload_replace()
260 if (rhashtable_lookup(&eth->flow_table, &f->cookie, mtk_flow_ht_params)) in mtk_flow_offload_replace()
261 return -EEXIST; in mtk_flow_offload_replace()
268 idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex); in mtk_flow_offload_replace()
269 if (idev && idev->netdev_ops == eth->netdev[0]->netdev_ops) { in mtk_flow_offload_replace()
272 if (WARN_ON(mac->ppe_idx >= eth->soc->ppe_num)) in mtk_flow_offload_replace()
273 return -EINVAL; in mtk_flow_offload_replace()
275 ppe_index = mac->ppe_idx; in mtk_flow_offload_replace()
279 return -EOPNOTSUPP; in mtk_flow_offload_replace()
286 addr_type = match.key->addr_type; in mtk_flow_offload_replace()
288 if (flow_rule_has_control_flags(match.mask->flags, in mtk_flow_offload_replace()
289 f->common.extack)) in mtk_flow_offload_replace()
290 return -EOPNOTSUPP; in mtk_flow_offload_replace()
292 return -EOPNOTSUPP; in mtk_flow_offload_replace()
299 l4proto = match.key->ip_proto; in mtk_flow_offload_replace()
301 return -EOPNOTSUPP; in mtk_flow_offload_replace()
311 memcpy(data.eth.h_dest, match.key->dst, ETH_ALEN); in mtk_flow_offload_replace()
312 memcpy(data.eth.h_source, match.key->src, ETH_ALEN); in mtk_flow_offload_replace()
314 return -EOPNOTSUPP; in mtk_flow_offload_replace()
322 if (match.key->vlan_tpid != cpu_to_be16(ETH_P_8021Q)) in mtk_flow_offload_replace()
323 return -EOPNOTSUPP; in mtk_flow_offload_replace()
325 data.vlan_in = match.key->vlan_id; in mtk_flow_offload_replace()
335 return -EOPNOTSUPP; in mtk_flow_offload_replace()
338 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
339 switch (act->id) { in mtk_flow_offload_replace()
342 return -EOPNOTSUPP; in mtk_flow_offload_replace()
343 if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) in mtk_flow_offload_replace()
347 odev = act->dev; in mtk_flow_offload_replace()
353 act->vlan.proto != htons(ETH_P_8021Q)) in mtk_flow_offload_replace()
354 return -EOPNOTSUPP; in mtk_flow_offload_replace()
356 data.vlan.id = act->vlan.vid; in mtk_flow_offload_replace()
357 data.vlan.proto = act->vlan.proto; in mtk_flow_offload_replace()
364 return -EOPNOTSUPP; in mtk_flow_offload_replace()
366 data.pppoe.sid = act->pppoe.sid; in mtk_flow_offload_replace()
370 return -EOPNOTSUPP; in mtk_flow_offload_replace()
376 return -EINVAL; in mtk_flow_offload_replace()
387 return -EOPNOTSUPP; in mtk_flow_offload_replace()
390 data.src_port = ports.key->src; in mtk_flow_offload_replace()
391 data.dst_port = ports.key->dst; in mtk_flow_offload_replace()
393 return -EOPNOTSUPP; in mtk_flow_offload_replace()
401 data.v4.src_addr = addrs.key->src; in mtk_flow_offload_replace()
402 data.v4.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
412 data.v6.src_addr = addrs.key->src; in mtk_flow_offload_replace()
413 data.v6.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
418 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
419 if (act->id != FLOW_ACTION_MANGLE) in mtk_flow_offload_replace()
423 return -EOPNOTSUPP; in mtk_flow_offload_replace()
425 switch (act->mangle.htype) { in mtk_flow_offload_replace()
437 return -EOPNOTSUPP; in mtk_flow_offload_replace()
455 return -EOPNOTSUPP; in mtk_flow_offload_replace()
472 return -ENOMEM; in mtk_flow_offload_replace()
474 entry->cookie = f->cookie; in mtk_flow_offload_replace()
475 memcpy(&entry->data, &foe, sizeof(entry->data)); in mtk_flow_offload_replace()
476 entry->wed_index = wed_index; in mtk_flow_offload_replace()
477 entry->ppe_index = ppe_index; in mtk_flow_offload_replace()
479 err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
483 err = rhashtable_insert_fast(&eth->flow_table, &entry->node, in mtk_flow_offload_replace()
491 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
504 entry = rhashtable_lookup(&eth->flow_table, &f->cookie, in mtk_flow_offload_destroy()
507 return -ENOENT; in mtk_flow_offload_destroy()
509 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_destroy()
510 rhashtable_remove_fast(&eth->flow_table, &entry->node, in mtk_flow_offload_destroy()
512 if (entry->wed_index >= 0) in mtk_flow_offload_destroy()
513 mtk_wed_flow_remove(entry->wed_index); in mtk_flow_offload_destroy()
526 entry = rhashtable_lookup(&eth->flow_table, &f->cookie, in mtk_flow_offload_stats()
529 return -ENOENT; in mtk_flow_offload_stats()
531 idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_stats()
532 f->stats.lastused = jiffies - idle * HZ; in mtk_flow_offload_stats()
534 if (entry->hash != 0xFFFF && in mtk_flow_offload_stats()
535 mtk_foe_entry_get_mib(eth->ppe[entry->ppe_index], entry->hash, in mtk_flow_offload_stats()
537 f->stats.pkts += diff.packets; in mtk_flow_offload_stats()
538 f->stats.bytes += diff.bytes; in mtk_flow_offload_stats()
552 switch (cls->command) { in mtk_flow_offload_cmd()
563 err = -EOPNOTSUPP; in mtk_flow_offload_cmd()
580 eth = mac->hw; in mtk_eth_setup_tc_block_cb()
583 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
586 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
595 struct mtk_eth *eth = mac->hw; in mtk_eth_setup_tc_block()
600 if (!eth->soc->offload_version) in mtk_eth_setup_tc_block()
601 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
603 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in mtk_eth_setup_tc_block()
604 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
607 f->driver_block_list = &block_cb_list; in mtk_eth_setup_tc_block()
609 switch (f->command) { in mtk_eth_setup_tc_block()
611 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
622 list_add_tail(&block_cb->driver_list, &block_cb_list); in mtk_eth_setup_tc_block()
625 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
627 return -ENOENT; in mtk_eth_setup_tc_block()
631 list_del(&block_cb->driver_list); in mtk_eth_setup_tc_block()
635 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
647 return -EOPNOTSUPP; in mtk_eth_setup_tc()
653 if (!eth->ppe[id] || !eth->ppe[id]->foe_table) in mtk_eth_offload_init()
655 return rhashtable_init(&eth->flow_table, &mtk_flow_ht_params); in mtk_eth_offload_init()