From: Ferruh Yigit <ferruh.yigit@amd.com>
To: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,
Aman Singh <aman.deep.singh@intel.com>,
Yuying Zhang <yuying.zhang@intel.com>
Cc: dev@dpdk.org, Georgiy Levashov <georgiy.levashov@oktetlabs.ru>,
Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>
Subject: Re: [PATCH 1/2] app/testpmd: prepare to support TCP in Tx only mode
Date: Tue, 15 Nov 2022 12:32:56 +0000 [thread overview]
Message-ID: <e4e16dd2-6a2a-aa27-2aee-fa3772daf4b5@amd.com> (raw)
In-Reply-To: <eea5e9d3-592c-5d36-648b-b0ad13a3f536@oktetlabs.ru>
On 11/11/2022 8:36 AM, Andrew Rybchenko wrote:
> On 10/19/22 19:39, Ferruh Yigit wrote:
>> 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 <georgiy.levashov@oktetlabs.ru>
>>> Signed-off-by: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>
>>> Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>> ---
>>> 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.
>>
>
> The patch changes nothing externally. UDP is an layer 4
> protocol and I see no problems in storage of the the
> UDP port in the variable names tx_l4_dst_port.
>
Hi Andrew,
What you said is true for this patch, but the intentions of the patch is
preparation for TCP support.
So eventually "tx-udp" argument will be used to configure TCP flows,
which is confusing.
> It is just cosmetics patch with prepares code to
> further changes.
>
>> Also documentation [1] and help output [2] explicitly mentions from
>> this as UDP, please check `git grep "tx-udp"` output.
>>
>
> UDP is a layer 4 protocol. The variable could be named
> this way from the very beginning.
> Do you think we need separate variables for TCP and UDP?
> I think no.
Not separate variables, separate testpmd parameter for TCP.
>
>> One option is to update the argument name and documentation, even this
>> can break some exitsting test scripts etc..
>
> I think it is a bad option.
>
>> 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?
>>
>
> We can introduce tx-tcp parameter to decouple TCP and TSO
> in a separate patch and it should save the port number to
> tx_l4_dst_port variable.
> I simply skipped it for now since additoin of not used and
> not tested functionality is not good.
> If you think that we really need tx-tcp, I'll add it in v2.
> Please, confirm.
>
I think better to separate them. But I didn't get why it adds not tested
functionality?
>>
>> [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.
>
> Again, the goal of the patch is to do cosmetic changes to
> prepare to add new functionality in follow up patches.
> The patch does not add TCP support. So, I don't understand
> how it can be improved here. So, I'll fix the problem in the
> next patch when I have TCP support and corresponding branching.
> Thanks a lot for the catch.
>
>>
>> `
>> 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;
>> `
>>
>
next prev parent reply other threads:[~2022-11-15 12:33 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-17 14:41 [PATCH 0/2] app/testpmd: support TCP TSO " Andrew Rybchenko
2022-10-17 14:41 ` [PATCH 1/2] app/testpmd: prepare to support TCP " Andrew Rybchenko
2022-10-19 16:39 ` Ferruh Yigit
2022-11-11 8:36 ` Andrew Rybchenko
2022-11-11 8:54 ` Andrew Rybchenko
2022-11-15 12:32 ` Ferruh Yigit [this message]
2022-10-17 14:41 ` [PATCH 2/2] app/testpmd: support TCP TSO " Andrew Rybchenko
2022-10-19 16:41 ` Ferruh Yigit
2022-11-11 8:44 ` Andrew Rybchenko
2022-11-11 9:04 ` [PATCH v3 0/2] " Andrew Rybchenko
2022-11-11 9:04 ` [PATCH v3 1/2] app/testpmd: prepare to support TCP " Andrew Rybchenko
2022-11-11 9:04 ` [PATCH v3 2/2] app/testpmd: support TCP TSO " Andrew Rybchenko
2022-11-15 12:43 ` Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e4e16dd2-6a2a-aa27-2aee-fa3772daf4b5@amd.com \
--to=ferruh.yigit@amd.com \
--cc=aman.deep.singh@intel.com \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=dev@dpdk.org \
--cc=georgiy.levashov@oktetlabs.ru \
--cc=ivan.ilchenko@oktetlabs.ru \
--cc=yuying.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).