Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2020 Marvell International Ltd. 3 : : */ 4 : : 5 : : #include <rte_debug.h> 6 : : #include <rte_ethdev.h> 7 : : #include <rte_graph.h> 8 : : #include <rte_graph_worker.h> 9 : : 10 : : #include "ethdev_tx_priv.h" 11 : : 12 : : static struct ethdev_tx_node_main ethdev_tx_main; 13 : : 14 : : static uint16_t 15 : 0 : ethdev_tx_node_process(struct rte_graph *graph, struct rte_node *node, 16 : : void **objs, uint16_t nb_objs) 17 : : { 18 : : ethdev_tx_node_ctx_t *ctx = (ethdev_tx_node_ctx_t *)node->ctx; 19 : : uint16_t port, queue; 20 : : uint16_t count; 21 : : 22 : : /* Get Tx port id */ 23 : 0 : port = ctx->port; 24 : 0 : queue = ctx->queue; 25 : : 26 : 0 : count = rte_eth_tx_burst(port, queue, (struct rte_mbuf **)objs, 27 : : nb_objs); 28 : : 29 : : /* Redirect unsent pkts to drop node */ 30 [ # # ]: 0 : if (count != nb_objs) { 31 : 0 : rte_node_enqueue(graph, node, ETHDEV_TX_NEXT_PKT_DROP, 32 : 0 : &objs[count], nb_objs - count); 33 : : } 34 : : 35 : 0 : return count; 36 : : } 37 : : 38 : : static int 39 : 0 : ethdev_tx_node_init(const struct rte_graph *graph, struct rte_node *node) 40 : : { 41 : : ethdev_tx_node_ctx_t *ctx = (ethdev_tx_node_ctx_t *)node->ctx; 42 : : uint64_t port_id = RTE_MAX_ETHPORTS; 43 : : int i; 44 : : 45 : : /* Find our port id */ 46 [ # # ]: 0 : for (i = 0; i < RTE_MAX_ETHPORTS; i++) { 47 [ # # ]: 0 : if (ethdev_tx_main.nodes[i] == node->id) { 48 : 0 : port_id = i; 49 : 0 : break; 50 : : } 51 : : } 52 [ # # ]: 0 : RTE_VERIFY(port_id < RTE_MAX_ETHPORTS); 53 : : 54 : : /* Update port and queue */ 55 : 0 : ctx->port = port_id; 56 : 0 : ctx->queue = graph->id; 57 : : 58 : 0 : return 0; 59 : : } 60 : : 61 : : struct ethdev_tx_node_main * 62 : 0 : ethdev_tx_node_data_get(void) 63 : : { 64 : 0 : return ðdev_tx_main; 65 : : } 66 : : 67 : : static struct rte_node_register ethdev_tx_node_base = { 68 : : .process = ethdev_tx_node_process, 69 : : .name = "ethdev_tx", 70 : : 71 : : .init = ethdev_tx_node_init, 72 : : 73 : : .nb_edges = ETHDEV_TX_NEXT_MAX, 74 : : .next_nodes = { 75 : : [ETHDEV_TX_NEXT_PKT_DROP] = "pkt_drop", 76 : : }, 77 : : }; 78 : : 79 : : struct rte_node_register * 80 : 0 : ethdev_tx_node_get(void) 81 : : { 82 : 0 : return ðdev_tx_node_base; 83 : : } 84 : : 85 : 251 : RTE_NODE_REGISTER(ethdev_tx_node_base);