IN ipoib_send_NB_SG * s_buf,\r
IN UINT lso_header_size)\r
{\r
- ULONG tot_len = 0;\r
+ ULONG tot_len = 0;\r
+ uint32_t offset = \r
+ (lso_header_size ? EthIPoIBHeaderOffset : EthHeaderOffset );\r
+ int seg_index = lso_header_size ? 0 : 1;\r
\r
IPOIB_ENTER( IPOIB_DBG_SEND );\r
\r
ASSERT(tot_len > lso_header_size);\r
return NDIS_STATUS_FAILURE;\r
}\r
- //TODO Do not copy the ETH header \r
+ \r
/* Setup the work request. */\r
- int seg_index = lso_header_size ? 0 : 1;\r
-\r
p_desc->send_wr[0].local_ds[seg_index].vaddr = cl_get_physaddr(\r
- ((uint8_t*)s_buf->p_send_buf) + lso_header_size );\r
- p_desc->send_wr[0].local_ds[seg_index].length = tot_len - lso_header_size;\r
+ ((uint8_t*)s_buf->p_send_buf) + lso_header_size + offset );\r
+ p_desc->send_wr[0].local_ds[seg_index].length = tot_len - lso_header_size - offset;\r
p_desc->send_wr[0].local_ds[seg_index].lkey = p_port->ib_mgr.lkey;\r
p_desc->send_wr[0].wr.num_ds = seg_index+1;\r
\r
NDIS_STATUS status;\r
uint32_t i, j = 1;\r
ULONG DataOffset = 0; \r
- uint32_t EthHeaderOffset = sizeof(eth_hdr_t);\r
- static const EthIPoIBHeaderOffset = EthHeaderOffset - sizeof(ipoib_hdr_t);\r
- \r
+ uint32_t offset = EthHeaderOffset;\r
PERF_DECLARE( SendCopy );\r
\r
IPOIB_ENTER( IPOIB_DBG_SEND );\r
return NDIS_STATUS_FAILURE;\r
}\r
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;\r
-\r
/* TODO: Copy only essential data\r
That is, copy only 2 chunks of ETH header if it contained in several\r
first SG elements.\r
return NDIS_STATUS_SUCCESS;\r
} \r
}\r
- else while( EthHeaderOffset )\r
+ else while( offset )\r
{\r
- if( p_sgl->Elements[i].Length <= EthHeaderOffset )\r
+ if( p_sgl->Elements[i].Length <= offset )\r
{\r
- EthHeaderOffset -= p_sgl->Elements[i++].Length;\r
+ offset -= p_sgl->Elements[i++].Length;\r
}\r
else\r
{\r
p_desc->send_wr[0].local_ds[j].vaddr =\r
- p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset + DataOffset;\r
+ p_sgl->Elements[i].Address.QuadPart + offset + DataOffset;\r
p_desc->send_wr[0].local_ds[j].length =\r
- p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;\r
+ p_sgl->Elements[i].Length - offset - DataOffset;\r
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;\r
if( p_desc->send_wr[0].local_ds[j].length > 0 )\r
{\r
* resv\r
* Reserved portion of IPoIB header.\r
*********/\r
+static const uint32_t EthHeaderOffset = sizeof(eth_hdr_t);\r
+\r
+//We reuse eth header to put there IPoIB header for LSO Net Buffers.\r
+// Thus, when copying such NB one need to jump over the appropriate offset\r
+static const uint32_t EthIPoIBHeaderOffset = EthHeaderOffset - sizeof(ipoib_hdr_t);\r
\r
typedef struct _ipoib_arp_pkt\r
{\r
} PACK_SUFFIX ipoib_arp_pkt_t;\r
\r
\r
+\r
/****s* IPoIB Driver/ipoib_pkt_t\r
* NAME\r
* ipoib_pkt_t\r