Index: B:/users/xalex/WoF-trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp =================================================================== --- B:/users/xalex/WoF-trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp (revision 2939) +++ B:/users/xalex/WoF-trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp (working copy) @@ -4154,7 +4154,8 @@ NDIS_STATUS status; uint32_t i, j = 1; ULONG DataOffset = 0; - uint32_t offset = sizeof(eth_hdr_t); + uint32_t EthHeaderOffset = sizeof(eth_hdr_t); + static const EthIPoIBHeaderOffset = EthHeaderOffset - sizeof(ipoib_hdr_t); PERF_DECLARE( SendCopy ); @@ -4216,27 +4217,27 @@ ****************************/ p_desc->send_wr[0].local_ds[j].vaddr = - p_sgl->Elements[0].Address.QuadPart + lso_header_size; + p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset + EthIPoIBHeaderOffset; p_desc->send_wr[0].local_ds[j].length = - p_sgl->Elements[0].Length - lso_header_size; + p_sgl->Elements[0].Length - lso_header_size - DataOffset - EthIPoIBHeaderOffset; p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey; /* Set the number of data segments. */ p_desc->send_wr[0].wr.num_ds = 1; return NDIS_STATUS_SUCCESS; } } - else while( offset ) + else while( EthHeaderOffset ) { - if( p_sgl->Elements[i].Length <= offset ) + if( p_sgl->Elements[i].Length <= EthHeaderOffset ) { - offset -= p_sgl->Elements[i++].Length; + EthHeaderOffset -= p_sgl->Elements[i++].Length; } else { p_desc->send_wr[0].local_ds[j].vaddr = - p_sgl->Elements[i].Address.QuadPart + offset + DataOffset; + p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset + DataOffset; p_desc->send_wr[0].local_ds[j].length = - p_sgl->Elements[i].Length - offset - DataOffset; + p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset; p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey; i++; j++;