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 0CB28A09E5; Wed, 19 Oct 2022 18:39:30 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DC3EC42BB3; Wed, 19 Oct 2022 18:39:29 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2051.outbound.protection.outlook.com [40.107.223.51]) by mails.dpdk.org (Postfix) with ESMTP id CB11F4280C for ; Wed, 19 Oct 2022 18:39:27 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OkiEqbZ78QjRKx44wgAsHCNUmUAqu2E6YYNJBluNDetCFm5iWpZgZeO7XEjOMEIc+bcUqpgWFQrX+rv9OnqnZzQw0S0nV2GRosoO5rmJ2+DWfWlk1AEUk1V+FD739Ja7YD4YD3sNVlyBgrRSLlTDaqcmk2bxmkzXNZwP+g8Ak4D+tfqrjW6kx4lUSsbwi+zc5O9ifPOHbomXTcovkR66uPD66VT5ZtF2vO+bcm90chwmiId9RztfkdMc1Nmkjn0KJMAnyrLTtw2mdQDST+S1Pwt1+Ck8vUY/+ZI9WWgwT1FSOffALAph2MPeYlo+TdRgye8yfM5sLYud6fPUkGubPA== 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=uBRyn3X/FYps9+gyg3+fQE5C01CjV1PGtxhHW4eIL9o=; b=OPog5fG8OvvIfMY38tEvzSlmP6YTPJuEY0r3WhjLGPJD72fE6U9268+ZHdE1XhL3MvREZCq752as89ee/OtZASS/tF8lumLZ4RVqFYbS0k+EGGuIOpXq0ZEszokheEpZgkv7vfkEpkpFy2KvRhVLSB67IBLKbQAb+Aol8+oEP2msCutdzKYRUhqdwIyJb8ZPH1O6Th0EGOhsaPM8j1rq6ywqFZoC1zr6jf5gprFBGUn7pWN2K/GrSXuQuTNwQ/MR0sv+jliOrzShHNHInHZhXFUX1mu100Jf5aQoC1vGwDKo/3atAK9DfdyEEPrzsDbaeVERFdS+CjwLMDOOlrLtFg== 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=uBRyn3X/FYps9+gyg3+fQE5C01CjV1PGtxhHW4eIL9o=; b=BJgZDsmgXM7wevY+r4WCJD/L6ouQyl0eBcSsI6haYbDCuh0WQKTLzXrpwVaD4IlD73gP16xMFLMx1jtVZ2ZSQqof5oPjYOPUXKHq77k3ngkM+nggx/AUfJLVdRLKiGjev+Oaq9eIbTEfRYCAfn6vdy+t0nhMVJmnAgjPgaDHV5M= 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 DM6PR12MB4108.namprd12.prod.outlook.com (2603:10b6:5:220::18) 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:39:25 +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:39:25 +0000 Message-ID: Date: Wed, 19 Oct 2022 17:39:20 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.3.3 Subject: Re: [PATCH 1/2] app/testpmd: prepare to support TCP 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-2-andrew.rybchenko@oktetlabs.ru> From: Ferruh Yigit In-Reply-To: <20221017144133.1899052-2-andrew.rybchenko@oktetlabs.ru> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO4P265CA0222.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:33a::10) To DM6PR12MB4297.namprd12.prod.outlook.com (2603:10b6:5:211::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR12MB4297:EE_|DM6PR12MB4108:EE_ X-MS-Office365-Filtering-Correlation-Id: 13e9aeda-f459-44d2-67eb-08dab1f07bed X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: AAZDQYKZKgDSFDW+YSeXpeJ63BXvAnfUVlBF65C0Usqp30ULTVkBlIjMzpMPiHapql/yCEf5SxoFKt2fYiIeIVQhrJJEQNseLBmpRHNqQ3SIkhnFAiZ2gA5lz4wvLFpXGvP27oBFSiZ7j4jB8pUpgiUX9dKk7WQKw/QLvWx1CtZN0Dytb2HcRRGVTt4zkibxbE7LY0fUOO3LzFgPe8tuXEGwYHoFj4MRBgRnEoT/QPVJk4bUrAllRdxJErnxhBlLWC2EFcnsi43B9PYUblHKV8eV5zHX2Pv8O9mLUZkVygP3pLnkAferQmN03XXoWWHKcXgD+WeeTNvDaFjngfElKIhd7VAd9k2kOjeb6rgcVsgrwfLoPiHmjvoGj2AQgDquVRxpu+ieif+yZBOsRxSc/ZGEDMU3nOd+tPGp9BBt8eH5Grua3H5rjkA/8c4riXGYFX/AFZIrOEjgtdTlDFRDYfm0REVRNImAl+21oQ+Mg+alRjxlDXaMsz0Fxqm2dB9yOi+qAD2/3+s6It/oGD+1s/hVUtozo0L7eeWliA+02K8L0VFZcwN2KFB9FuHyiQ3BcW15uChIC9GqWHegaIQmjQr9Tin+yu7raz+cb8EnzAft0oRPuNwilysJA5tvvlUPODGg8TTDFNStMP0qdEt+681V8OjCvWuXyZzlQ0Agm01AOd4mK3M+PnT1GKrYFKqaNbYeuv4Fk+Iwrjai564Q0v6gwu8VhaHqZJFYkP7rKbGdyXVl6gbylT/YCOMcsh2w/yj3ms1eD8yPNFy/CrV4hMlxxbxpSFGsdswK0MWUbdc= 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)(39860400002)(136003)(396003)(376002)(366004)(346002)(451199015)(31686004)(478600001)(83380400001)(86362001)(31696002)(6486002)(66946007)(36756003)(66476007)(66556008)(53546011)(6666004)(8676002)(6506007)(316002)(41300700001)(26005)(6512007)(8936002)(44832011)(110136005)(4326008)(54906003)(5660300002)(2616005)(2906002)(186003)(38100700002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UUVlZmZvb2V1RDd4eUdXOFJjS0M1YVJCUDZKamxqbk8yTW52TlFwZ21TOHdC?= =?utf-8?B?RlhGbnkrSk4yd3g3ektzV0tha3Q4UVh4ckQwUHNET0M5T01sUTFqbFBVSTNu?= =?utf-8?B?bHFHVVBvcU1nblA0cDM3NG4wMHV4OTZyWGdEQS95ck1YOUVwM0VSK2lVcnph?= =?utf-8?B?TE5Uem1pdjVXMEMrQms2QlpEejB4VW9FTlhqN2txVExQUFhQVXd2Njc5R2hL?= =?utf-8?B?K3BPc0VKVzVNVFFyRVhvQ2Rjb0VKbTVCKzFXdW5FTEdNRGo3OENsVGxqNW9u?= =?utf-8?B?Mnp3MDQzaHY2ZkQ1Z1lBcTZTS1NBQ25BRjZtdXBJcThKa3lKNXpOVFU0RTZN?= =?utf-8?B?aDQ3RnZ2cGY5NldLRXV3TXBoRVhXS0U1NVpodHYxbWEyOGF4Y0kyQWdhbnlB?= =?utf-8?B?THR3WkZkK1ZieEFOQlJGVUVHeGFwMlhtWFNmbGlnc3pBVXQwTmJCSW9DNFdT?= =?utf-8?B?YmJJRUZTMSthYXpHd2tqd2Q3VndPT1FSREUrTk5Da0FQVk5YT1J5VFErQTI1?= =?utf-8?B?VzlMYWhyVitDK25VMVpzMzhIY3BjUkQwQ2hBOUZkVmh1aUxUenNsOVdIcnhY?= =?utf-8?B?NDJYcHh2anE5aTJpd0dhTkhmM1pRWDNDa2JZMUd3MVMvWGNyL3VRbGExUjB6?= =?utf-8?B?cVN2V0FseXByMGROZm5NdGNNNm40LzZ6NElMdFZrT0ZXMHo4UUFEWEdSV09h?= =?utf-8?B?aThmOHh0c2RSTDB1S2ttTFVHZjYzMTU2S0h4dzlUNjlpb0VRZFdLMytSVEIw?= =?utf-8?B?bjN2SUtsdUVoeElOOXhWSVg2U2RQYXIyME9mTk5lMVN1dVpPR0hsTm1zMWND?= =?utf-8?B?Zk5pcXFoejJyL0pDcUpiWTVQTUpmSytEV2d3dm5OUmdYNE1ESDBPYWFKaUFj?= =?utf-8?B?VnduNU1HYWFOSXNCZ1RwaU81NDZnanMrK2pGUjc5NUs5UG5TVEpVODJWVUlX?= =?utf-8?B?T0E4OE1hSURUY0FYTTJmbTAwYiszdjhLY01PNm91cUtaVmpBOVRSUGpvUzNB?= =?utf-8?B?dTcwTTRwUjFUNml2TFZaUzc4RnRPbUUzSFFCYlRrM3dTTE8wVGdHTVhqN2xY?= =?utf-8?B?dEM1WitxeFdtMGZOQjlubVdPbll2elF0RXlQOUhwUHJVd1M2ZEFnTUFnd1ov?= =?utf-8?B?VmRoWW5MRzhkbm5HdXlxT3V3YzcvS1J1NFhQb1QyM1NZbmVsVVAydG9FRll5?= =?utf-8?B?Tkh4SlNlODJ1MEJlVXFHbWw4ckRpRVZuTTB0MDRLSVYxT2ZyVCtpbjRZQ3F1?= =?utf-8?B?V2IxT1BjNmxUMTBIam9UdXJNNnVqMkx4L2JwWVZDa1FjbnNKRG9xV3BRUnd1?= =?utf-8?B?Z0I1UzZoZGFzWEFsY0NRdUdSS2JGeVZsRldYRHNteHYzY2JaaXJiZGkwQ0Z5?= =?utf-8?B?R0RTVkk2bWJSaERwU3FlSUh4VElPeEVwSHd6b1VVYVhkQ1hqVElVK1N4MXpZ?= =?utf-8?B?OFBXb0ZyZFUyRnIvSmhTZFhYb1RXRmE2bEEwczVDaW1EbDZadUlpUjhOM25J?= =?utf-8?B?S3czemtGSEdJSWtRMk5VNkxVMGtDdC9WeURSaFh3dkRoQnMvWGhPNmFsWUtt?= =?utf-8?B?SzBjWUMrS284RHErb05ZaGNqdVNhTkNBN0VHNGZ3c3RzK1dYUW8rczFTbC9i?= =?utf-8?B?cU0xOGN1aXBCTG1ic1BtbTExZU5EMGVKeExPbHlKenV2QkQvMkZseHd0czN2?= =?utf-8?B?MGFpWFNSUWk1emIrVzFqT2xjMW1RVnBkMURRTHErUjVXaUZjTUs4V0ErVXg3?= =?utf-8?B?eUpybWFvTFJ6VW45eXNxVlB0aE02UnFybjFKNk9mSVNUMFhlcVVTc2RleWhH?= =?utf-8?B?ZHB0NlMvQW1iYnBoRjg4U0VxOUkrNnRBckxwbnVJQmh5QjdJVFZOY3ZVSGdU?= =?utf-8?B?bDN6Q0Yybm5PaGZtQ0JzWmsxUW5oZnVxc3hoSVNDbnpWMXJJazduenJWY2RB?= =?utf-8?B?RXgyR1FoNHJ2NlY5Rm5UUHpHZnB5dkZaUkNNMXJ0NUV3WXREYWhJdGVPMnds?= =?utf-8?B?Qzl0QnhLQU1YSXhCTm4wRlBwUVRoVkNtNnBhclJPdGo4dG14Vm8rRkhpQUZi?= =?utf-8?B?cTFHNlJTeWRvY01rY3Zyb2pWUnBFY2tWM0MwK0xyRWJ3R3owUDFQUDkrYVo0?= =?utf-8?Q?9yPM5XLjiTUE6HQyiXTjgP81x?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 13e9aeda-f459-44d2-67eb-08dab1f07bed 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:39:25.8113 (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: o9yXmHWOeRbhBurAR1/Cz/V35a2S7LoLDQnTs38n6/kevBTTjmAdB776f2H6Fxth X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4108 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: > This is useful for the incoming support of TCP TSO in Tx only mode. > > Signed-off-by: Georgiy Levashov > Signed-off-by: Ivan Ilchenko > Signed-off-by: Andrew Rybchenko > --- > app/test-pmd/parameters.c | 6 +-- > app/test-pmd/testpmd.h | 4 +- > app/test-pmd/txonly.c | 98 +++++++++++++++++++++++++-------------- > 3 files changed, 67 insertions(+), 41 deletions(-) > > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c > index ccb1173d7d..545ebee16b 100644 > --- a/app/test-pmd/parameters.c > +++ b/app/test-pmd/parameters.c > @@ -835,7 +835,7 @@ launch_args_parse(int argc, char** argv) > rte_exit(EXIT_FAILURE, > "Invalid UDP port: %s\n", > optarg); > - tx_udp_src_port = n; > + tx_l4_src_port = n; > if (*end == ',') { > char *dst = end + 1; > > @@ -845,9 +845,9 @@ launch_args_parse(int argc, char** argv) > rte_exit(EXIT_FAILURE, > "Invalid destination UDP port: %s\n", > dst); > - tx_udp_dst_port = n; > + tx_l4_dst_port = n; > } else { > - tx_udp_dst_port = n; > + tx_l4_dst_port = n; > } > > } The argument to set this variable is "tx-udp", so it has explicit 'udp' in the name, so I am not sure to reuse it as L4. Also documentation [1] and help output [2] explicitly mentions from this as UDP, please check `git grep "tx-udp"` output. One option is to update the argument name and documentation, even this can break some exitsting test scripts etc.. OR Can add a new parameter as "tx-tcp", I think this is better because right now next patch uses "txonly-tso-mss" to decide protocol is TCP, instead of using implied parameter "tx-tcp" can clarify that TCP protocol is requested. This also can help to decouple TCP and TSO support. What do you think? [1] doc/guides/testpmd_app_ug/run_app.rst [2] printf(" --tx-udp=src[,dst]: UDP ports in Tx-only mode\n"); > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index acdb7e855d..30915bd84b 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -619,8 +619,8 @@ extern int8_t tx_pthresh; > extern int8_t tx_hthresh; > extern int8_t tx_wthresh; > > -extern uint16_t tx_udp_src_port; > -extern uint16_t tx_udp_dst_port; > +extern uint16_t tx_l4_src_port; > +extern uint16_t tx_l4_dst_port; > > extern uint32_t tx_ip_src_addr; > extern uint32_t tx_ip_dst_addr; > diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c > index 021624952d..44bda752bc 100644 > --- a/app/test-pmd/txonly.c > +++ b/app/test-pmd/txonly.c > @@ -46,8 +46,8 @@ struct tx_timestamp { > }; > > /* use RFC863 Discard Protocol */ > -uint16_t tx_udp_src_port = 9; > -uint16_t tx_udp_dst_port = 9; > +uint16_t tx_l4_src_port = 9; > +uint16_t tx_l4_dst_port = 9; > > /* use RFC5735 / RFC2544 reserved network test addresses */ > uint32_t tx_ip_src_addr = (198U << 24) | (18 << 16) | (0 << 8) | 1; > @@ -57,7 +57,10 @@ uint32_t tx_ip_dst_addr = (198U << 24) | (18 << 16) | (0 << 8) | 2; > > static struct rte_ipv4_hdr pkt_ip_hdr; /**< IP header of transmitted packets. */ > RTE_DEFINE_PER_LCORE(uint8_t, _ip_var); /**< IP address variation */ > -static struct rte_udp_hdr pkt_udp_hdr; /**< UDP header of tx packets. */ > + > +static union pkt_l4_hdr_t { > + struct rte_udp_hdr udp; /**< UDP header of tx packets. */ > +} pkt_l4_hdr; /**< Layer 4 header of tx packets. */ > > static uint64_t timestamp_mask; /**< Timestamp dynamic flag mask */ > static int32_t timestamp_off; /**< Timestamp dynamic field offset */ > @@ -102,22 +105,30 @@ copy_buf_to_pkt(void* buf, unsigned len, struct rte_mbuf *pkt, unsigned offset) > } > > static void > -setup_pkt_udp_ip_headers(struct rte_ipv4_hdr *ip_hdr, > - struct rte_udp_hdr *udp_hdr, > - uint16_t pkt_data_len) > +setup_pkt_l4_ip_headers(uint8_t ip_proto, struct rte_ipv4_hdr *ip_hdr, > + union pkt_l4_hdr_t *l4_hdr, uint16_t pkt_data_len) > { > uint16_t *ptr16; > uint32_t ip_cksum; > uint16_t pkt_len; > + struct rte_udp_hdr *udp_hdr; > > - /* > - * Initialize UDP header. > - */ > - pkt_len = (uint16_t) (pkt_data_len + sizeof(struct rte_udp_hdr)); > - udp_hdr->src_port = rte_cpu_to_be_16(tx_udp_src_port); > - udp_hdr->dst_port = rte_cpu_to_be_16(tx_udp_dst_port); > - udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len); > - udp_hdr->dgram_cksum = 0; /* No UDP checksum. */ > + switch (ip_proto) { > + case IPPROTO_UDP: > + /* > + * Initialize UDP header. > + */ > + pkt_len = (uint16_t)(pkt_data_len + sizeof(struct rte_udp_hdr)); > + udp_hdr = &l4_hdr->udp; > + udp_hdr->src_port = rte_cpu_to_be_16(tx_l4_src_port); > + udp_hdr->dst_port = rte_cpu_to_be_16(tx_l4_dst_port); > + udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len); > + udp_hdr->dgram_cksum = 0; /* No UDP checksum. */ > + break; > + default: > + pkt_len = pkt_data_len; > + break; > + } > > /* > * Initialize IP header. > @@ -127,7 +138,7 @@ setup_pkt_udp_ip_headers(struct rte_ipv4_hdr *ip_hdr, > ip_hdr->type_of_service = 0; > ip_hdr->fragment_offset = 0; > ip_hdr->time_to_live = IP_DEFTTL; > - ip_hdr->next_proto_id = IPPROTO_UDP; > + ip_hdr->next_proto_id = ip_proto; > ip_hdr->packet_id = 0; > ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_len); > ip_hdr->src_addr = rte_cpu_to_be_32(tx_ip_src_addr); > @@ -162,27 +173,32 @@ update_pkt_header(struct rte_mbuf *pkt, uint32_t total_pkt_len) > { > struct rte_ipv4_hdr *ip_hdr; > struct rte_udp_hdr *udp_hdr; > - uint16_t pkt_data_len; > + uint16_t ip_data_len; > uint16_t pkt_len; > > - pkt_data_len = (uint16_t) (total_pkt_len - ( > + ip_data_len = (uint16_t) (total_pkt_len - ( > sizeof(struct rte_ether_hdr) + > - sizeof(struct rte_ipv4_hdr) + > - sizeof(struct rte_udp_hdr))); > - /* update UDP packet length */ > - udp_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_udp_hdr *, > - sizeof(struct rte_ether_hdr) + > - sizeof(struct rte_ipv4_hdr)); > - pkt_len = (uint16_t) (pkt_data_len + sizeof(struct rte_udp_hdr)); > - udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len); > + sizeof(struct rte_ipv4_hdr))); > > /* update IP packet length and checksum */ > ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_ipv4_hdr *, > sizeof(struct rte_ether_hdr)); > ip_hdr->hdr_checksum = 0; > - pkt_len = (uint16_t) (pkt_len + sizeof(struct rte_ipv4_hdr)); > + pkt_len = (uint16_t) (ip_data_len + sizeof(struct rte_ipv4_hdr)); > ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_len); > ip_hdr->hdr_checksum = rte_ipv4_cksum(ip_hdr); > + > + switch (ip_hdr->next_proto_id) { > + case IPPROTO_UDP: > + /* update UDP packet length */ > + udp_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_udp_hdr *, > + sizeof(struct rte_ether_hdr) + > + sizeof(struct rte_ipv4_hdr)); > + udp_hdr->dgram_len = RTE_CPU_TO_BE_16(ip_data_len); > + break; > + default: > + break; > + } > } > > static inline bool > @@ -193,8 +209,9 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > { > struct rte_mbuf *pkt_segs[RTE_MAX_SEGS_PER_PKT]; > struct rte_mbuf *pkt_seg; > - uint32_t nb_segs, pkt_len; > + uint32_t nb_segs, pkt_len, l4_hdr_size; > uint8_t i; > + struct rte_ipv4_hdr *ip_hdr; > > if (unlikely(tx_pkt_split == TX_PKT_SPLIT_RND)) > nb_segs = rte_rand() % tx_pkt_nb_segs + 1; > @@ -230,14 +247,14 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > copy_buf_to_pkt(eth_hdr, sizeof(*eth_hdr), pkt, 0); > copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt, > sizeof(struct rte_ether_hdr)); > + > + ip_hdr = rte_pktmbuf_mtod_offset(pkt, > + struct rte_ipv4_hdr *, > + sizeof(struct rte_ether_hdr)); > if (txonly_multi_flow) { > uint8_t ip_var = RTE_PER_LCORE(_ip_var); > - struct rte_ipv4_hdr *ip_hdr; > uint32_t addr; > > - ip_hdr = rte_pktmbuf_mtod_offset(pkt, > - struct rte_ipv4_hdr *, > - sizeof(struct rte_ether_hdr)); > /* > * Generate multiple flows by varying IP src addr. This > * enables packets are well distributed by RSS in > @@ -249,9 +266,17 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > ip_hdr->src_addr = rte_cpu_to_be_32(addr); > RTE_PER_LCORE(_ip_var) = ip_var; > } > - copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt, > - sizeof(struct rte_ether_hdr) + > - sizeof(struct rte_ipv4_hdr)); > + switch (ip_hdr->next_proto_id) { > + case IPPROTO_UDP: > + copy_buf_to_pkt(&pkt_l4_hdr.udp, sizeof(pkt_l4_hdr.udp), pkt, > + sizeof(struct rte_ether_hdr) + > + sizeof(struct rte_ipv4_hdr)); > + l4_hdr_size = sizeof(pkt_l4_hdr.udp); > + break; > + default: > + l4_hdr_size = 0; > + break; > + } > > if (unlikely(tx_pkt_split == TX_PKT_SPLIT_RND) || txonly_multi_flow) > update_pkt_header(pkt, pkt_len); > @@ -308,7 +333,7 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp, > copy_buf_to_pkt(×tamp_mark, sizeof(timestamp_mark), pkt, > sizeof(struct rte_ether_hdr) + > sizeof(struct rte_ipv4_hdr) + > - sizeof(pkt_udp_hdr)); > + l4_hdr_size); > } > /* > * Complete first mbuf of packet and append it to the > @@ -449,7 +474,8 @@ tx_only_begin(portid_t pi) > return -EINVAL; > } > > - setup_pkt_udp_ip_headers(&pkt_ip_hdr, &pkt_udp_hdr, pkt_data_len); > + setup_pkt_l4_ip_headers(IPPROTO_UDP, &pkt_ip_hdr, &pkt_l4_hdr, > + pkt_data_len); > 'pkt_data_len' is calculated as following, it is correct for this patch, but it will be wrong in next patch because UDP header size is used in calculation. Need to fix this code, either in this patch and make it protocol agnostic, or in next patch with protocol check. ` pkt_hdr_len = (uint16_t)(sizeof(struct rte_ether_hdr) + sizeof(struct rte_ipv4_hdr) + sizeof(struct rte_udp_hdr)); pkt_data_len = tx_pkt_length - pkt_hdr_len; `