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

1 // SPDX-License-Identifier: GPL-2.0-only
12 #include <net/dsa.h>
23 } v4; member
61 data->v4.src_addr, data->src_port, in mtk_flow_set_ipv4_addr()
62 data->v4.dst_addr, data->dst_port); in mtk_flow_set_ipv4_addr()
70 data->v6.src_addr.s6_addr32, data->src_port, in mtk_flow_set_ipv6_addr()
71 data->v6.dst_addr.s6_addr32, data->dst_port); in mtk_flow_set_ipv6_addr()
77 void *dest = eth + act->mangle.offset; in mtk_flow_offload_mangle_eth()
78 const void *src = &act->mangle.val; in mtk_flow_offload_mangle_eth()
80 if (act->mangle.offset > 8) in mtk_flow_offload_mangle_eth()
83 if (act->mangle.mask == 0xffff) { in mtk_flow_offload_mangle_eth()
88 memcpy(dest, src, act->mangle.mask ? 2 : 4); in mtk_flow_offload_mangle_eth()
99 return -ENODEV; in mtk_flow_get_wdma_info()
102 return -1; in mtk_flow_get_wdma_info()
110 path = &stack.path[stack.num_paths - 1]; in mtk_flow_get_wdma_info()
111 if (path->type != DEV_PATH_MTK_WDMA) in mtk_flow_get_wdma_info()
112 return -1; in mtk_flow_get_wdma_info()
114 info->wdma_idx = path->mtk_wdma.wdma_idx; in mtk_flow_get_wdma_info()
115 info->queue = path->mtk_wdma.queue; in mtk_flow_get_wdma_info()
116 info->bss = path->mtk_wdma.bss; in mtk_flow_get_wdma_info()
117 info->wcid = path->mtk_wdma.wcid; in mtk_flow_get_wdma_info()
118 info->amsdu = path->mtk_wdma.amsdu; in mtk_flow_get_wdma_info()
128 u32 val = ntohl(act->mangle.val); in mtk_flow_mangle_ports()
130 switch (act->mangle.offset) { in mtk_flow_mangle_ports()
132 if (act->mangle.mask == ~htonl(0xffff)) in mtk_flow_mangle_ports()
133 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
135 data->src_port = cpu_to_be16(val >> 16); in mtk_flow_mangle_ports()
138 data->dst_port = cpu_to_be16(val); in mtk_flow_mangle_ports()
141 return -EINVAL; in mtk_flow_mangle_ports()
153 switch (act->mangle.offset) { in mtk_flow_mangle_ipv4()
155 dest = &data->v4.src_addr; in mtk_flow_mangle_ipv4()
158 dest = &data->v4.dst_addr; in mtk_flow_mangle_ipv4()
161 return -EINVAL; in mtk_flow_mangle_ipv4()
164 memcpy(dest, &act->mangle.val, sizeof(u32)); in mtk_flow_mangle_ipv4()
177 return -ENODEV; in mtk_flow_get_dsa_port()
179 if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK) in mtk_flow_get_dsa_port()
180 return -ENODEV; in mtk_flow_get_dsa_port()
184 return dp->index; in mtk_flow_get_dsa_port()
186 return -ENODEV; in mtk_flow_get_dsa_port()
213 return -EINVAL; in mtk_flow_set_output_device()
224 if (dev == eth->netdev[0]) in mtk_flow_set_output_device()
226 else if (dev == eth->netdev[1]) in mtk_flow_set_output_device()
228 else if (dev == eth->netdev[2]) in mtk_flow_set_output_device()
231 return -EOPNOTSUPP; in mtk_flow_set_output_device()
237 queue = pse_port - 1; in mtk_flow_set_output_device()
258 int wed_index = -1; in mtk_flow_offload_replace()
264 if (rhashtable_lookup(&eth->flow_table, &f->cookie, mtk_flow_ht_params)) in mtk_flow_offload_replace()
265 return -EEXIST; in mtk_flow_offload_replace()
272 idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex); in mtk_flow_offload_replace()
273 if (idev && idev->netdev_ops == eth->netdev[0]->netdev_ops) { in mtk_flow_offload_replace()
276 if (WARN_ON(mac->ppe_idx >= eth->soc->ppe_num)) in mtk_flow_offload_replace()
277 return -EINVAL; in mtk_flow_offload_replace()
279 ppe_index = mac->ppe_idx; in mtk_flow_offload_replace()
283 return -EOPNOTSUPP; in mtk_flow_offload_replace()
290 addr_type = match.key->addr_type; in mtk_flow_offload_replace()
292 if (flow_rule_has_control_flags(match.mask->flags, in mtk_flow_offload_replace()
293 f->common.extack)) in mtk_flow_offload_replace()
294 return -EOPNOTSUPP; in mtk_flow_offload_replace()
296 return -EOPNOTSUPP; in mtk_flow_offload_replace()
303 l4proto = match.key->ip_proto; in mtk_flow_offload_replace()
305 return -EOPNOTSUPP; in mtk_flow_offload_replace()
315 memcpy(data.eth.h_dest, match.key->dst, ETH_ALEN); in mtk_flow_offload_replace()
316 memcpy(data.eth.h_source, match.key->src, ETH_ALEN); in mtk_flow_offload_replace()
318 return -EOPNOTSUPP; in mtk_flow_offload_replace()
326 if (match.key->vlan_tpid != cpu_to_be16(ETH_P_8021Q)) in mtk_flow_offload_replace()
327 return -EOPNOTSUPP; in mtk_flow_offload_replace()
329 data.vlan_in = match.key->vlan_id; in mtk_flow_offload_replace()
339 return -EOPNOTSUPP; in mtk_flow_offload_replace()
342 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
343 switch (act->id) { in mtk_flow_offload_replace()
346 return -EOPNOTSUPP; in mtk_flow_offload_replace()
347 if (act->mangle.htype == FLOW_ACT_MANGLE_HDR_TYPE_ETH) in mtk_flow_offload_replace()
351 odev = act->dev; in mtk_flow_offload_replace()
357 act->vlan.proto != htons(ETH_P_8021Q)) in mtk_flow_offload_replace()
358 return -EOPNOTSUPP; in mtk_flow_offload_replace()
360 data.vlan.vlans[data.vlan.num].id = act->vlan.vid; in mtk_flow_offload_replace()
361 data.vlan.vlans[data.vlan.num].proto = act->vlan.proto; in mtk_flow_offload_replace()
369 return -EOPNOTSUPP; in mtk_flow_offload_replace()
371 data.pppoe.sid = act->pppoe.sid; in mtk_flow_offload_replace()
375 return -EOPNOTSUPP; in mtk_flow_offload_replace()
381 return -EINVAL; in mtk_flow_offload_replace()
392 return -EOPNOTSUPP; in mtk_flow_offload_replace()
395 data.src_port = ports.key->src; in mtk_flow_offload_replace()
396 data.dst_port = ports.key->dst; in mtk_flow_offload_replace()
398 return -EOPNOTSUPP; in mtk_flow_offload_replace()
406 data.v4.src_addr = addrs.key->src; in mtk_flow_offload_replace()
407 data.v4.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
417 data.v6.src_addr = addrs.key->src; in mtk_flow_offload_replace()
418 data.v6.dst_addr = addrs.key->dst; in mtk_flow_offload_replace()
423 flow_action_for_each(i, act, &rule->action) { in mtk_flow_offload_replace()
424 if (act->id != FLOW_ACTION_MANGLE) in mtk_flow_offload_replace()
428 return -EOPNOTSUPP; in mtk_flow_offload_replace()
430 switch (act->mangle.htype) { in mtk_flow_offload_replace()
442 return -EOPNOTSUPP; in mtk_flow_offload_replace()
474 return -ENOMEM; in mtk_flow_offload_replace()
476 entry->cookie = f->cookie; in mtk_flow_offload_replace()
477 memcpy(&entry->data, &foe, sizeof(entry->data)); in mtk_flow_offload_replace()
478 entry->wed_index = wed_index; in mtk_flow_offload_replace()
479 entry->ppe_index = ppe_index; in mtk_flow_offload_replace()
481 err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
485 err = rhashtable_insert_fast(&eth->flow_table, &entry->node, in mtk_flow_offload_replace()
493 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_replace()
506 entry = rhashtable_lookup(&eth->flow_table, &f->cookie, in mtk_flow_offload_destroy()
509 return -ENOENT; in mtk_flow_offload_destroy()
511 mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_destroy()
512 rhashtable_remove_fast(&eth->flow_table, &entry->node, in mtk_flow_offload_destroy()
514 if (entry->wed_index >= 0) in mtk_flow_offload_destroy()
515 mtk_wed_flow_remove(entry->wed_index); in mtk_flow_offload_destroy()
528 entry = rhashtable_lookup(&eth->flow_table, &f->cookie, in mtk_flow_offload_stats()
531 return -ENOENT; in mtk_flow_offload_stats()
533 idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry); in mtk_flow_offload_stats()
534 f->stats.lastused = jiffies - idle * HZ; in mtk_flow_offload_stats()
536 if (entry->hash != 0xFFFF && in mtk_flow_offload_stats()
537 mtk_foe_entry_get_mib(eth->ppe[entry->ppe_index], entry->hash, in mtk_flow_offload_stats()
539 f->stats.pkts += diff.packets; in mtk_flow_offload_stats()
540 f->stats.bytes += diff.bytes; in mtk_flow_offload_stats()
554 switch (cls->command) { in mtk_flow_offload_cmd()
565 err = -EOPNOTSUPP; in mtk_flow_offload_cmd()
582 eth = mac->hw; in mtk_eth_setup_tc_block_cb()
585 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
588 return -EOPNOTSUPP; in mtk_eth_setup_tc_block_cb()
597 struct mtk_eth *eth = mac->hw; in mtk_eth_setup_tc_block()
602 if (!eth->soc->offload_version) in mtk_eth_setup_tc_block()
603 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
605 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) in mtk_eth_setup_tc_block()
606 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
609 f->driver_block_list = &block_cb_list; in mtk_eth_setup_tc_block()
611 switch (f->command) { in mtk_eth_setup_tc_block()
613 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
624 list_add_tail(&block_cb->driver_list, &block_cb_list); in mtk_eth_setup_tc_block()
627 block_cb = flow_block_cb_lookup(f->block, cb, dev); in mtk_eth_setup_tc_block()
629 return -ENOENT; in mtk_eth_setup_tc_block()
633 list_del(&block_cb->driver_list); in mtk_eth_setup_tc_block()
637 return -EOPNOTSUPP; in mtk_eth_setup_tc_block()
649 return -EOPNOTSUPP; in mtk_eth_setup_tc()
655 if (!eth->ppe[id] || !eth->ppe[id]->foe_table) in mtk_eth_offload_init()
657 return rhashtable_init(&eth->flow_table, &mtk_flow_ht_params); in mtk_eth_offload_init()