<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style><!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="Section1">
<p class="MsoNormal"><span style="color:#1F497D">LSO flow revision with important bugfixes</span><o:p></o:p></p>
<p class="MsoNormal">Signed off by: Alexander Naslednikov (xalex at mellanox.co.il)<o:p></o:p></p>
<p class="MsoNormal">Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp             (revision 3082)<o:p></o:p></p>
<p class="MsoNormal">+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp          (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -1264,7 +1264,7 @@<o:p></o:p></p>
<p class="MsoNormal">                                  if (p_adapter->params.LsoV1IPv4)<o:p></o:p></p>
<p class="MsoNormal">                                  {<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV1.IPv4.Encapsulation = ulEncapsulation;<o:p></o:p></p>
<p class="MsoNormal">-                                                p_offload->LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+                                               p_offload->LsoV1.IPv4.MaxOffLoadSize = MAX_LSO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV1.IPv4.MinSegmentCount = LSO_MIN_SEG_COUNT;<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;<o:p></o:p></p>
<p class="MsoNormal">@@ -1273,14 +1273,14 @@<o:p></o:p></p>
<p class="MsoNormal">                                  if (p_adapter->params.LsoV2IPv4)<o:p></o:p></p>
<p class="MsoNormal">                                  {<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV2.IPv4.Encapsulation = ulEncapsulation;<o:p></o:p></p>
<p class="MsoNormal">-                                                p_offload->LsoV2.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+                                               p_offload->LsoV2.IPv4.MaxOffLoadSize = MAX_LSO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV2.IPv4.MinSegmentCount = LSO_MIN_SEG_COUNT;<o:p></o:p></p>
<p class="MsoNormal">                                  }<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                                  if (p_adapter->params.LsoV2IPv6)<o:p></o:p></p>
<p class="MsoNormal">                                  {<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV2.IPv6.Encapsulation = ulEncapsulation;<o:p></o:p></p>
<p class="MsoNormal">-                                                p_offload->LsoV2.IPv6.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+                                               p_offload->LsoV2.IPv6.MaxOffLoadSize = MAX_LSO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV2.IPv6.MinSegmentCount = LSO_MIN_SEG_COUNT;<o:p></o:p></p>
<p class="MsoNormal">                                  <o:p></o:p></p>
<p class="MsoNormal">                                                  p_offload->LsoV2.IPv6.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;<o:p></o:p></p>
<p class="MsoNormal">@@ -1353,13 +1353,13 @@<o:p></o:p></p>
<p class="MsoNormal">                if (p_adapter->offload_cap.lso) {<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                p_offload->LsoV1.IPv4.Encapsulation = ulEncapsulation;<o:p></o:p></p>
<p class="MsoNormal">-                              p_offload->LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+                             p_offload->LsoV1.IPv4.MaxOffLoadSize = MAX_LSO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">                                p_offload->LsoV1.IPv4.MinSegmentCount = 2;<o:p></o:p></p>
<p class="MsoNormal">                                p_offload->LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;<o:p></o:p></p>
<p class="MsoNormal">                                p_offload->LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                p_offload->LsoV2.IPv4.Encapsulation = ulEncapsulation;<o:p></o:p></p>
<p class="MsoNormal">-                              p_offload->LsoV2.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+                             p_offload->LsoV2.IPv4.MaxOffLoadSize = MAX_LSO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">                                p_offload->LsoV2.IPv4.MinSegmentCount = 2;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                } else {<o:p></o:p></p>
<p class="MsoNormal">@@ -1861,7 +1861,7 @@<o:p></o:p></p>
<p class="MsoNormal">                // Even if offload is enabled, the packet size for mapping shouldn't change<o:p></o:p></p>
<p class="MsoNormal">                //<o:p></o:p></p>
<p class="MsoNormal">                //TODO bug ?<o:p></o:p></p>
<p class="MsoNormal">-              DmaDescription.MaximumPhysicalMapping = LARGE_SEND_OFFLOAD_SIZE + LSO_MAX_HEADER;<o:p></o:p></p>
<p class="MsoNormal">+             DmaDescription.MaximumPhysicalMapping = MAX_LSO_SIZE + LSO_MAX_HEADER;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                DmaDescription.ProcessSGListHandler = ipoib_process_sg_list;<o:p></o:p></p>
<p class="MsoNormal">                DmaDescription.SharedMemAllocateCompleteHandler = NULL;<o:p></o:p></p>
<p class="MsoNormal">Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp                (revision 3085)<o:p></o:p></p>
<p class="MsoNormal">+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp             (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -422,10 +422,10 @@<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> static NDIS_STATUS <o:p></o:p></p>
<p class="MsoNormal"> GetLsoHeaderSize(<o:p></o:p></p>
<p class="MsoNormal">-              IN                           PNET_BUFFER                   pNetBuffer,<o:p></o:p></p>
<p class="MsoNormal">+             IN OUT PNET_BUFFER                   pNetBuffer,<o:p></o:p></p>
<p class="MsoNormal">                IN                           LsoData                                *pLsoData,<o:p></o:p></p>
<p class="MsoNormal">-              OUT       UINT                                      *IndexOfData,<o:p></o:p></p>
<p class="MsoNormal">-              IN                           ipoib_hdr_t        *ipoib_hdr );<o:p></o:p></p>
<p class="MsoNormal">+             IN                           ipoib_hdr_t        *ipoib_hdr,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG                                                                                 TcpHeaderOffset );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> static NDIS_STATUS<o:p></o:p></p>
<p class="MsoNormal">@@ -1148,7 +1148,7 @@<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">                                else if( p_port->p_adapter->params.lso )<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">-                                              max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class="MsoNormal">+                                             max_phys_mapping = MAX_LSO_SIZE;<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">                                else<o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">@@ -6312,7 +6312,6 @@<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">                NDIS_STATUS                                    status;<o:p></o:p></p>
<p class="MsoNormal">                LsoData                                                                                                                                TheLsoData;<o:p></o:p></p>
<p class="MsoNormal">-              UINT                                                                                                                      IndexOfData = 0;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -6327,13 +6326,12 @@<o:p></o:p></p>
<p class="MsoNormal">                status = GetLsoHeaderSize(<o:p></o:p></p>
<p class="MsoNormal">                                FirstBuffer, <o:p></o:p></p>
<p class="MsoNormal">                                &TheLsoData, <o:p></o:p></p>
<p class="MsoNormal">-                              &IndexOfData,<o:p></o:p></p>
<p class="MsoNormal">-                              &p_port->hdr[hdr_idx] );<o:p></o:p></p>
<p class="MsoNormal">+                             &p_port->hdr[hdr_idx],<o:p></o:p></p>
<p class="MsoNormal">+                             p_lso_info->LsoV1Transmit.TcpHeaderOffset );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              if ((status != NDIS_STATUS_SUCCESS ) || <o:p>
</o:p></p>
<p class="MsoNormal">-                              (TheLsoData.FullBuffers != TheLsoData.UsedBuffers))
<o:p></o:p></p>
<p class="MsoNormal">+             if ( (status != NDIS_STATUS_SUCCESS ) ) <o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT( status == NDIS_STATUS_SUCCESS );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                                IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -6343,17 +6341,17 @@<o:p></o:p></p>
<p class="MsoNormal">                                }<o:p></o:p></p>
<p class="MsoNormal">                                return status;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( TheLsoData.LsoHeaderSize > 0 );<o:p></o:p></p>
<p class="MsoNormal">                                <o:p></o:p></p>
<p class="MsoNormal">                // Tell NDIS how much we will send.<o:p></o:p></p>
<p class="MsoNormal">-              if(p_lso_info->LsoV1Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>
<p class="MsoNormal">-    {<o:p></o:p></p>
<p class="MsoNormal">-              s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>
<p class="MsoNormal">+             if( p_lso_info->LsoV1Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                                             s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">                p_desc->send_wr[0].wr.dgrm.ud.mss = mss;<o:p></o:p></p>
<p class="MsoNormal">-              p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;<o:p></o:p></p>
<p class="MsoNormal">-              p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize ;//lso_header_size;
<o:p></o:p></p>
<p class="MsoNormal">+             p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers.pData;<o:p></o:p></p>
<p class="MsoNormal">+             p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize ;<o:p></o:p></p>
<p class="MsoNormal">                p_desc->send_wr[0].wr.dgrm.ud.remote_qp = s_buf->p_endpt->qpn;<o:p></o:p></p>
<p class="MsoNormal">                p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class="MsoNormal">                p_desc->send_wr[0].wr.dgrm.ud.h_av = s_buf->p_endpt->h_av;<o:p></o:p></p>
<p class="MsoNormal">@@ -9054,12 +9052,11 @@<o:p></o:p></p>
<p class="MsoNormal">     The routine process the packet and returns LSO information<o:p></o:p></p>
<p class="MsoNormal">     <o:p></o:p></p>
<p class="MsoNormal"> Arguments:<o:p></o:p></p>
<p class="MsoNormal">-    pNetBuffer - a pointer to the first net buffer object of the packet<o:p></o:p></p>
<p class="MsoNormal">-    TcpHeaderOffset - offset to the begining of the TCP header in the packet<o:p></o:p></p>
<p class="MsoNormal">-    pLsoData - pointer to LsoData object in which the routine returns the LSO information<o:p></o:p></p>
<p class="MsoNormal">-    pHeaderSize - pointer to ULONG object in which the header size is returned<o:p></o:p></p>
<p class="MsoNormal">-    IndexOfData - <o:p></o:p></p>
<p class="MsoNormal">-             <o:p></o:p></p>
<p class="MsoNormal">+             pNetBuffer - a pointer to the first net buffer object of the packet<o:p></o:p></p>
<p class="MsoNormal">+             pLsoData - pointer to LsoData object in which the routine returns the LSO information<o:p></o:p></p>
<p class="MsoNormal">+             ipoib_hdr - pointer to preallocated IPoIB hdr<o:p></o:p></p>
<p class="MsoNormal">+             TcpHeaderOffset - offset to the begining of the TCP header in the packet<o:p></o:p></p>
<p class="MsoNormal">+                                             <o:p></o:p></p>
<p class="MsoNormal"> Return Value:<o:p></o:p></p>
<p class="MsoNormal">      NDIS_STATUS   <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">@@ -9067,184 +9064,125 @@<o:p></o:p></p>
<p class="MsoNormal">     called at DISPATCH level<o:p></o:p></p>
<p class="MsoNormal"> --*/<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-NDIS_STATUS GetLsoHeaderSize(<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+NDIS_STATUS <o:p></o:p></p>
<p class="MsoNormal">+GetLsoHeaderSize(<o:p></o:p></p>
<p class="MsoNormal">                IN OUT PNET_BUFFER                   pNetBuffer,<o:p></o:p></p>
<p class="MsoNormal">                IN                           LsoData                                *pLsoData,<o:p></o:p></p>
<p class="MsoNormal">-              OUT       UINT                                      *IndexOfData,<o:p></o:p></p>
<p class="MsoNormal">-              IN                           ipoib_hdr_t        *ipoib_hdr )<o:p></o:p></p>
<p class="MsoNormal">+             IN                           ipoib_hdr_t        *ipoib_hdr,<o:p></o:p></p>
<p class="MsoNormal">+             ULONG                                                                                 TcpHeaderOffset<o:p></o:p></p>
<p class="MsoNormal">+             )<o:p></o:p></p>
<p class="MsoNormal"> {<o:p></o:p></p>
<p class="MsoNormal">-              UINT                      CurrLength;<o:p></o:p></p>
<p class="MsoNormal">-              PUCHAR                               pSrc;<o:p></o:p></p>
<p class="MsoNormal">-              PUCHAR                               pCopiedData = pLsoData->coppied_data;<o:p></o:p></p>
<p class="MsoNormal">-              ip_hdr_t              UNALIGNED  *IpHdr;<o:p></o:p></p>
<p class="MsoNormal">-              tcp_hdr_t            UNALIGNED *TcpHdr;<o:p></o:p></p>
<p class="MsoNormal">-              uint16_t               TcpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-              uint16_t               IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-              uint16_t               IpOffset;<o:p></o:p></p>
<p class="MsoNormal">-              INT                                         FullBuffers = 0;<o:p></o:p></p>
<p class="MsoNormal">-              PMDL                    pMDL;<o:p></o:p></p>
<p class="MsoNormal">-              NDIS_STATUS    status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-#define IP_OFFSET 14;<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-              // This Flag indicates the way we gets the headers<o:p></o:p></p>
<p class="MsoNormal">-              // RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer
<o:p></o:p></p>
<p class="MsoNormal">-              // in sequence.<o:p></o:p></p>
<p class="MsoNormal">-              //<o:p></o:p></p>
<p class="MsoNormal">-              boolean_t                                           IsRegularFlow = TRUE;<o:p></o:p></p>
<p class="MsoNormal">+             static const uint16_t coEthHeaderSize(14); <o:p>
</o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              const uint16_t                   ETH_OFFSET = IP_OFFSET;
<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              pLsoData->LsoHeaderSize = 0;<o:p></o:p></p>
<p class="MsoNormal">-              IpOffset = IP_OFFSET; //(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></p>
<p class="MsoNormal">-              *IndexOfData = 0;<o:p></o:p></p>
<p class="MsoNormal">+             IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></p>
<p class="MsoNormal">-              NdisQueryMdl(pMDL, &pSrc, &CurrLength, NormalPagePriority);<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              if (pSrc == NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                              IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("Error processing packets\n") );<o:p></o:p></p>
<p class="MsoNormal">-                              return status;<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(TcpHeaderOffset > 0);<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT(pNetBuffer != NULL);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             PUCHAR pSrc = NULL;<o:p></o:p></p>
<p class="MsoNormal">+             bool fAlreadyCopied = false;<o:p></o:p></p>
<p class="MsoNormal">+             PUCHAR pCopiedData = pLsoData->coppied_data;<o:p></o:p></p>
<p class="MsoNormal">+             UINT CurrLength = 0;<o:p></o:p></p>
<p class="MsoNormal">+             ULONG DataOffset = NET_BUFFER_CURRENT_MDL_OFFSET( pNetBuffer );<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             PMDL pMDL = NET_BUFFER_CURRENT_MDL( pNetBuffer );<o:p></o:p></p>
<p class="MsoNormal">+             NdisQueryMdl( pMDL, &pSrc, &CurrLength, NormalPagePriority );<o:p></o:p></p>
<p class="MsoNormal">+             if (pSrc == NULL) <o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("NdisQueryMdl failed\n") );<o:p></o:p></p>
<p class="MsoNormal">+                             return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              ULONG DataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">                pSrc += DataOffset;<o:p></o:p></p>
<p class="MsoNormal">                CurrLength -= DataOffset;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-              // We start by looking for the ethernet and the IP<o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength < ETH_OFFSET) {<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT ( CurrLength >= ETH_OFFSET );<o:p></o:p></p>
<p class="MsoNormal">-                              IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("CurrLength < ETH_OFFSET\n"));<o:p></o:p></p>
<p class="MsoNormal">-                              return status;<o:p></o:p></p>
<p class="MsoNormal">+             if( CurrLength < TcpHeaderOffset )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             //<o:p></o:p></p>
<p class="MsoNormal">+                             // We assume that the ETH and IP header exist in first segment<o:p></o:p></p>
<p class="MsoNormal">+                             //<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT( CurrLength >= TcpHeaderOffset );<o:p></o:p></p>
<p class="MsoNormal">+                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
<o:p></o:p></p>
<p class="MsoNormal">+                                             ("Error processing packets."<o:p></o:p></p>
<p class="MsoNormal">+                                             "The ETH & IP headers are divided into multiple segments\n") );<o:p></o:p></p>
<p class="MsoNormal">+                             return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              //pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength == ETH_OFFSET) {        <o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">-                              IsRegularFlow = FALSE;       
<o:p></o:p></p>
<p class="MsoNormal">-                              memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></p>
<p class="MsoNormal">-                              pCopiedData += ETH_OFFSET;       
<o:p></o:p></p>
<p class="MsoNormal">-                              FullBuffers++;<o:p></o:p></p>
<p class="MsoNormal">-                              // First buffer was only ethernet<o:p></o:p></p>
<p class="MsoNormal">-                              pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>
<p class="MsoNormal">-        NdisQueryMdl( NET_BUFFER_CURRENT_MDL(pNetBuffer),<o:p></o:p></p>
<p class="MsoNormal">-                                                                                &pSrc,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                &CurrLength,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                NormalPagePriority );<o:p></o:p></p>
<p class="MsoNormal">-                              if( pSrc == NULL )<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if ( CurrLength == TcpHeaderOffset )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT( CurrLength > TcpHeaderOffset );<o:p></o:p></p>
<p class="MsoNormal">+                             memcpy( pCopiedData, pSrc , TcpHeaderOffset );<o:p></o:p></p>
<p class="MsoNormal">+                             pCopiedData += TcpHeaderOffset;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             fAlreadyCopied = true;<o:p></o:p></p>
<p class="MsoNormal">+                             pNetBuffer = NET_BUFFER_NEXT_NB( pNetBuffer );<o:p></o:p></p>
<p class="MsoNormal">+                             NdisQueryMdl( NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, NormalPagePriority);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+                             if ( pSrc == NULL ) <o:p></o:p></p>
<p class="MsoNormal">                                {<o:p></o:p></p>
<p class="MsoNormal">-                                              IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">-                                                              ("NdisQueryMdl failed\n") );<o:p></o:p></p>
<p class="MsoNormal">-                                              return status;<o:p></o:p></p>
<p class="MsoNormal">+                                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("NdisQueryMdl failed\n") );<o:p></o:p></p>
<p class="MsoNormal">+                                             return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class="MsoNormal">                    }<o:p></o:p></p>
<p class="MsoNormal">+                             // BUGBUG: If we do reach here, make sure that  pLsoData->LsoBuffers.pData will be set correctly.<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                else<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">-                              // This is ETH + IP together (at least)<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class="MsoNormal">-                              <o:p></o:p></p>
<p class="MsoNormal">                                //IMPORTANT: we de-facto replace ETH header by IPoIB header here<o:p></o:p></p>
<p class="MsoNormal">                                //TODO: This is not good practice to change data we got from NDIS<o:p></o:p></p>
<p class="MsoNormal">-                              memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class="MsoNormal">+                             pLsoData->LsoBuffers.pData = pSrc + (coEthHeaderSize - sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class="MsoNormal">+                             memcpy ( pLsoData->LsoBuffers.pData, ipoib_hdr, sizeof (ipoib_hdr_t) );<o:p></o:p></p>
<p class="MsoNormal">+                             pLsoData->LsoHeaderSize = TcpHeaderOffset - (coEthHeaderSize - sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class="MsoNormal">                                <o:p></o:p></p>
<p class="MsoNormal">-                              CurrLength -= ETH_OFFSET;<o:p></o:p></p>
<p class="MsoNormal">-                              pSrc = pSrc + ETH_OFFSET;<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);<o:p></o:p></p>
<p class="MsoNormal">+                             CurrLength -= TcpHeaderOffset;<o:p></o:p></p>
<p class="MsoNormal">+                             pSrc += TcpHeaderOffset;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              // we should now be having at least the size of ethernet data<o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></p>
<p class="MsoNormal">-                              IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("CurrLength < sizeof (ip_hdr_t)\n"));<o:p></o:p></p>
<p class="MsoNormal">-                              return status;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if ( CurrLength < sizeof(tcp_hdr_t) ) <o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT( CurrLength >= sizeof(tcp_hdr_t) );<o:p></o:p></p>
<p class="MsoNormal">+                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
<o:p></o:p></p>
<p class="MsoNormal">+                                             ("Error processing packets"<o:p></o:p></p>
<p class="MsoNormal">+                                             "The buffer is too small to contain TCP header\n") );<o:p></o:p></p>
<p class="MsoNormal">+                             return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></p>
<p class="MsoNormal">-              IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></p>
<p class="MsoNormal">-              ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></p>
<p class="MsoNormal">-              if( CurrLength < IpHeaderLen )<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             //<o:p></o:p></p>
<p class="MsoNormal">+             // We found the TCP header<o:p></o:p></p>
<p class="MsoNormal">+             //<o:p></o:p></p>
<p class="MsoNormal">+             tcp_hdr_t UNALIGNED* TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></p>
<p class="MsoNormal">+             uint16_t TcpHeaderLen = TCP_HEADER_LENGTH( TcpHdr );<o:p></o:p></p>
<p class="MsoNormal">+             if (CurrLength < TcpHeaderLen)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">-                              IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("Error processing packets\n") );<o:p></o:p></p>
<p class="MsoNormal">-                              return status;<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT( CurrLength >= sizeof(tcp_hdr_t) );<o:p></o:p></p>
<p class="MsoNormal">+                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
<o:p></o:p></p>
<p class="MsoNormal">+                                             ("Error processing packets"<o:p></o:p></p>
<p class="MsoNormal">+                                             "The buffer is too small to contain TCP data\n") );<o:p></o:p></p>
<p class="MsoNormal">+                             return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-              // We now start to find where the TCP header starts<o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength == IpHeaderLen) {<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoNormal">-                              // two options : <o:p></o:p></p>
<p class="MsoNormal">-                              // if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers<o:p></o:p></p>
<p class="MsoNormal">-                              // if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer
<o:p></o:p></p>
<p class="MsoNormal">-                              // TCP will start at next buffer<o:p></o:p></p>
<p class="MsoNormal">-                              if(IsRegularFlow){<o:p></o:p></p>
<p class="MsoNormal">-                                              memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></p>
<p class="MsoNormal">-                                              pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></p>
<p class="MsoNormal">-                              } else {<o:p></o:p></p>
<p class="MsoNormal">-                                              memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></p>
<p class="MsoNormal">-                                              pCopiedData += IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-                              FullBuffers++;<o:p></o:p></p>
<p class="MsoNormal">-                              IsRegularFlow = FALSE;<o:p></o:p></p>
<p class="MsoNormal">-                              pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>
<p class="MsoNormal">-                              NdisQueryMdl( NET_BUFFER_CURRENT_MDL(pNetBuffer),<o:p></o:p></p>
<p class="MsoNormal">-                                                                                &pSrc,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                &CurrLength,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                NormalPagePriority );<o:p></o:p></p>
<p class="MsoNormal">-                              if (pSrc == NULL) {<o:p></o:p></p>
<p class="MsoNormal">-                                              IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">-                                                              ("NdisQueryMdl failed\n") );<o:p></o:p></p>
<p class="MsoNormal">-                                              return status;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-              } else {<o:p></o:p></p>
<p class="MsoNormal">-                              // if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same buffer.<o:p></o:p></p>
<p class="MsoNormal">-                              // if(IsRegularFlow = FALSE ) ==> ETH in one buffer , IP+TCP together<o:p></o:p></p>
<p class="MsoNormal">-                              // in the same buffer<o:p></o:p></p>
<p class="MsoNormal">-                              if (IsRegularFlow) {            <o:p></o:p></p>
<p class="MsoNormal">-                                              pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-                              } else {            <o:p></o:p></p>
<p class="MsoNormal">-                                              memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></p>
<p class="MsoNormal">-                                              pCopiedData += IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-                              }<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              CurrLength -= IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-                              pSrc = pSrc + IpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">+             pLsoData->LsoHeaderSize += TcpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">+             if ( pLsoData->LsoHeaderSize > LSO_MAX_HEADER )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">+                             ASSERT(pLsoData->LsoBuffers.Len <= LSO_MAX_HEADER);<o:p></o:p></p>
<p class="MsoNormal">+                                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
<o:p></o:p></p>
<p class="MsoNormal">+                                             ("Error processing packets.LsoHeaderSize > LSO_MAX_HEADER\n") );<o:p></o:p></p>
<p class="MsoNormal">+                             return NDIS_STATUS_DEVICE_FAILED;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength < sizeof (tcp_hdr_t)) {<o:p></o:p></p>
<p class="MsoNormal">-                              IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class="MsoNormal">-                                              ("Error porcessing packets\n") );<o:p></o:p></p>
<p class="MsoNormal">-                              return status;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              // We have finaly found the TCP header<o:p></o:p></p>
<p class="MsoNormal">-              TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></p>
<p class="MsoNormal">-              TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></p>
<p class="MsoNormal">-              <o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength < TcpHeaderLen) {<o:p></o:p></p>
<p class="MsoNormal">-                              IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));<o:p></o:p></p>
<p class="MsoNormal">-                              return status;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              pLsoData->LsoHeaderSize =  pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-              if(IsRegularFlow){<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              else{<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if( fAlreadyCopied )<o:p></o:p></p>
<p class="MsoNormal">+             {<o:p></o:p></p>
<p class="MsoNormal">                                memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></p>
<p class="MsoNormal">                                pCopiedData += TcpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">+                             pLsoData->LsoBuffers.pData = pLsoData->coppied_data;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">-              if (CurrLength == TcpHeaderLen) {<o:p></o:p></p>
<p class="MsoNormal">-                              FullBuffers++;<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></p>
<p class="MsoNormal">-                              *IndexOfData = FullBuffers ;<o:p></o:p></p>
<p class="MsoNormal">-              } else {<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></p>
<p class="MsoNormal">-                              *IndexOfData = FullBuffers - 1;<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">-              pLsoData->FullBuffers = FullBuffers; <o:p></o:p></p>
<p class="MsoNormal">-              if (!IsRegularFlow){<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></p>
<p class="MsoNormal">-                              pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;<o:p></o:p></p>
<p class="MsoNormal">-                              ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></p>
<p class="MsoNormal">-              }<o:p></o:p></p>
<p class="MsoNormal">+#if DBG              <o:p></o:p></p>
<p class="MsoNormal">+             pLsoData->LsoBuffers.Len = <o:p></o:p></p>
<p class="MsoNormal">+                             TcpHeaderOffset + TcpHeaderLen - (coEthHeaderSize - sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class="MsoNormal">+             ASSERT( pLsoData->LsoBuffers.Len <= MAX_LSO_SIZE );<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class="MsoNormal">                return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Index: ulp/ipoib_NDIS6_CM/kernel/offload.h<o:p></o:p></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- ulp/ipoib_NDIS6_CM/kernel/offload.h           (revision 3080)<o:p></o:p></p>
<p class="MsoNormal">+++ ulp/ipoib_NDIS6_CM/kernel/offload.h        (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -26,22 +26,20 @@<o:p></o:p></p>
<p class="MsoNormal"> //<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> #define LSO_MAX_HEADER 136<o:p></o:p></p>
<p class="MsoNormal">-#define LARGE_SEND_OFFLOAD_SIZE 60000 <o:p></o:p></p>
<p class="MsoNormal">+#define MAX_LSO_SIZE 60000 <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> // This struct is being used in order to pass data about the GSO buffers if they<o:p></o:p></p>
<p class="MsoNormal"> // are present<o:p></o:p></p>
<p class="MsoNormal">-typedef struct LsoBuffer_ {<o:p></o:p></p>
<p class="MsoNormal">+struct LsoBuffer {<o:p></o:p></p>
<p class="MsoNormal">     PUCHAR pData;<o:p></o:p></p>
<p class="MsoNormal">     UINT Len;<o:p></o:p></p>
<p class="MsoNormal">-} LsoBuffer;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-typedef struct LsoData_ {<o:p></o:p></p>
<p class="MsoNormal">-    LsoBuffer LsoBuffers[1];<o:p></o:p></p>
<p class="MsoNormal">-    UINT UsedBuffers;<o:p></o:p></p>
<p class="MsoNormal">-    UINT FullBuffers;<o:p></o:p></p>
<p class="MsoNormal">+struct LsoData {<o:p></o:p></p>
<p class="MsoNormal">+    LsoBuffer LsoBuffers;<o:p></o:p></p>
<p class="MsoNormal">     UINT LsoHeaderSize;<o:p></o:p></p>
<p class="MsoNormal">-    UINT IndexOfData;<o:p></o:p></p>
<p class="MsoNormal">     UCHAR coppied_data[LSO_MAX_HEADER];<o:p></o:p></p>
<p class="MsoNormal">-} LsoData;<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"><b>Alexander (XaleX) Naslednikov<o:p></o:p></b></p>
<p class="MsoNormal"><b>SW Networking Team<o:p></o:p></b></p>
<p class="MsoNormal"><b>Mellanox Technologies<o:p></o:p></b></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>