>From: Ananyev, Konstantin
>Sent: Wednesday, October 4, 2017 3:49 PM
>To: Kavanagh, Mark B <mark.b.kavan...@intel.com>; dev@dpdk.org
>Cc: Hu, Jiayu <jiayu...@intel.com>; Tan, Jianfeng <jianfeng....@intel.com>;
>Yigit, Ferruh <ferruh.yi...@intel.com>; tho...@monjalon.net
>Subject: RE: [PATCH v6 2/6] gso: add TCP/IPv4 GSO support
>
>> >>  int
>> >>  rte_gso_segment(struct rte_mbuf *pkt,
>> >> @@ -41,12 +46,53 @@
>> >>           struct rte_mbuf **pkts_out,
>> >>           uint16_t nb_pkts_out)
>> >>  {
>> >> + struct rte_mempool *direct_pool, *indirect_pool;
>> >> + struct rte_mbuf *pkt_seg;
>> >> + uint64_t ol_flags;
>> >> + uint16_t gso_size;
>> >> + uint8_t ipid_delta;
>> >> + int ret = 1;
>> >> +
>> >>   if (pkt == NULL || pkts_out == NULL || gso_ctx == NULL ||
>> >>                   nb_pkts_out < 1)
>> >>           return -EINVAL;
>> >>
>> >> - pkt->ol_flags &= (~PKT_TX_TCP_SEG);
>> >> - pkts_out[0] = pkt;
>> >> + if ((gso_ctx->gso_size >= pkt->pkt_len) || (gso_ctx->gso_types &
>> >> +                         DEV_TX_OFFLOAD_TCP_TSO) !=
>> >> +                 gso_ctx->gso_types) {
>> >> +         pkt->ol_flags &= (~PKT_TX_TCP_SEG);
>> >> +         pkts_out[0] = pkt;
>> >> +         return 1;
>> >> + }
>> >> +
>> >> + direct_pool = gso_ctx->direct_pool;
>> >> + indirect_pool = gso_ctx->indirect_pool;
>> >> + gso_size = gso_ctx->gso_size;
>> >> + ipid_delta = (gso_ctx->ipid_flag != RTE_GSO_IPID_FIXED);
>> >> + ol_flags = pkt->ol_flags;
>> >> +
>> >> + if (IS_IPV4_TCP(pkt->ol_flags)) {
>> >> +         pkt->ol_flags &= (~PKT_TX_TCP_SEG);
>> >> +         ret = gso_tcp4_segment(pkt, gso_size, ipid_delta,
>> >> +                         direct_pool, indirect_pool,
>> >> +                         pkts_out, nb_pkts_out);
>> >> + } else {
>> >> +         pkt->ol_flags &= (~PKT_TX_TCP_SEG);
>> >
>> >Not sure why do you clean this flag if you don't support that packet type
>> >and no action was perfomed?
>> >Suppose you have a mix ipv4 and ipv6 packets - gso lib would do ipv4 and
>> >someone else
>> >(HW?) can do ipv4 segmentation.
>>
>> I can't say for definite, since I didn't implement this change. However, I
>can only presume that the assumption here is that since
>> segmentation is being done in S/W that the underlying H/W does not support
>TSO.
>> Since the underlying HW can't segment the packet in HW, we should clear the
>flag; otherwise, if an mbuf marked for TCP segmentation is
>> passed to the driver of a NIC that does not support/understand that feature,
>the behavior is undefined.
>> Is this a fair assumption in your opinion, or is it the case that the packet
>would simply be transmitted un-segmented in that case, and so we
>> shouldn't clear the flag?
>
>Yes, I think if we shouldn't clear the flag if we didn't do any segmentation
>(we just encounter a packet type that we don't support).
>Konstantin

Okay, thanks for clarifying - I'll update the code accordingly.
-Mark

>
>>
>> Thanks again,
>> Mark
>>
>> >BTW, did you notice that building of shared target fails?
>> >Konstantin
>>
>> I didn't, but I'll take a look right now - thanks for the catch!
>>
>> >
>> >
>> >> +         pkts_out[0] = pkt;
>> >> +         RTE_LOG(WARNING, GSO, "Unsupported packet type\n");
>> >> +         return 1;
>> >> + }
>> >> +
>> >> + if (ret > 1) {
>> >> +         pkt_seg = pkt;
>> >> +         while (pkt_seg) {
>> >> +                 rte_mbuf_refcnt_update(pkt_seg, -1);
>> >> +                 pkt_seg = pkt_seg->next;
>> >> +         }
>> >> + } else if (ret < 0) {
>> >> +         /* Revert the ol_flags in the event of failure. */
>> >> +         pkt->ol_flags = ol_flags;
>> >> + }
>> >>
>> >> - return 1;
>> >> + return ret;
>> >>  }
>> >> --
>> >> 1.9.3

Reply via email to