ULONG
FrontendGetQueue(
- IN PXENVIF_FRONTEND Frontend,
- IN ULONG Value
+ IN PXENVIF_FRONTEND Frontend,
+ IN XENVIF_PACKET_HASH_ALGORITHM Algorithm,
+ IN ULONG Value
)
{
- ULONG Queue;
+ ULONG Queue;
- switch (Frontend->Hash.Algorithm) {
+ switch (Algorithm) {
case XENVIF_PACKET_HASH_ALGORITHM_NONE:
case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
Queue = Value % __FrontendGetNumQueues(Frontend);
break;
case XENVIF_PACKET_HASH_ALGORITHM_TOEPLITZ:
- Queue = Frontend->Hash.Mapping[Value % Frontend->Hash.Size];
+ Queue = (Frontend->Hash.Size != 0) ?
+ Frontend->Hash.Mapping[Value % Frontend->Hash.Size] :
+ 0;
break;
default:
extern ULONG
FrontendGetQueue(
- IN PXENVIF_FRONTEND Frontend,
- IN ULONG Index
+ IN PXENVIF_FRONTEND Frontend,
+ IN XENVIF_PACKET_HASH_ALGORITHM Algorithm,
+ IN ULONG Index
);
#endif // _XENVIF_FRONTEND_H
PUCHAR StartVa;
PXENVIF_PACKET_PAYLOAD Payload;
PXENVIF_PACKET_INFO Info;
+ XENVIF_PACKET_HASH_ALGORITHM Algorithm;
ULONG Value;
ULONG Index;
PXENVIF_TRANSMITTER_RING Ring;
(VOID) ParsePacket(StartVa, TransmitterPullup, Transmitter, Payload, Info);
- switch (Hash->Algorithm) {
+ Algorithm = Hash->Algorithm;
+
+ switch (Algorithm) {
case XENVIF_PACKET_HASH_ALGORITHM_NONE:
Value = __TransmitterHashPacket(Packet);
More = FALSE;
break;
}
- Index = FrontendGetQueue(Frontend, Value);
+ Index = FrontendGetQueue(Frontend, Algorithm, Value);
Ring = Transmitter->Ring[Index];
__TransmitterRingQueuePacket(Ring, Packet, More);