<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>