Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/119789/?format=api
https://patches.dpdk.org/api/patches/119789/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/20221111084929.1579639-3-andrew.rybchenko@oktetlabs.ru/", "project": { "id": 1, "url": "https://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20221111084929.1579639-3-andrew.rybchenko@oktetlabs.ru>", "list_archive_url": "https://inbox.dpdk.org/dev/20221111084929.1579639-3-andrew.rybchenko@oktetlabs.ru", "date": "2022-11-11T08:49:29", "name": "[v2,2/2] app/testpmd: support TCP TSO in Tx only mode", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "1a56ef2deaf06443c5bb370ae55d93209ecedae5", "submitter": { "id": 2013, "url": "https://patches.dpdk.org/api/people/2013/?format=api", "name": "Andrew Rybchenko", "email": "Andrew.Rybchenko@oktetlabs.ru" }, "delegate": { "id": 3961, "url": "https://patches.dpdk.org/api/users/3961/?format=api", "username": "arybchenko", "first_name": "Andrew", "last_name": "Rybchenko", "email": "andrew.rybchenko@oktetlabs.ru" }, "mbox": "https://patches.dpdk.org/project/dpdk/patch/20221111084929.1579639-3-andrew.rybchenko@oktetlabs.ru/mbox/", "series": [ { "id": 25731, "url": "https://patches.dpdk.org/api/series/25731/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=25731", "date": "2022-11-11T08:49:27", "name": "app/testpmd: support TCP TSO in Tx only mode", "version": 2, "mbox": "https://patches.dpdk.org/series/25731/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/119789/comments/", "check": "success", "checks": "https://patches.dpdk.org/api/patches/119789/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 9A0F5A0542;\n\tFri, 11 Nov 2022 09:49:43 +0100 (CET)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id E6F1842D17;\n\tFri, 11 Nov 2022 09:49:37 +0100 (CET)", "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id 5C2A842D0E\n for <dev@dpdk.org>; Fri, 11 Nov 2022 09:49:35 +0100 (CET)", "by shelob.oktetlabs.ru (Postfix, from userid 115)\n id CAC0086; Fri, 11 Nov 2022 11:49:34 +0300 (MSK)", "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id 56B2686;\n Fri, 11 Nov 2022 11:49:32 +0300 (MSK)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.6 (2021-04-09) on mail1.oktetlabs.ru", "X-Spam-Level": "", "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED, DKIM_ADSP_DISCARD\n autolearn=no autolearn_force=no version=3.4.6", "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 56B2686", "Authentication-Results": "shelob.oktetlabs.ru/56B2686; dkim=none;\n dkim-atps=neutral", "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>", "To": "Ferruh Yigit <ferruh.yigit@amd.com>,\n Aman Singh <aman.deep.singh@intel.com>,\n Yuying Zhang <yuying.zhang@intel.com>", "Cc": "dev@dpdk.org, Georgiy Levashov <georgiy.levashov@oktetlabs.ru>,\n Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>", "Subject": "[PATCH v2 2/2] app/testpmd: support TCP TSO in Tx only mode", "Date": "Fri, 11 Nov 2022 11:49:29 +0300", "Message-Id": "<20221111084929.1579639-3-andrew.rybchenko@oktetlabs.ru>", "X-Mailer": "git-send-email 2.30.2", "In-Reply-To": "<20221111084929.1579639-1-andrew.rybchenko@oktetlabs.ru>", "References": "<20221111084929.1579639-1-andrew.rybchenko@oktetlabs.ru>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org" }, "content": "Add '--txonly-tso-mss=N' option that enables TSO offload\nand generates packets with specified MSS in txonly mode.\n\nSigned-off-by: Georgiy Levashov <georgiy.levashov@oktetlabs.ru>\nSigned-off-by: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\n app/test-pmd/parameters.c | 10 ++++++\n app/test-pmd/testpmd.c | 12 ++++++++\n app/test-pmd/testpmd.h | 1 +\n app/test-pmd/txonly.c | 44 +++++++++++++++++++++++++--\n doc/guides/testpmd_app_ug/run_app.rst | 4 +++\n 5 files changed, 68 insertions(+), 3 deletions(-)", "diff": "diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c\nindex 2ed8afedfd..e71cb3e139 100644\n--- a/app/test-pmd/parameters.c\n+++ b/app/test-pmd/parameters.c\n@@ -156,6 +156,7 @@ usage(char* progname)\n \tprintf(\" --txpkts=X[,Y]*: set TX segment sizes\"\n \t\t\" or total packet length.\\n\");\n \tprintf(\" --txonly-multi-flow: generate multiple flows in txonly mode\\n\");\n+\tprintf(\" --txonly-tso-mss=N: enable TSO offload and generate packets with specified MSS in txonly mode\\n\");\n \tprintf(\" --tx-ip=src,dst: IP addresses in Tx-only mode\\n\");\n \tprintf(\" --tx-udp=src[,dst]: UDP ports in Tx-only mode\\n\");\n \tprintf(\" --eth-link-speed: force link speed.\\n\");\n@@ -670,6 +671,7 @@ launch_args_parse(int argc, char** argv)\n \t\t{ \"rxhdrs\",\t\t\t1, 0, 0 },\n \t\t{ \"txpkts\",\t\t\t1, 0, 0 },\n \t\t{ \"txonly-multi-flow\",\t\t0, 0, 0 },\n+\t\t{ \"txonly-tso-mss\",\t\t1, 0, 0 },\n \t\t{ \"rxq-share\",\t\t\t2, 0, 0 },\n \t\t{ \"eth-link-speed\",\t\t1, 0, 0 },\n \t\t{ \"disable-link-check\",\t\t0, 0, 0 },\n@@ -1297,6 +1299,14 @@ launch_args_parse(int argc, char** argv)\n \t\t\t}\n \t\t\tif (!strcmp(lgopts[opt_idx].name, \"txonly-multi-flow\"))\n \t\t\t\ttxonly_multi_flow = 1;\n+\t\t\tif (!strcmp(lgopts[opt_idx].name, \"txonly-tso-mss\")) {\n+\t\t\t\tn = atoi(optarg);\n+\t\t\t\tif (n >= 0 && n <= UINT16_MAX)\n+\t\t\t\t\ttxonly_tso_segsz = n;\n+\t\t\t\telse\n+\t\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t\t \"TSO MSS must be >= 0 and <= UINT16_MAX\\n\");\n+\t\t\t}\n \t\t\tif (!strcmp(lgopts[opt_idx].name, \"rxq-share\")) {\n \t\t\t\tif (optarg == NULL) {\n \t\t\t\t\trxq_share = UINT32_MAX;\ndiff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c\nindex ef281ccd20..94d37be692 100644\n--- a/app/test-pmd/testpmd.c\n+++ b/app/test-pmd/testpmd.c\n@@ -264,6 +264,9 @@ enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;\n uint8_t txonly_multi_flow;\n /**< Whether multiple flows are generated in TXONLY mode. */\n \n+uint16_t txonly_tso_segsz;\n+/**< TSO MSS for generated packets in TXONLY mode. */\n+\n uint32_t tx_pkt_times_inter;\n /**< Timings for send scheduling in TXONLY mode, time between bursts. */\n \n@@ -1615,6 +1618,15 @@ init_config_port_offloads(portid_t pid, uint32_t socket_id)\n \t\tport->dev_conf.txmode.offloads &=\n \t\t\t~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;\n \n+\tif (txonly_tso_segsz > 0) {\n+\t\tif ((ports[pid].dev_info.tx_offload_capa &\n+\t\t RTE_ETH_TX_OFFLOAD_TCP_TSO) == 0) {\n+\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t \"TSO isn't supported for port %d\\n\", pid);\n+\t\t}\n+\t\tport->dev_conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_TCP_TSO;\n+\t}\n+\n \t/* Apply Rx offloads configuration */\n \tfor (i = 0; i < port->dev_info.max_rx_queues; i++)\n \t\tport->rxq[i].conf.offloads = port->dev_conf.rxmode.offloads;\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex 976f4f83dd..fbe1839a8f 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -611,6 +611,7 @@ enum tx_pkt_split {\n extern enum tx_pkt_split tx_pkt_split;\n \n extern uint8_t txonly_multi_flow;\n+extern uint16_t txonly_tso_segsz;\n \n extern uint32_t rxq_share;\n \ndiff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c\nindex 44bda752bc..7095c31b01 100644\n--- a/app/test-pmd/txonly.c\n+++ b/app/test-pmd/txonly.c\n@@ -60,6 +60,7 @@ RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */\n \n static union pkt_l4_hdr_t {\n \tstruct rte_udp_hdr udp;\t/**< UDP header of tx packets. */\n+\tstruct rte_tcp_hdr tcp; /**< TCP header of tx packets. */\n } pkt_l4_hdr; /**< Layer 4 header of tx packets. */\n \n static uint64_t timestamp_mask; /**< Timestamp dynamic flag mask */\n@@ -112,8 +113,19 @@ setup_pkt_l4_ip_headers(uint8_t ip_proto, struct rte_ipv4_hdr *ip_hdr,\n \tuint32_t ip_cksum;\n \tuint16_t pkt_len;\n \tstruct rte_udp_hdr *udp_hdr;\n+\tstruct rte_tcp_hdr *tcp_hdr;\n \n \tswitch (ip_proto) {\n+\tcase IPPROTO_TCP:\n+\t\t/*\n+\t\t * Initialize TCP header.\n+\t\t */\n+\t\tpkt_len = (uint16_t)(pkt_data_len + sizeof(struct rte_tcp_hdr));\n+\t\ttcp_hdr = &l4_hdr->tcp;\n+\t\ttcp_hdr->src_port = rte_cpu_to_be_16(tx_l4_src_port);\n+\t\ttcp_hdr->dst_port = rte_cpu_to_be_16(tx_l4_dst_port);\n+\t\ttcp_hdr->data_off = (sizeof(struct rte_tcp_hdr) << 2) & 0xF0;\n+\t\tbreak;\n \tcase IPPROTO_UDP:\n \t\t/*\n \t\t * Initialize UDP header.\n@@ -189,6 +201,8 @@ update_pkt_header(struct rte_mbuf *pkt, uint32_t total_pkt_len)\n \tip_hdr->hdr_checksum = rte_ipv4_cksum(ip_hdr);\n \n \tswitch (ip_hdr->next_proto_id) {\n+\tcase IPPROTO_TCP:\n+\t\tbreak;\n \tcase IPPROTO_UDP:\n \t\t/* update UDP packet length */\n \t\tudp_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_udp_hdr *,\n@@ -232,6 +246,12 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp,\n \tpkt->l2_len = sizeof(struct rte_ether_hdr);\n \tpkt->l3_len = sizeof(struct rte_ipv4_hdr);\n \n+\tif (txonly_tso_segsz > 0) {\n+\t\tpkt->tso_segsz = txonly_tso_segsz;\n+\t\tpkt->ol_flags |= RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_IPV4 |\n+\t\t\t\t RTE_MBUF_F_TX_IP_CKSUM;\n+\t}\n+\n \tpkt_len = pkt->data_len;\n \tpkt_seg = pkt;\n \tfor (i = 1; i < nb_segs; i++) {\n@@ -267,6 +287,12 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp,\n \t\tRTE_PER_LCORE(_ip_var) = ip_var;\n \t}\n \tswitch (ip_hdr->next_proto_id) {\n+\tcase IPPROTO_TCP:\n+\t\tcopy_buf_to_pkt(&pkt_l4_hdr.tcp, sizeof(pkt_l4_hdr.tcp), pkt,\n+\t\t\t\tsizeof(struct rte_ether_hdr) +\n+\t\t\t\tsizeof(struct rte_ipv4_hdr));\n+\t\tl4_hdr_size = sizeof(pkt_l4_hdr.tcp);\n+\t\tbreak;\n \tcase IPPROTO_UDP:\n \t\tcopy_buf_to_pkt(&pkt_l4_hdr.udp, sizeof(pkt_l4_hdr.udp), pkt,\n \t\t\t\tsizeof(struct rte_ether_hdr) +\n@@ -277,6 +303,7 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp,\n \t\tl4_hdr_size = 0;\n \t\tbreak;\n \t}\n+\tpkt->l4_len = l4_hdr_size;\n \n \tif (unlikely(tx_pkt_split == TX_PKT_SPLIT_RND) || txonly_multi_flow)\n \t\tupdate_pkt_header(pkt, pkt_len);\n@@ -459,10 +486,21 @@ tx_only_begin(portid_t pi)\n {\n \tuint16_t pkt_hdr_len, pkt_data_len;\n \tint dynf;\n+\tuint8_t ip_proto;\n \n \tpkt_hdr_len = (uint16_t)(sizeof(struct rte_ether_hdr) +\n-\t\t\t\t sizeof(struct rte_ipv4_hdr) +\n-\t\t\t\t sizeof(struct rte_udp_hdr));\n+\t\t\t\t sizeof(struct rte_ipv4_hdr));\n+\tip_proto = txonly_tso_segsz > 0 ? IPPROTO_TCP : IPPROTO_UDP;\n+\tswitch (ip_proto) {\n+\tcase IPPROTO_TCP:\n+\t\tpkt_hdr_len += sizeof(struct rte_tcp_hdr);\n+\t\tbreak;\n+\tcase IPPROTO_UDP:\n+\t\tpkt_hdr_len += sizeof(struct rte_udp_hdr);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n \tpkt_data_len = tx_pkt_length - pkt_hdr_len;\n \n \tif ((tx_pkt_split == TX_PKT_SPLIT_RND || txonly_multi_flow) &&\n@@ -474,7 +512,7 @@ tx_only_begin(portid_t pi)\n \t\treturn -EINVAL;\n \t}\n \n-\tsetup_pkt_l4_ip_headers(IPPROTO_UDP, &pkt_ip_hdr, &pkt_l4_hdr,\n+\tsetup_pkt_l4_ip_headers(ip_proto, &pkt_ip_hdr, &pkt_l4_hdr,\n \t\t\t\tpkt_data_len);\n \n \ttimestamp_enable = false;\ndiff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst\nindex 610e442924..01d6852fd3 100644\n--- a/doc/guides/testpmd_app_ug/run_app.rst\n+++ b/doc/guides/testpmd_app_ug/run_app.rst\n@@ -369,6 +369,10 @@ The command line options are:\n \n Generate multiple flows in txonly mode.\n \n+* ``--txonly-tso-mss=N```\n+\n+ Enable TSO offload and generate TCP packets with specified MSS in txonly mode.\n+\n * ``--rxq-share=[X]``\n \n Create queues in shared Rx queue mode if device supports.\n", "prefixes": [ "v2", "2/2" ] }{ "id": 119789, "url": "