From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CCFDAA09E5; Wed, 19 Oct 2022 18:42:05 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AE06442C03; Wed, 19 Oct 2022 18:42:05 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2061.outbound.protection.outlook.com [40.107.223.61]) by mails.dpdk.org (Postfix) with ESMTP id 7A0974280C for ; Wed, 19 Oct 2022 18:42:04 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UQDv7lniaC9MlCViJcYEpWlDeS7t4P/F9sQOIaaYso8HrPNdedaTILufbMSlH942+2zYw1RtFJrW1q7I82WXFIUJZeR5XHUYjeuBL+AW25miYnHfd24qdHlU6kNv/5/zGVB4K7klkWwS8Qq68hbu4qrfj7DPx041tg/1CxsveYrrcQvzAyt3VeH7w+fIBPDWnqN6875wBd3o1DSrsqGq2D0h0JJ+YawWwklV/Kjbld/pypyRpqPRlqMwnfRFfyrOc8Aw2yiJK1/1BcX70VpncKFwU17gJKR2Z4k745prjxP8YLNfpi7owAI6GvqnFmiMCvYD4fI7RqYSKeA27UlHGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WFkR0rEA2ksNZDJljFMCTWECkbMxeLo2XlxcH3ZwI6c=; b=AYpF4wdcDH2ToP8kL2RPG9xQ9DACMxHk2M8bnqHU3NMXexC1K7TqZG959JzbH+dEbPWtrhDy8wtJJXzPAw2mHYjAMgp9l9U0FYzggus8TR4Yh7FNHt600u4Sbr1zYEi5BOaI2RHmFkGIEoXlKTS4BtQkVfNXnr8ENx5RdjXYL4D8bMbkUMdctf0tzsaDbDzx+UQ4LMkHz3re1mHvFOPllqwUYwP0F/62JH7kKNOJWXGJyIwq6zdSP7xYP0vDS1FaKJT0L6eBn+1DCzu/UqjCVD6U4PMTv8LICgggcWULTnxitV6mtdTcrmI+Q4p1Axv8RQzWdTxDodpDEOKkyqkrWQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WFkR0rEA2ksNZDJljFMCTWECkbMxeLo2XlxcH3ZwI6c=; b=nAatiqxorXdtEMiglY7Wjf654z+eKx3FoAshdklwP3zSWqAtY8Hn3NtEvjEQx1xwYREWJ7DedR2XBPhV83TVu+eNrzZwiyZFPwuIN2r/4f4BU/g0x4C6ROdY5vkpyNOdH/nLEFAk9JQ8JR7JE89V+ZdEV+7b2ecOw5tUdlJX/DM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; Received: from DM6PR12MB4297.namprd12.prod.outlook.com (2603:10b6:5:211::20) by BY5PR12MB4886.namprd12.prod.outlook.com (2603:10b6:a03:1c5::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.34; Wed, 19 Oct 2022 16:42:01 +0000 Received: from DM6PR12MB4297.namprd12.prod.outlook.com ([fe80::b9fd:e732:4585:6b25]) by DM6PR12MB4297.namprd12.prod.outlook.com ([fe80::b9fd:e732:4585:6b25%7]) with mapi id 15.20.5723.033; Wed, 19 Oct 2022 16:42:01 +0000 Message-ID: <47576263-8afa-b21b-20f7-e887ee02bd94@amd.com> Date: Wed, 19 Oct 2022 17:41:56 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.3.3 Subject: Re: [PATCH 2/2] app/testpmd: support TCP TSO in Tx only mode Content-Language: en-US To: Andrew Rybchenko , Aman Singh , Yuying Zhang Cc: dev@dpdk.org, Georgiy Levashov , Ivan Ilchenko References: <20221017144133.1899052-1-andrew.rybchenko@oktetlabs.ru> <20221017144133.1899052-3-andrew.rybchenko@oktetlabs.ru> From: Ferruh Yigit In-Reply-To: <20221017144133.1899052-3-andrew.rybchenko@oktetlabs.ru> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO4P265CA0092.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2bc::13) To DM6PR12MB4297.namprd12.prod.outlook.com (2603:10b6:5:211::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR12MB4297:EE_|BY5PR12MB4886:EE_ X-MS-Office365-Filtering-Correlation-Id: 135866e2-d42d-401d-a9e7-08dab1f0d8ed X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 2MFZvwT2+bg3tcFQLa/LBN5PHyb8FL6GOGDAqijFIUusnAoVZO2utzayRRAMCCiDWWXi3gfPB3W+0tDEhacSJ/cjvtLP9GejFtzHEFShyhv1Ho28Wg/7vNFRqqopY61oZXlP0ximxQh1tc7FUO+VToqWnpP5OEZoGCSHEFi28BIV8LFF08Wyp4MzKSQ+hO9aoMfn307fkwaetmAwE8Z9mGoidhqNO9lMK52xqZ/rq7SgXgcWuCIiRdbLntcCRpxDYPH8c29TT8Y+JLhp9qjhdvIEynag0YCXHQfP5pLN3thT+kmkl3Jol5r8BcL+HOVmH8h+WyEx3hkIOlGVYgf5CLpDXqkh0o64B1SmeYuLCxcfXoN73XVwRMl07a+VB/k7uxGK/vJGvau61cKSaqkUUg/qj23OxbjQOrt01OKlzGQgrc8a2QbwmuQyaHhNp3sy+Nahzna8/MSUowXyThC2O2HsmKXgU+CTP+YQDVC3CAoXCAkoGl2QC9LVpLCHZnOg2VLBi6LspYuTFP18vMKMoLgKKbCk87pIGLVk7wBfDkhW+ozA3AArqNwQE0fhicuY/UrcpXWFlBLAI8NSmX8Dlz8imA67DvuF4cTXO7IKLwEJ1O9YA/j7tDkHNiKfwGaqFn7VFfuYEks7GLJNO8+CEPzM9XM/drH+/5fjUD+iRoSGsWeqYPhnhW/obiNrEIHczgxFF4MwR4+sShjyn5omWffH9XTJ9TC84eSyPlScSH8KwSUq7JhqLrCoGCT67D4FRIp5EJzWYDbwSyp0WOHXgBIZFmHBr68PATWE350gtxk= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR12MB4297.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230022)(4636009)(396003)(136003)(376002)(39860400002)(366004)(346002)(451199015)(38100700002)(6666004)(86362001)(31696002)(6512007)(5660300002)(8936002)(41300700001)(6506007)(53546011)(66556008)(66946007)(66476007)(26005)(8676002)(4326008)(110136005)(44832011)(186003)(2906002)(54906003)(2616005)(316002)(36756003)(31686004)(6486002)(478600001)(83380400001)(43740500002)(45980500001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TmcwYldnemN5eHg3bzhvc0xNWVQwNkYxY0pOVWp0ckZpN1B2RnNJVjllVk05?= =?utf-8?B?TVcvOFZYZTRHNWdvZmx4ODFXeG5WV3RRamlxNjlzaisvT1h6aHdXY3VWb1J2?= =?utf-8?B?Q0ZORlQxNDk4WVVobElWMjJYUW9OTVFrNWY4OW9DYmUwUFpwUGtYYWVYa3VL?= =?utf-8?B?MEJ3QWZKWDFZckkvRTRGSmRXOVJERkQrZXA5SFU5U1NYNFlBaU9ubFpqU3Fm?= =?utf-8?B?ZWdkb0VtSFVQQkdKNExuUUwvRThyTFFnUm9WQlVEZ2k4Q0ZOYUVsUktVbGFj?= =?utf-8?B?Y3puQXh1NkpwSjlEMUszcGdDdERic2E2TjRoUHR5WjY0RmdVaWhsWXNISU42?= =?utf-8?B?dFkxaklDbHBJQ091RVpmUTFxdFJFeXE2dEl0c290L3hFREFrYzV2WTRvaGF2?= =?utf-8?B?TFYxVy9kanVSMmljcU9ib1JML3pOQ245TG5KSFI3Z2R6VTNiV1FxVVZvWGxH?= =?utf-8?B?bjRLeEdpR250Zno5eHJSZDdlMGlmbmo3LzBwVW5DMGwrMG8yODNPWDUvUi9t?= =?utf-8?B?dUw5dFNXQXZQZ28wYi9BRzdwSXFwTVdoTzRtNmRIejI5bkcrOGVBbDZodS93?= =?utf-8?B?cnd1UGhlSEg4eHFnSVBwMDJBQnRIUWM5Q0ZFNGk3WWNpUU52Tk51U05RUWZY?= =?utf-8?B?ZDMvbGI1Y1M0am1ydHBRMlQ0RzBhMzZKWjVrZktNanBVMWVKRVhGU08yVHdx?= =?utf-8?B?L0oyTTRiaWtkaFJHdXNVMW1rdzFSejZPN3ZiTjh0b1QwNUtKQUJlMFIyVzB1?= =?utf-8?B?RzJBRkhsZGdHOHFSbE1GZzZscHFtb29vc2MyS1VQSGRNU0pWK1hkY3RyOVJC?= =?utf-8?B?Q05qd2J1aFBhNzYzMjRabVlpZG5TZktMRUVvdDV2YnVDeFR3UmZadExyUzlC?= =?utf-8?B?Q2VlRTc5NjFFZkRxcmFEV2hDNEhHYlQwcW1Za2hXYkgxM2VnU3ZpVGhhQU5m?= =?utf-8?B?cDI1bkM3akZCSWhJWWRKMm4xYmtOWUVGS3RBMWdyMmswenRkaVNOVmlJOTB4?= =?utf-8?B?eGlUQVZSZWtBdEVmT0RDTkdvdi94ejg4ek4zeUVQZ2VoVzU0Q1g5clV2Mk1k?= =?utf-8?B?MHlFR0o0d3M4cGZCYXdsdnhySGNZclRvaWF6ZUE0cFhDTVFoZmw0NkVUNzg5?= =?utf-8?B?eTZFdnpUZGxUUTdLQXZaZ3YxK0ZFcWxoY3cvYnlYT1o0L1NYdERQRTlEWDls?= =?utf-8?B?UDk5czRGUjNEeUR5eW5vUStUM2xZaDJDekptMXJQWjNoUUpzNk5Bc2t1c3dx?= =?utf-8?B?SjEwMUdKak5CNEQ4UUgvZGNXZ0wwMzRlYkJNU1N5NVJBWXlvY2lURG55T2ZR?= =?utf-8?B?ck9EVVY0YUpCV3d6RGJYY3p1NVlYeVJHWk9vVHYyWDY0eklXMjNjYzFTbnhl?= =?utf-8?B?UzVlTU1lenBwbXdHaUs0dmhDR2NyUWxQTWtwS0FweTVwZXZ3SHVCTkcrQWFw?= =?utf-8?B?ZTlVZ0VFUUNSNUdhNXplcWVrbFEvMjA3c2ZOREpXWGtiV2tYSkYvQUMvUzZs?= =?utf-8?B?OFZtd0R0SlhzSmJBcFBXclczWjdWSnlIakdkVUxoODQ4M2RRWWc3ZEFDWFgr?= =?utf-8?B?VjJxWkthYzc4Q01vRG92NkxMMnlrd29OTWZvNVhnNnFaWXJHZFJraUkvaVc2?= =?utf-8?B?Vzl2VmE1R1dhWTQyNCtZSldrcytFS3ExS2M0M1h6ekZ2VWJrYXdFTEZ1M2tz?= =?utf-8?B?YUlxWnBNTmQxWjJGdmxhUkxORmUxNFdKTHdYaGdTb0hndXcxSGkvdFl6Ukhw?= =?utf-8?B?TDF2QU03ZzJ4YnU5OE9IL0p0emhuWCthYUxvdXJISkc0dGd5V2tBN2hDb1F6?= =?utf-8?B?d21FY2lQNUVZLzNvR0hTdVRQVWJtV25LNm9md0wrMmMycUs2aE1IQUxWTlJw?= =?utf-8?B?aGhLU0JjUDFjYVl3dTgwNkRDOVVnb0EwL0JTd3lWei9TZnRyZm1oNWhBT05n?= =?utf-8?B?STkxam1vbnluWlg5ZzVPd21TTWY2OEptckR3eDMwZFpLMk5OVFpSWEtjejlt?= =?utf-8?B?UVNyTFNUa3VhY2JGV3lqdDhzMDloTGRvNCs2Nmt6YUMvR0tXM1QxZ0pxQnJy?= =?utf-8?B?Um5ZaGNYNEErQXB5TjFaeTBIc1MxS2FBQUN0SnpkaTc0aUpkMmViekRraWNW?= =?utf-8?Q?0fItlrKYRZe1wPu6jyiwJN2Db?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 135866e2-d42d-401d-a9e7-08dab1f0d8ed X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB4297.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Oct 2022 16:42:01.8567 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Q5No/dA25uVsfgla8N+q26pbku1zwW4YbfRGcedjvVmr52XsA4NuAgTvIhXNYOIL X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4886 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 On 10/17/2022 3:41 PM, Andrew Rybchenko wrote: > Add '--txonly-tso-mss=N' option that enables TSO offload > and generates packets with specified MSS in txonly mode. > > Signed-off-by: Georgiy Levashov > Signed-off-by: Ivan Ilchenko > Signed-off-by: Andrew Rybchenko > --- > app/test-pmd/parameters.c | 10 +++++++++ > app/test-pmd/testpmd.c | 12 +++++++++++ > app/test-pmd/testpmd.h | 1 + > app/test-pmd/txonly.c | 31 ++++++++++++++++++++++++++- > doc/guides/testpmd_app_ug/run_app.rst | 4 ++++ > 5 files changed, 57 insertions(+), 1 deletion(-) > > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c > index 545ebee16b..eba0c658c2 100644 > --- a/app/test-pmd/parameters.c > +++ b/app/test-pmd/parameters.c > @@ -156,6 +156,7 @@ usage(char* progname) > printf(" --txpkts=X[,Y]*: set TX segment sizes" > " or total packet length.\n"); > printf(" --txonly-multi-flow: generate multiple flows in txonly mode\n"); > + printf(" --txonly-tso-mss=N: enable TSO offload and generate packets with specified MSS in txonly mode\n"); > printf(" --tx-ip=src,dst: IP addresses in Tx-only mode\n"); > printf(" --tx-udp=src[,dst]: UDP ports in Tx-only mode\n"); > printf(" --eth-link-speed: force link speed.\n"); > @@ -671,6 +672,7 @@ launch_args_parse(int argc, char** argv) > { "rxhdrs", 1, 0, 0 }, > { "txpkts", 1, 0, 0 }, > { "txonly-multi-flow", 0, 0, 0 }, > + { "txonly-tso-mss", 1, 0, 0 }, > { "rxq-share", 2, 0, 0 }, > { "eth-link-speed", 1, 0, 0 }, > { "disable-link-check", 0, 0, 0 }, > @@ -1299,6 +1301,14 @@ launch_args_parse(int argc, char** argv) > } > if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow")) > txonly_multi_flow = 1; > + if (!strcmp(lgopts[opt_idx].name, "txonly-tso-mss")) { > + n = atoi(optarg); > + if (n >= 0 && n <= UINT16_MAX) > + txonly_tso_segsz = n; > + else > + rte_exit(EXIT_FAILURE, > + "TSO MSS must be >= 0 and <= UINT16_MAX\n"); > + } > if (!strcmp(lgopts[opt_idx].name, "rxq-share")) { > if (optarg == NULL) { > rxq_share = UINT32_MAX; > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c > index 97adafacd0..076f1b3740 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -264,6 +264,9 @@ enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF; > uint8_t txonly_multi_flow; > /**< Whether multiple flows are generated in TXONLY mode. */ > > +uint16_t txonly_tso_segsz; > +/**< TSO MSS for generated packets in TXONLY mode. */ > + > uint32_t tx_pkt_times_inter; > /**< Timings for send scheduling in TXONLY mode, time between bursts. */ > > @@ -1619,6 +1622,15 @@ init_config_port_offloads(portid_t pid, uint32_t socket_id) > port->dev_conf.txmode.offloads &= > ~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE; > > + if (txonly_tso_segsz > 0) { > + if ((ports[pid].dev_info.tx_offload_capa & > + RTE_ETH_TX_OFFLOAD_TCP_TSO) == 0) { > + rte_exit(EXIT_FAILURE, > + "TSO isn't supported for port %d\n", pid); > + } > + port->dev_conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_TCP_TSO; > + } > + > /* Apply Rx offloads configuration */ > for (i = 0; i < port->dev_info.max_rx_queues; i++) > port->rxq[i].conf.offloads = port->dev_conf.rxmode.offloads; > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index 30915bd84b..bb47bdb490 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -605,6 +605,7 @@ enum tx_pkt_split { > extern enum tx_pkt_split tx_pkt_split; > > extern uint8_t txonly_multi_flow; > +extern uint16_t txonly_tso_segsz; > > extern uint32_t rxq_share; > > diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c > index 44bda752bc..858cc73ab4 100644 > --- a/app/test-pmd/txonly.c > +++ b/app/test-pmd/txonly.c > @@ -60,6 +60,7 @@ RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */ > > static union pkt_l4_hdr_t { > struct rte_udp_hdr udp; /**< UDP header of tx packets. */ > + struct rte_tcp_hdr tcp; /**< TCP header of tx packets. */ > } pkt_l4_hdr; /**< Layer 4 header of tx packets. */ > > static uint64_t timestamp_mask; /**< Timestamp dynamic flag mask */ > @@ -112,8 +113,19 @@ setup_pkt_l4_ip_headers(uint8_t ip_proto, struct rte_ipv4_hdr *ip_hdr, > uint32_t ip_cksum; > uint16_t pkt_len; > struct rte_udp_hdr *udp_hdr; > + struct rte_tcp_hdr *tcp_hdr; > > switch (ip_proto) { > + case IPPROTO_TCP: > + /* > + * Initialize TCP header. > + */ > + pkt_len = (uint16_t)(pkt_data_len + sizeof(struct rte_tcp_hdr)); > + tcp_hdr = &l4_hdr->tcp; > + tcp_hdr->src_port = rte_cpu_to_be_16(tx_l4_src_port); > + tcp_hdr->dst_port = rte_cpu_to_be_16(tx_l4_dst_port); > + tcp_hdr->data_off = (sizeof(struct rte_tcp_hdr) << 2) & 0xF0; > + break; > case IPPROTO_UDP: > /* > * Initialize UDP header. > @@ -189,6 +201,8 @@ update_pkt_header(struct rte_mbuf *pkt, uint32_t total_pkt_len) > ip_hdr->hdr_checksum = rte_ipv4_cksum(ip_hdr); > > switch (ip_hdr->next_proto_id) { > + case IPPROTO_TCP: > + break; Why packet length is updated for UDP, but not for TCP packets? > case IPPROTO_UDP: > /* update UDP packet length */ > udp_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_udp_hdr *, > @@ -232,6 +246,12 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > pkt->l2_len = sizeof(struct rte_ether_hdr); > pkt->l3_len = sizeof(struct rte_ipv4_hdr); > > + if (txonly_tso_segsz > 0) { > + pkt->tso_segsz = txonly_tso_segsz; > + pkt->ol_flags |= RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_IPV4 | > + RTE_MBUF_F_TX_IP_CKSUM; > + } > + > pkt_len = pkt->data_len; > pkt_seg = pkt; > for (i = 1; i < nb_segs; i++) { > @@ -267,6 +287,12 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > RTE_PER_LCORE(_ip_var) = ip_var; > } > switch (ip_hdr->next_proto_id) { > + case IPPROTO_TCP: > + copy_buf_to_pkt(&pkt_l4_hdr.tcp, sizeof(pkt_l4_hdr.tcp), pkt, > + sizeof(struct rte_ether_hdr) + > + sizeof(struct rte_ipv4_hdr)); > + l4_hdr_size = sizeof(pkt_l4_hdr.tcp); > + break; > case IPPROTO_UDP: > copy_buf_to_pkt(&pkt_l4_hdr.udp, sizeof(pkt_l4_hdr.udp), pkt, > sizeof(struct rte_ether_hdr) + > @@ -277,6 +303,7 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > l4_hdr_size = 0; > break; > } > + pkt->l4_len = l4_hdr_size; > > if (unlikely(tx_pkt_split == TX_PKT_SPLIT_RND) || txonly_multi_flow) > update_pkt_header(pkt, pkt_len); > @@ -459,6 +486,7 @@ tx_only_begin(portid_t pi) > { > uint16_t pkt_hdr_len, pkt_data_len; > int dynf; > + uint8_t ip_proto; > > pkt_hdr_len = (uint16_t)(sizeof(struct rte_ether_hdr) + > sizeof(struct rte_ipv4_hdr) + > @@ -474,7 +502,8 @@ tx_only_begin(portid_t pi) > return -EINVAL; > } > > - setup_pkt_l4_ip_headers(IPPROTO_UDP, &pkt_ip_hdr, &pkt_l4_hdr, > + ip_proto = txonly_tso_segsz > 0 ? IPPROTO_TCP : IPPROTO_UDP; > + setup_pkt_l4_ip_headers(ip_proto, &pkt_ip_hdr, &pkt_l4_hdr, > pkt_data_len); please check comment in previous patch to have more explict way to detect the protocol type. > > timestamp_enable = false; > diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst > index ed53b4fb1f..b7d1a07346 100644 > --- a/doc/guides/testpmd_app_ug/run_app.rst > +++ b/doc/guides/testpmd_app_ug/run_app.rst > @@ -369,6 +369,10 @@ The command line options are: > > Generate multiple flows in txonly mode. > > +* ``--txonly-tso-mss=N``` > + > + Enable TSO offload and generate TCP packets with specified MSS in txonly mode. > + > * ``--rxq-share=[X]`` > > Create queues in shared Rx queue mode if device supports.