get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/119789/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 119789,
    "url": "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"
    ]
}