From patchwork Tue Dec 5 07:46:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rakesh Kudurumalla X-Patchwork-Id: 134861 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 81B4743672; Tue, 5 Dec 2023 08:46:55 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5384542D9A; Tue, 5 Dec 2023 08:46:55 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 8606142D7D for ; Tue, 5 Dec 2023 08:46:53 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 3B56Oi2h010811 for ; Mon, 4 Dec 2023 23:46:52 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=EBYpm2hdNa21ttnOx9L/hyZXXxIg1OxYEXUV9yOw6AM=; b=CXIsFRkRMU/escM/4LBZHig5QlF+OrvKakYW+wGfrnnYJ79i0pl012dGL7CI+bVaf8ks ieYBJJXWEC2Py7mEHxTPryQCEcFrQyRtATHuj9OWAX7YfukxzpD/I1b6USERw2KzTOIa BkY5Empna3EMarZJ64q2NaphnEP5LBV7MS/jLtgWYNPGiE1RU19I/BGRcXWJ+pUyC0df mthn8+rz02Hm794aynCfAf6lMzPSNTZvGinS/CCcmBslEDkwJAC/oHgzB2OJxEHQLq2D w9hjfOwvy3en37E+5iB9J4XHLuzp7IWYe6uzn7hOCoy656q25kgBv2eriLnPBVFzHpas 4A== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3ur4yrrngs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Mon, 04 Dec 2023 23:46:52 -0800 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Mon, 4 Dec 2023 23:46:49 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Mon, 4 Dec 2023 23:46:49 -0800 Received: from localhost.localdomain (unknown [10.28.36.154]) by maili.marvell.com (Postfix) with ESMTP id 181763F70A5; Mon, 4 Dec 2023 23:46:47 -0800 (PST) From: Rakesh Kudurumalla To: Nithin Dabilpuram , Pavan Nikhilesh CC: , , Rakesh Kudurumalla Subject: [PATCH v3 1/3] node: support to add next node to ethdev Rx node Date: Tue, 5 Dec 2023 13:16:43 +0530 Message-ID: <20231205074645.1370608-1-rkudurumalla@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231204180415.1212837-1-rkudurumalla@marvell.com> References: <20231204180415.1212837-1-rkudurumalla@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: uRk93iZYXBJCabgaUT1Cs7QcXdhkdPu3 X-Proofpoint-ORIG-GUID: uRk93iZYXBJCabgaUT1Cs7QcXdhkdPu3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.997,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-12-05_03,2023-12-04_01,2023-05-22_02 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org By default all packets received on ethdev_rx node is forwarded to pkt_cls node.This patch provides library support to add a new node as next node to ethdev_rx node and forward packet to new node from rx node. Signed-off-by: Rakesh Kudurumalla --- V3: Resolve compilation Issue lib/node/ethdev_ctrl.c | 45 +++++++++++++++++++++++++++++++++++++ lib/node/rte_node_eth_api.h | 19 ++++++++++++++++ lib/node/version.map | 1 + 3 files changed, 65 insertions(+) diff --git a/lib/node/ethdev_ctrl.c b/lib/node/ethdev_ctrl.c index d564b80e37..4580c123d1 100644 --- a/lib/node/ethdev_ctrl.c +++ b/lib/node/ethdev_ctrl.c @@ -3,6 +3,7 @@ */ #include +#include #include #include @@ -129,3 +130,47 @@ rte_node_eth_config(struct rte_node_ethdev_config *conf, uint16_t nb_confs, ctrl.nb_graphs = nb_graphs; return 0; } + +int +rte_node_ethdev_rx_next_update(rte_node_t id, const char *edge_name) +{ + struct ethdev_rx_node_main *data; + ethdev_rx_node_elem_t *elem; + char **next_nodes; + int rc = -EINVAL; + uint32_t count; + uint16_t i = 0; + + if (edge_name == NULL) + return -ENODATA; + + count = rte_node_edge_get(id, NULL); + + if (count == RTE_NODE_ID_INVALID) + return rc; + + next_nodes = malloc(count); + if (next_nodes == NULL) + return -ENOMEM; + + count = rte_node_edge_get(id, next_nodes); + + while (next_nodes[i] != NULL) { + if (strcmp(edge_name, next_nodes[i]) == 0) { + data = ethdev_rx_get_node_data_get(); + elem = data->head; + while (elem->next != data->head) { + if (elem->nid == id) { + elem->ctx.cls_next = i; + rc = 0; + goto exit; + } + elem = elem->next; + } + } + i++; + } +exit: + free(next_nodes); + return rc; +} diff --git a/lib/node/rte_node_eth_api.h b/lib/node/rte_node_eth_api.h index eaae50772d..f99e565b30 100644 --- a/lib/node/rte_node_eth_api.h +++ b/lib/node/rte_node_eth_api.h @@ -57,6 +57,25 @@ struct rte_node_ethdev_config { */ int rte_node_eth_config(struct rte_node_ethdev_config *cfg, uint16_t cnt, uint16_t nb_graphs); + +/** + * Update ethdev rx next node. + * + * @param id + * Node id whose edge is to be updated. + * @param edge_name + * Name of the next node. + * + * @return + * RTE_EDGE_ID_INVALID if id is invalid + * ENINVAL: Either of input parameters are invalid + * ENODATA: If edge_name is not found + * ENOMEM: If memory allocation failed + * 0 on successful initialization. + */ +__rte_experimental +int rte_node_ethdev_rx_next_update(rte_node_t id, const char *edge_name); + #ifdef __cplusplus } #endif diff --git a/lib/node/version.map b/lib/node/version.map index 99ffcdd414..07abc3a79f 100644 --- a/lib/node/version.map +++ b/lib/node/version.map @@ -16,6 +16,7 @@ EXPERIMENTAL { rte_node_ip6_route_add; # added in 23.11 + rte_node_ethdev_rx_next_update; rte_node_ip4_reassembly_configure; rte_node_udp4_dst_port_add; rte_node_udp4_usr_node_add; From patchwork Tue Dec 5 07:46:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rakesh Kudurumalla X-Patchwork-Id: 134862 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 68B3743672; Tue, 5 Dec 2023 08:47:01 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 64E0142DD4; Tue, 5 Dec 2023 08:46:57 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 63CF942DBD for ; Tue, 5 Dec 2023 08:46:55 +0100 (CET) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 3B4NxDlv021864 for ; Mon, 4 Dec 2023 23:46:54 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=CZHM07lCXioNMJolAh1SarWf9ZXUX4JkEEUkozhBELM=; b=gFscGObC/17T2vgQEYM5Dn4rJ0np9LuyZ4e9siImQSKmk/KUOiJy/ghgN4NBcJ6U533U 90KSJ3hPH26FzfXA/fJwNYzorZBPslOQ2kckrei/Z4U3dfkAbopDttc/xCwQgfCtBAA6 /WDmA1ceil1tSYfqUOYlZrEk34E9iIIqbRDtYSUc4DNC+6CIe8JG5gSVFPW0YCDPc/gs AeVDyRMo/N5TqoJWBQt5ziB4vhJ9aY6Zz4HQCEf10CWQVVPoEHhj0Jv9N6bzorN9RTlY KBbx2FeIGuw26DJ0dLAkB9e7+0xRzABLWnofqOBq01XY++TknSVbSSuFJsXBGD7NaAP2 4g== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3usrx3h65u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Mon, 04 Dec 2023 23:46:54 -0800 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Mon, 4 Dec 2023 23:46:52 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Mon, 4 Dec 2023 23:46:52 -0800 Received: from localhost.localdomain (unknown [10.28.36.154]) by maili.marvell.com (Postfix) with ESMTP id 084F03F70A5; Mon, 4 Dec 2023 23:46:50 -0800 (PST) From: Rakesh Kudurumalla To: Sunil Kumar Kori , Rakesh Kudurumalla CC: , , Subject: [PATCH v3 2/3] app/graph: add ethdev forward command Date: Tue, 5 Dec 2023 13:16:44 +0530 Message-ID: <20231205074645.1370608-2-rkudurumalla@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231205074645.1370608-1-rkudurumalla@marvell.com> References: <20231204180415.1212837-1-rkudurumalla@marvell.com> <20231205074645.1370608-1-rkudurumalla@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: 2T8SBnK_8q_K_bIiZzeH42LJtpzU8ZBM X-Proofpoint-ORIG-GUID: 2T8SBnK_8q_K_bIiZzeH42LJtpzU8ZBM X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.997,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-12-05_03,2023-12-04_01,2023-05-22_02 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Adds a txport to forward packet for every rxport Mapping will be used to forward packets to txport received on rxport Following commands are exposed: - ethdev forward " Signed-off-by: Rakesh Kudurumalla --- app/graph/cli.c | 1 + app/graph/ethdev.c | 62 +++++++++++++++++++++++++++++++++++++++++ app/graph/ethdev.h | 1 + app/graph/ethdev_priv.h | 8 ++++++ 4 files changed, 72 insertions(+) diff --git a/app/graph/cli.c b/app/graph/cli.c index 30b12312d6..76f5b8e670 100644 --- a/app/graph/cli.c +++ b/app/graph/cli.c @@ -32,6 +32,7 @@ cmdline_parse_ctx_t modules_ctx[] = { (cmdline_parse_inst_t *)ðdev_prom_mode_cmd_ctx, (cmdline_parse_inst_t *)ðdev_ip4_cmd_ctx, (cmdline_parse_inst_t *)ðdev_ip6_cmd_ctx, + (cmdline_parse_inst_t *)ðdev_forward_cmd_ctx, (cmdline_parse_inst_t *)ðdev_cmd_ctx, (cmdline_parse_inst_t *)ðdev_help_cmd_ctx, (cmdline_parse_inst_t *)ðdev_rx_cmd_ctx, diff --git a/app/graph/ethdev.c b/app/graph/ethdev.c index c9b09168c1..bceee659a2 100644 --- a/app/graph/ethdev.c +++ b/app/graph/ethdev.c @@ -38,6 +38,10 @@ cmd_ethdev_ip4_addr_help[] = "ethdev ip4 addr add netmask config.tx_port_id = portid_tx; + rc = 0; + } + + return rc; +} + +static void +cli_ethdev_forward(void *parsed_result, __rte_unused struct cmdline *cl, void *data __rte_unused) +{ + struct ethdev_fwd_cmd_tokens *res = parsed_result; + int rc = -EINVAL; + + rc = ethdev_forward_config(res->tx_dev, res->rx_dev); + if (rc < 0) + printf(MSG_CMD_FAIL, res->cmd); +} + +cmdline_parse_token_string_t ethdev_l2_cmd = + TOKEN_STRING_INITIALIZER(struct ethdev_fwd_cmd_tokens, cmd, "ethdev"); +cmdline_parse_token_string_t ethdev_fwd_cmd = + TOKEN_STRING_INITIALIZER(struct ethdev_fwd_cmd_tokens, fwd, "forward"); +cmdline_parse_token_string_t ethdev_tx_device = + TOKEN_STRING_INITIALIZER(struct ethdev_fwd_cmd_tokens, tx_dev, NULL); +cmdline_parse_token_string_t ethdev_rx_device = + TOKEN_STRING_INITIALIZER(struct ethdev_fwd_cmd_tokens, rx_dev, NULL); + +cmdline_parse_inst_t ethdev_forward_cmd_ctx = { + .f = cli_ethdev_forward, + .data = NULL, + .help_str = cmd_ethdev_forward_help, + .tokens = { + (void *)ðdev_l2_cmd, + (void *)ðdev_fwd_cmd, + (void *)ðdev_tx_device, + (void *)ðdev_rx_device, + NULL, + }, +}; diff --git a/app/graph/ethdev.h b/app/graph/ethdev.h index 94d3247a2c..836052046b 100644 --- a/app/graph/ethdev.h +++ b/app/graph/ethdev.h @@ -15,6 +15,7 @@ extern cmdline_parse_inst_t ethdev_mtu_cmd_ctx; extern cmdline_parse_inst_t ethdev_prom_mode_cmd_ctx; extern cmdline_parse_inst_t ethdev_ip4_cmd_ctx; extern cmdline_parse_inst_t ethdev_ip6_cmd_ctx; +extern cmdline_parse_inst_t ethdev_forward_cmd_ctx; extern cmdline_parse_inst_t ethdev_cmd_ctx; extern cmdline_parse_inst_t ethdev_help_cmd_ctx; diff --git a/app/graph/ethdev_priv.h b/app/graph/ethdev_priv.h index f231f3f3e1..e5e5fbc9ae 100644 --- a/app/graph/ethdev_priv.h +++ b/app/graph/ethdev_priv.h @@ -61,6 +61,13 @@ struct ethdev_ip6_cmd_tokens { cmdline_fixed_string_t mask; }; +struct ethdev_fwd_cmd_tokens { + cmdline_fixed_string_t cmd; + cmdline_fixed_string_t fwd; + cmdline_fixed_string_t tx_dev; + cmdline_fixed_string_t rx_dev; +}; + struct ethdev_cmd_tokens { cmdline_fixed_string_t cmd; cmdline_fixed_string_t dev; @@ -98,6 +105,7 @@ struct ethdev_config { uint32_t queue_size; } tx; + uint16_t tx_port_id; int promiscuous; uint32_t mtu; }; From patchwork Tue Dec 5 07:46:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rakesh Kudurumalla X-Patchwork-Id: 134863 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2D85143672; Tue, 5 Dec 2023 08:47:08 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 786A142DE2; Tue, 5 Dec 2023 08:47:01 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 1271F42DE2 for ; Tue, 5 Dec 2023 08:46:58 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 3B56Oi2i010811 for ; Mon, 4 Dec 2023 23:46:58 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=8r/8GlKCKC6l5rj6C3F69nW6gbYn0y4pVoDB9lqvf3A=; b=Y0ActgycfO9mh2uqZttLiu9hS+1+6fBTECZRxbB/HcO4MIRuFVtlfHo1xKHfcxXjwxMh wIjBWRdTm5zGhJ5Yr5R/ttZqSA0uoDyfJ6lA0mcjw2owjA+YHgT0/hyeMbK+Zs7hz47A hbbvKVkoKqh37TN39dn0SDZbiAv24S17neYBqRPk0NewSLzcUXp/kG4JlWkNcYQmijuE 0fB9fOz1n3o/B0WwqoUA6Lih297TnJKs60W6tSh6axpD4lIhudFrwnJAdzP30+Kq2Jdi M0hs6w0KJ96XIfaLM6OKU6KwwT+h3iG99gU2txszNGCZZFO4SEo1gEYqWI5DERDmWELQ 5Q== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3ur4yrrngv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Mon, 04 Dec 2023 23:46:58 -0800 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Mon, 4 Dec 2023 23:46:55 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Mon, 4 Dec 2023 23:46:56 -0800 Received: from localhost.localdomain (unknown [10.28.36.154]) by maili.marvell.com (Postfix) with ESMTP id 1A02A3F70A5; Mon, 4 Dec 2023 23:46:53 -0800 (PST) From: Rakesh Kudurumalla To: Sunil Kumar Kori , Rakesh Kudurumalla CC: , , Subject: [PATCH v3 3/3] app/graph: implement port forward usecase Date: Tue, 5 Dec 2023 13:16:45 +0530 Message-ID: <20231205074645.1370608-3-rkudurumalla@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231205074645.1370608-1-rkudurumalla@marvell.com> References: <20231204180415.1212837-1-rkudurumalla@marvell.com> <20231205074645.1370608-1-rkudurumalla@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: VaEELnP3qFwHwDy5d8HyqF2qVlL_vcpJ X-Proofpoint-ORIG-GUID: VaEELnP3qFwHwDy5d8HyqF2qVlL_vcpJ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.997,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-12-05_03,2023-12-04_01,2023-05-22_02 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Added portforward usecase.In this usecase packets received Rx port is forwarded to respective Tx port. Signed-off-by: Rakesh Kudurumalla --- app/graph/ethdev.c | 12 ++ app/graph/ethdev.h | 1 + app/graph/examples/l2fwd.cli | 41 +++++ app/graph/examples/l2fwd_pcap.cli | 37 +++++ app/graph/graph.c | 8 +- app/graph/l2fwd.c | 148 +++++++++++++++++++ app/graph/l2fwd.h | 11 ++ app/graph/meson.build | 1 + app/graph/module_api.h | 1 + doc/guides/tools/graph.rst | 27 ++++ doc/guides/tools/img/graph-usecase-l2fwd.svg | 84 +++++++++++ 11 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 app/graph/examples/l2fwd.cli create mode 100644 app/graph/examples/l2fwd_pcap.cli create mode 100644 app/graph/l2fwd.c create mode 100644 app/graph/l2fwd.h create mode 100644 doc/guides/tools/img/graph-usecase-l2fwd.svg diff --git a/app/graph/ethdev.c b/app/graph/ethdev.c index bceee659a2..d048a65555 100644 --- a/app/graph/ethdev.c +++ b/app/graph/ethdev.c @@ -77,6 +77,18 @@ ethdev_port_by_id(uint16_t port_id) return NULL; } +int16_t +find_txport_by_rxport(uint16_t portid_rx) +{ + int portid = -EINVAL; + struct ethdev *port; + port = ethdev_port_by_id(portid_rx); + if (port) + portid = port->config.tx_port_id; + + return portid; +} + void * ethdev_mempool_list_by_portid(uint16_t portid) { diff --git a/app/graph/ethdev.h b/app/graph/ethdev.h index 836052046b..946e14d801 100644 --- a/app/graph/ethdev.h +++ b/app/graph/ethdev.h @@ -33,6 +33,7 @@ extern uint32_t enabled_port_mask; void ethdev_start(void); void ethdev_stop(void); +int16_t find_txport_by_rxport(uint16_t portid_rx); void *ethdev_mempool_list_by_portid(uint16_t portid); int16_t ethdev_portid_by_ip4(uint32_t ip, uint32_t mask); int16_t ethdev_portid_by_ip6(uint8_t *ip, uint8_t *mask); diff --git a/app/graph/examples/l2fwd.cli b/app/graph/examples/l2fwd.cli new file mode 100644 index 0000000000..af24a5836a --- /dev/null +++ b/app/graph/examples/l2fwd.cli @@ -0,0 +1,41 @@ +; SPDX-License-Identifier: BSD-3-Clause +; Copyright(c) 2023 Marvell. + +; +; Graph configuration for given usecase +; +graph l2fwd coremask 0xff bsz 32 tmo 10 model default pcap_enable 1 num_pcap_pkts 100000 pcap_file /tmp/output.pcap + +; +; Mempools to be attached with ethdev +; +mempool mempool0 size 8192 buffers 4000 cache 256 numa 0 + +; +; DPDK devices and configuration. +; +; Note: Customize the parameters below to match your setup. +; +ethdev 0002:01:00.1 rxq 1 txq 8 mempool0 +ethdev 0002:01:00.4 rxq 1 txq 8 mempool0 +ethdev 0002:01:00.6 rxq 1 txq 8 mempool0 +ethdev 0002:02:00.0 rxq 1 txq 8 mempool0 + +; +; L2 mac forwarding rules +; +ethdev forward 0002:01:00.4 0002:02:00.0 +ethdev forward 0002:01:00.1 0002:01:00.6 + +; +; Port-Queue-Core mapping for ethdev_rx node +; +ethdev_rx map port 0002:02:00.0 queue 0 core 1 +ethdev_rx map port 0002:01:00.6 queue 0 core 2 + +; +; Graph start command to create graph. +; +; Note: No more command should come after this. +; +graph start diff --git a/app/graph/examples/l2fwd_pcap.cli b/app/graph/examples/l2fwd_pcap.cli new file mode 100644 index 0000000000..718347f568 --- /dev/null +++ b/app/graph/examples/l2fwd_pcap.cli @@ -0,0 +1,37 @@ +; SPDX-License-Identifier: BSD-3-Clause +; Copyright(c) 2023 Marvell. + +; +; Graph configuration for given usecase +; +graph l2fwd coremask 0xff bsz 32 tmo 10 model default pcap_enable 1 num_pcap_pkts 100000 pcap_file /tmp/output.pcap + +; +; Mempools to be attached with ethdev +; +mempool mempool0 size 8192 buffers 4000 cache 256 numa 0 + +; +; DPDK devices and configuration. +; +; Note: Customize the parameters below to match your setup. +; +ethdev net_pcap0 rxq 1 txq 8 mempool0 +ethdev net_pcap1 rxq 1 txq 8 mempool0 + +; +; L2 mac forwarding rules +; +ethdev forward net_pcap1 net_pcap0 + +; +; Port-Queue-Core mapping for ethdev_rx node +; +ethdev_rx map port net_pcap0 queue 0 core 1 + +; +; Graph start command to create graph. +; +; Note: No more command should come after this. +; +graph start diff --git a/app/graph/graph.c b/app/graph/graph.c index a65723a196..4e0441f1a7 100644 --- a/app/graph/graph.c +++ b/app/graph/graph.c @@ -24,7 +24,7 @@ cmd_graph_help[] = "graph bsz tmo coremask " "model pcap_enable <0 | 1> num_pcap_pkts " "pcap_file "; -static const char * const supported_usecases[] = {"l3fwd"}; +static const char * const supported_usecases[] = {"l3fwd", "l2fwd"}; struct graph_config graph_config; bool graph_started; @@ -273,6 +273,12 @@ cli_graph_start(__rte_unused void *parsed_result, __rte_unused struct cmdline *c break; } } + if (!strcmp(graph_config.usecases[i].name, "l2fwd")) { + if (graph_config.usecases[i].enabled) { + rc = usecase_l2fwd_configure(conf, nb_conf, nb_graphs); + break; + } + } } if (!rc) diff --git a/app/graph/l2fwd.c b/app/graph/l2fwd.c new file mode 100644 index 0000000000..a780caa394 --- /dev/null +++ b/app/graph/l2fwd.c @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Marvell. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "module_api.h" + +static int +l2fwd_pattern_configure(void) +{ + struct rte_graph_param graph_conf; + const char **node_patterns; + uint64_t pcap_pkts_count; + struct lcore_conf *qconf; + uint16_t nb_patterns; + uint8_t pcap_ena; + char *pcap_file; + int lcore_id; + + nb_patterns = 0; + node_patterns = malloc((ETHDEV_RX_QUEUE_PER_LCORE_MAX + nb_patterns) * + sizeof(*node_patterns)); + if (!node_patterns) + return -ENOMEM; + + memset(&graph_conf, 0, sizeof(graph_conf)); + graph_conf.node_patterns = node_patterns; + + /* Pcap config */ + graph_pcap_config_get(&pcap_ena, &pcap_pkts_count, &pcap_file); + graph_conf.pcap_enable = pcap_ena; + graph_conf.num_pkt_to_capture = pcap_pkts_count; + graph_conf.pcap_filename = strdup(pcap_file); + + for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { + rte_graph_t graph_id; + rte_edge_t i; + + if (rte_lcore_is_enabled(lcore_id) == 0) + continue; + + qconf = &lcore_conf[lcore_id]; + + /* Skip graph creation if no source exists */ + if (!qconf->n_rx_queue) + continue; + + /* Add rx node patterns of this lcore */ + for (i = 0; i < qconf->n_rx_queue; i++) { + graph_conf.node_patterns[nb_patterns + i] = + qconf->rx_queue_list[i].node_name; + } + + graph_conf.nb_node_patterns = nb_patterns + i; + graph_conf.socket_id = rte_lcore_to_socket_id(lcore_id); + + snprintf(qconf->name, sizeof(qconf->name), "worker_%u", + lcore_id); + + graph_id = rte_graph_create(qconf->name, &graph_conf); + if (graph_id == RTE_GRAPH_ID_INVALID) + rte_exit(EXIT_FAILURE, + "rte_graph_create(): graph_id invalid" + " for lcore %u\n", lcore_id); + + qconf->graph_id = graph_id; + qconf->graph = rte_graph_lookup(qconf->name); + /* >8 End of graph initialization. */ + if (!qconf->graph) + rte_exit(EXIT_FAILURE, + "rte_graph_lookup(): graph %s not found\n", + qconf->name); + } + + /* Launch per-lcore init on every worker lcore */ + rte_eal_mp_remote_launch(graph_walk_start, NULL, SKIP_MAIN); + + /* Accumulate and print stats on main until exit */ + if (rte_graph_has_stats_feature() && app_graph_stats_enabled()) + graph_stats_print(); + + return 0; +} + +static int +ethdev_rx_to_tx_node_link(uint32_t lcore_id) +{ + char name[RTE_NODE_NAMESIZE]; + const char *next_node = name; + struct lcore_conf *qconf; + uint16_t queue, port_id; + rte_node_t rx_id; + int16_t txport; + int rc; + + qconf = &lcore_conf[lcore_id]; + + for (queue = 0; queue < qconf->n_rx_queue; ++queue) { + port_id = qconf->rx_queue_list[queue].port_id; + txport = find_txport_by_rxport(port_id); + if (txport) { + rx_id = rte_node_from_name(qconf->rx_queue_list[queue].node_name); + snprintf(name, sizeof(name), "ethdev_tx-%u", txport); + rte_node_edge_update(rx_id, RTE_EDGE_ID_INVALID, &next_node, 1); + rc = rte_node_ethdev_rx_next_update(rx_id, name); + if (rc) + return rc; + } + } + return 0; +} + + +int +usecase_l2fwd_configure(struct rte_node_ethdev_config *conf, uint16_t nb_confs, uint16_t nb_graphs) +{ + uint32_t lcore_id; + int rc; + + rc = rte_node_eth_config(conf, nb_confs, nb_graphs); + if (rc) + rte_exit(EXIT_FAILURE, "rte_node_eth_config: err=%d\n", rc); + + for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { + rc = ethdev_rx_to_tx_node_link(lcore_id); + if (rc) + rte_exit(EXIT_FAILURE, "rte_node_eth_config: err=%d\n", rc); + } + + rc = l2fwd_pattern_configure(); + if (rc) + rte_exit(EXIT_FAILURE, "l2fwd_pattern_failure: err=%d\n", rc); + + return rc; +} diff --git a/app/graph/l2fwd.h b/app/graph/l2fwd.h new file mode 100644 index 0000000000..3486ce52b2 --- /dev/null +++ b/app/graph/l2fwd.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Marvell. + */ + +#ifndef APP_GRAPH_L2FWD_H +#define APP_GRAPH_L2FWD_H + +int usecase_l2fwd_configure(struct rte_node_ethdev_config *conf, uint16_t nb_conf, + uint16_t nb_graphs); + +#endif diff --git a/app/graph/meson.build b/app/graph/meson.build index 5b0f966d99..edd6b17ebc 100644 --- a/app/graph/meson.build +++ b/app/graph/meson.build @@ -17,6 +17,7 @@ sources = files( 'graph.c', 'ip4_route.c', 'ip6_route.c', + 'l2fwd.c', 'l3fwd.c', 'main.c', 'mempool.c', diff --git a/app/graph/module_api.h b/app/graph/module_api.h index 7193e0b616..c80eeb704c 100644 --- a/app/graph/module_api.h +++ b/app/graph/module_api.h @@ -13,6 +13,7 @@ #include "ethdev.h" #include "ethdev_rx.h" #include "graph.h" +#include "l2fwd.h" #include "l3fwd.h" #include "mempool.h" #include "neigh.h" diff --git a/doc/guides/tools/graph.rst b/doc/guides/tools/graph.rst index 1855d12891..33b5e750b2 100644 --- a/doc/guides/tools/graph.rst +++ b/doc/guides/tools/graph.rst @@ -77,6 +77,13 @@ This use case is supported for both H/W and PCAP vdev network devices. To demonstrate, corresponding ``.cli`` files are available at ``app/graph/examples/`` named as ``l3fwd.cli`` and ``l3fwd_pcap.cli`` respectively. +l2fwd +~~~~~ + +This use case is supported for both H/W and PCAP vdev network devices. +To demonstrate, corresponding ``.cli`` files are available at ``app/graph/examples/`` +named as ``l2fwd.cli`` and ``l2fwd_pcap.cli`` respectively. + Example Commands ^^^^^^^^^^^^^^^^ For H/W devices @@ -86,6 +93,9 @@ For H/W devices ./dpdk-graph -c 0xff -a 0002:02:00.0 -a 0002:03:00.0 -- -s /app/graph/examples/l3fwd.cli + ./dpdk-graph -c 0xff -a 0002:02:00.0 -a 0002:03:00.0 -- + -s /app/graph/examples/l2fwd.cli + For net_pcapX devices .. code-block:: console @@ -94,6 +104,10 @@ For net_pcapX devices --vdev=net_pcap1,rx_pcap=in_net_pcap1.pcap,tx_pcap=out_net_pcap0.pcap -- -s /app/graph/examples/l3fwd_pcap.cli + ./dpdk-graph -c 0xff --vdev=net_pcap0,rx_pcap=in_net_pcap0.pcap,tx_pcap=out_net_pcap1.pcap + --vdev=net_pcap1,rx_pcap=in_net_pcap1.pcap,tx_pcap=out_net_pcap0.pcap + -- -s /app/graph/examples/l2fwd_pcap.cli + Verifying traffic ^^^^^^^^^^^^^^^^^ @@ -110,6 +124,12 @@ For current use case, following routing table is used: On the successful execution of ``l3fwd.cli`` or ``l3fwd_pcap.cli``, user needs to send traffic with mentioned DIP. +``l2fwd.cli`` and ``l2fwd_pcap.cli`` creates setup with two network ports. +Packet received on one port is forwarded to other port. + +On the successful execution of ``l2fwd.cli`` or ``l2fwd_pcap.cli``, +user needs to send traffic on RX port. + For net_pcapX devices, required pcap file should be created and passed to application. These pcap files can be created in several ways. Scapy is one of the method to get the same: @@ -321,3 +341,10 @@ l3fwd .. _figure_l3fwd_graph: .. figure:: img/graph-usecase-l3fwd.* + +l2fwd +~~~~~ + +.. _figure_l2fwd_graph: + +.. figure:: img/graph-usecase-l2fwd.* diff --git a/doc/guides/tools/img/graph-usecase-l2fwd.svg b/doc/guides/tools/img/graph-usecase-l2fwd.svg new file mode 100644 index 0000000000..6b70af3380 --- /dev/null +++ b/doc/guides/tools/img/graph-usecase-l2fwd.svg @@ -0,0 +1,84 @@ + + + + + + + + + +dpdk_app_graph_l2fwd_nodes_flow + + + +ingress_port + +ingress_port + + + +ethdev_rx + +ethdev_rx + + + +ingress_port->ethdev_rx + + +ingress packet + + + +ethdev_tx + +ethdev_tx + + + +ethdev_rx->ethdev_tx + + + + + +pkt_drop + +pkt_drop + + + +ethdev_rx->pkt_drop + + + + + +egress_port + +egress_port + + +