Only write the complete changes to the xenstore MAC address table. There
is no need to write the complete table for each addition or removal,
when additions and removals are processed in a single update.
Pushes the responsibility for writing the MAC table to
FrontendSetMulticastAddresses() once all changes are made, instead of
for each call to MacAddMulticastAddress() or MacRemoveMulticastAddress()
Signed-off-by: Owen Smith <owen.smith@citrix.com>
ULONG MulticastCount;
ULONG MulticastIndex;
ULONG Index;
+ BOOLEAN Change;
NTSTATUS status;
Transmitter = FrontendGetTransmitter(Frontend);
} else
MulticastAddress = NULL;
+ Change = FALSE;
for (Index = 0; Index < Count; Index++) {
BOOLEAN Found;
(VOID) TransmitterQueueMulticastControl(Transmitter,
&Address[Index],
TRUE);
+ Change = TRUE;
}
}
FALSE);
(VOID) MacRemoveMulticastAddress(Mac,
&MulticastAddress[MulticastIndex]);
+ Change = TRUE;
}
if (MulticastAddress != NULL)
__FrontendFree(MulticastAddress);
+ if (Change)
+ (VOID) MacDumpAddressTable(Mac);
+
KeLowerIrql(Irql);
return STATUS_SUCCESS;
ExReleaseSpinLockSharedFromDpcLevel(&Mac->Lock);
}
-static NTSTATUS
+NTSTATUS
MacDumpAddressTable(
IN PXENVIF_MAC Mac
)
__MacReleaseLockExclusive(Mac);
KeLowerIrql(Irql);
- (VOID) MacDumpAddressTable(Mac);
-
Trace("%s: %02X:%02X:%02X:%02X:%02X:%02X\n",
FrontendGetPrefix(Frontend),
Address->Byte[0],
__MacReleaseLockExclusive(Mac);
KeLowerIrql(Irql);
- (VOID) MacDumpAddressTable(Mac);
-
Trace("%s: %02X:%02X:%02X:%02X:%02X:%02X\n",
FrontendGetPrefix(Frontend),
Address->Byte[0],
OUT PETHERNET_ADDRESS Address
);
+extern NTSTATUS
+MacDumpAddressTable(
+ IN PXENVIF_MAC Mac
+ );
+
extern NTSTATUS
MacAddMulticastAddress(
IN PXENVIF_MAC Mac,