It's possible that a transmission invoked on one CPU may complete on another
before the transmission invocation as finished. Therefore, once we have queued
a NET_BUFFER for transmission we should not use it's metadata again (including
the 'next' pointer).
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
NET_BUFFER_DATA_OFFSET(NetBuffer) = Offset;
NET_BUFFER_DATA_LENGTH(NetBuffer) = Length;
NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer) = Offset;
+
+ ASSERT3P(NET_BUFFER_NEXT_NB(NetBuffer), ==, NULL);
} else {
NetBufferList = NdisAllocateNetBufferAndNetBufferList(Receiver->NetBufferListPool,
0,
NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
while (NetBuffer != NULL) {
+ PNET_BUFFER NetBufferListNext = NET_BUFFER_NEXT_NB(NetBuffer);
PVOID Cookie = NetBufferList;
XENVIF_PACKET_HASH Hash;
NTSTATUS status;
- ListReserved->Reference++;
+ InterlockedIncrement(&ListReserved->Reference);
Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_NONE;
break;
}
- NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer);
+ NetBuffer = NetBufferListNext;
}
NetBufferList = ListNext;