Hi Konstantin,

On Tue, Sep 12, 2017 at 10:17:27PM +0800, Ananyev, Konstantin wrote:
> 
> 
> > -----Original Message-----
> > From: Ananyev, Konstantin
> > Sent: Tuesday, September 12, 2017 12:18 PM
> > To: Hu, Jiayu <jiayu...@intel.com>; dev@dpdk.org
> > Cc: Kavanagh, Mark B <mark.b.kavan...@intel.com>; Tan, Jianfeng 
> > <jianfeng....@intel.com>
> > Subject: RE: [PATCH v3 2/5] gso: add TCP/IPv4 GSO support
> > 
> > > result, when all of its GSOed segments are freed, the packet is freed
> > > automatically.
> > > diff --git a/lib/librte_gso/rte_gso.c b/lib/librte_gso/rte_gso.c
> > > index dda50ee..95f6ea6 100644
> > > --- a/lib/librte_gso/rte_gso.c
> > > +++ b/lib/librte_gso/rte_gso.c
> > > @@ -33,18 +33,53 @@
> > >
> > >  #include <errno.h>
> > >
> > > +#include <rte_log.h>
> > > +
> > >  #include "rte_gso.h"
> > > +#include "gso_common.h"
> > > +#include "gso_tcp4.h"
> > >
> > >  int
> > >  rte_gso_segment(struct rte_mbuf *pkt,
> > > -         struct rte_gso_ctx gso_ctx __rte_unused,
> > > +         struct rte_gso_ctx gso_ctx,
> > >           struct rte_mbuf **pkts_out,
> > >           uint16_t nb_pkts_out)
> > >  {
> > > + struct rte_mempool *direct_pool, *indirect_pool;
> > > + struct rte_mbuf *pkt_seg;
> > > + uint16_t gso_size;
> > > + uint8_t ipid_delta;
> > > + int ret = 1;
> > > +
> > >   if (pkt == NULL || pkts_out == NULL || nb_pkts_out < 1)
> > >           return -EINVAL;
> > >
> > > - pkts_out[0] = pkt;
> > > + if (gso_ctx.gso_size >= pkt->pkt_len ||
> > > +                 (pkt->packet_type & gso_ctx.gso_types) !=
> > > +                 pkt->packet_type) {
> > > +         pkts_out[0] = pkt;
> > > +         return ret;
> > > + }
> > > +
> > > + 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_INCREASE;
> > > +
> > > + if (is_ipv4_tcp(pkt->packet_type)) {
> > 
> > Probably we need here:
> > If (is_ipv4_tcp(pkt->packet_type)  && (gso_ctx->gso_types & 
> > DEV_TX_OFFLOAD_TCP_TSO) != 0) {...
> 
> Sorry, actually it probably should be:
> If (pkt->ol_flags & (PKT_TX_TCP_SEG | PKT_TX_IPV4) == PKT_TX_IPV4 &&
>       (gso_ctx->gso_types & DEV_TX_OFFLOAD_TCP_TSO) != 0) {...

I don't quite understand why the GSO library should be aware if the TSO
flag is set or not. Applications can query device TSO capability before
they call the GSO library. Do I misundertsand anything?

Additionally, we don't need to check if the packet is a TCP/IPv4 packet here?

Thanks,
Jiayu
> 
> Konstantin
> 
> > 
> > > +         ret = gso_tcp4_segment(pkt, gso_size, ipid_delta,
> > > +                         direct_pool, indirect_pool,
> > > +                         pkts_out, nb_pkts_out);
> > > + } else
> > > +         RTE_LOG(WARNING, GSO, "Unsupported packet type\n");
> > 
> > Shouldn't we do pkt_out[0] = pkt; here?
> > 
> > > +
> > > + if (ret > 1) {
> > > +         pkt_seg = pkt;
> > > +         while (pkt_seg) {
> > > +                 rte_mbuf_refcnt_update(pkt_seg, -1);
> > > +                 pkt_seg = pkt_seg->next;
> > > +         }
> > > + }
> > >
> > > - return 1;
> > > + return ret;
> > >  }
> > > --
> > > 2.7.4

Reply via email to