On Fri, Oct 22, 2021 at 12:01:41PM +0200, Hrvoje Popovski wrote:
> On 22.10.2021. 11:25, Jan Klemkow wrote:
> > this diff add hardware checksum offloading for the receive path of
> > ixl(4) interfaces.
> > 
> > Tested on:
> > ixl1 at pci3 dev 0 function 1 "Intel X710 SFP+" rev 0x02: port 1, FW 
> > 6.0.48442 API 1.7, msix, 8 queues, address 40:a6:b7:02:38:3d
> > 
> > OK?
> 
> I've applied this diff and i can't see anything regarding offload with
> ifconfig ixl hwfeatures?

Hi Hrvoje,

Thats because, you only see this flags, if the checksum offloading is
enabled for "sending".  I'm still working/debugging on the sending side.
Thus, I just send a diff with the receiving part for now.

You can see if its working for your card with the netstat(8) statistics.

# netstat -s | grep software-checksummed

These counters should not raise much on the receive side if you put some
traffic over the interface.

Thanks for testing,
Jan

> smc24# ifconfig ixl0 hwfeatures
> ixl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>         hwfeatures=10<VLAN_MTU> hardmtu 9712
>         lladdr 3c:fd:fe:04:0d:64
>         index 7 priority 0 llprio 3
>         media: Ethernet autoselect (10GSFP+Cu full-duplex)
>         status: active
>         inet 192.168.15.1 netmask 0xffffff00 broadcast 192.168.15.255
> 
> smc24# dmesg | grep ixl
> ixl0 at pci21 dev 0 function 0 "Intel X710 SFP+" rev 0x01: port 0, FW
> 8.2.64244 API 1.13, msix, 8 queues, address 3c:fd:fe:04:0d:64
> ixl1 at pci21 dev 0 function 1 "Intel X710 SFP+" rev 0x01: port 1, FW
> 8.2.64244 API 1.13, msix, 8 queues, address 3c:fd:fe:04:0d:66
> 
> > Index: dev/pci/if_ixl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ixl.c,v
> > retrieving revision 1.75
> > diff -u -p -r1.75 if_ixl.c
> > --- dev/pci/if_ixl.c        23 Jul 2021 00:29:14 -0000      1.75
> > +++ dev/pci/if_ixl.c        22 Oct 2021 09:20:59 -0000
> > @@ -1388,6 +1388,7 @@ static int    ixl_rxeof(struct ixl_softc *,
> >  static void        ixl_rxfill(struct ixl_softc *, struct ixl_rx_ring *);
> >  static void        ixl_rxrefill(void *);
> >  static int ixl_rxrinfo(struct ixl_softc *, struct if_rxrinfo *);
> > +static void        ixl_rx_checksum(struct mbuf *, uint64_t);
> >  
> >  #if NKSTAT > 0
> >  static void        ixl_kstat_attach(struct ixl_softc *);
> > @@ -3190,6 +3191,7 @@ ixl_rxeof(struct ixl_softc *sc, struct i
> >                                     m->m_pkthdr.csum_flags |= M_FLOWID;
> >                             }
> >  
> > +                           ixl_rx_checksum(m, word);
> >                             ml_enqueue(&ml, m);
> >                     } else {
> >                             ifp->if_ierrors++; /* XXX */
> > @@ -3320,6 +3322,23 @@ ixl_rxrinfo(struct ixl_softc *sc, struct
> >     free(ifr, M_TEMP, ixl_nqueues(sc) * sizeof(*ifr));
> >  
> >     return (rv);
> > +}
> > +
> > +static void
> > +ixl_rx_checksum(struct mbuf *m, uint64_t word)
> > +{
> > +   if (!ISSET(word, IXL_RX_DESC_L3L4P))
> > +           return;
> > +
> > +   if (ISSET(word, IXL_RX_DESC_IPE))
> > +           return;
> > +
> > +   m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
> > +
> > +   if (ISSET(word, IXL_RX_DESC_L4E))
> > +           return;
> > +
> > +   m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
> >  }
> >  
> >  static int

Reply via email to