ETHERNET_ADDRESS BroadcastAddress;
LIST_ENTRY MulticastList;
ULONG MulticastCount;
- BOOLEAN MulticastControl;
XENVIF_MAC_FILTER_LEVEL FilterLevel[ETHERNET_ADDRESS_TYPE_COUNT];
XENBUS_DEBUG_INTERFACE DebugInterface;
PXENBUS_DEBUG_CALLBACK DebugCallback;
Mac->MaximumFrameSize = (ULONG)Mtu + sizeof (ETHERNET_TAGGED_HEADER);
- status = XENBUS_STORE(Read,
- &Mac->StoreInterface,
- NULL,
- FrontendGetBackendPath(Frontend),
- "feature-multicast-control",
- &Buffer);
- if (!NT_SUCCESS(status)) {
- Mac->MulticastControl = FALSE;
- } else {
- Mac->MulticastControl = (BOOLEAN)strtol(Buffer, NULL, 2);
-
- XENBUS_STORE(Free,
- &Mac->StoreInterface,
- Buffer);
- }
-
status = XENBUS_DEBUG(Register,
&Mac->DebugInterface,
__MODULE__ "|MAC",
Mac->DebugCallback);
Mac->DebugCallback = NULL;
- Mac->MulticastControl = FALSE;
-
Mac->MaximumFrameSize = 0;
RtlZeroMemory(&Mac->BroadcastAddress, sizeof (ETHERNET_ADDRESS));
break;
case XENVIF_MAC_FILTER_MATCHING: {
- PLIST_ENTRY ListEntry;
+ PXENVIF_FRONTEND Frontend;
+ PXENVIF_TRANSMITTER Transmitter;
+ PLIST_ENTRY ListEntry;
+
+ Frontend = Mac->Frontend;
+ Transmitter = FrontendGetTransmitter(Frontend);
- if (Mac->MulticastControl) {
+ if (TransmitterHasMulticastControl(Transmitter)) {
Allow = TRUE;
break;
}
return status;
}
+static FORCEINLINE BOOLEAN
+__TransmitterHasMulticastControl(
+ IN PXENVIF_TRANSMITTER Transmitter
+ )
+{
+ return Transmitter->MulticastControl;
+}
+
+BOOLEAN
+TransmitterHasMulticastControl(
+ IN PXENVIF_TRANSMITTER Transmitter
+ )
+{
+ return __TransmitterHasMulticastControl(Transmitter);
+}
+
static FORCEINLINE NTSTATUS
__TransmitterRingQueueMulticastControl(
IN PXENVIF_TRANSMITTER_RING Ring,
Transmitter = Ring->Transmitter;
status = STATUS_NOT_SUPPORTED;
- if (!Transmitter->MulticastControl)
+ if (!__TransmitterHasMulticastControl(Transmitter))
goto fail1;
Frontend = Transmitter->Frontend;