return status;
}
+NTSTATUS
+FrontendSetFilterLevel(
+ IN PXENVIF_FRONTEND Frontend,
+ IN ETHERNET_ADDRESS_TYPE Type,
+ IN XENVIF_MAC_FILTER_LEVEL Level
+ )
+{
+ PXENVIF_MAC Mac;
+ KIRQL Irql;
+ NTSTATUS status;
+
+ Mac = FrontendGetMac(Frontend);
+
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
+ status = MacSetFilterLevel(Mac, Type, Level);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ if (Type == ETHERNET_ADDRESS_MULTICAST) {
+ PXENVIF_TRANSMITTER Transmitter;
+ BOOLEAN Enabled;
+
+ Transmitter = FrontendGetTransmitter(Frontend);
+ Enabled = (Level != XENVIF_MAC_FILTER_ALL) ? TRUE : FALSE;
+
+ (VOID) TransmitterRequestMulticastControl(Transmitter, Enabled);
+ }
+
+ KeLowerIrql(Irql);
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ KeLowerIrql(Irql);
+
+ return status;
+}
+
VOID
FrontendAdvertiseIpAddresses(
IN PXENVIF_FRONTEND Frontend
&Transmitter->StoreInterface,
NULL,
FrontendGetBackendPath(Frontend),
- "feature-multicast-control",
+ "feature-dynamic-multicast-control",
&Buffer);
if (!NT_SUCCESS(status)) {
Transmitter->MulticastControl = FALSE;
return status;
}
-NTSTATUS
-TransmitterStoreWrite(
+static FORCEINLINE NTSTATUS
+__TransmitterRequestMulticastControl(
IN PXENVIF_TRANSMITTER Transmitter,
- IN PXENBUS_STORE_TRANSACTION Transaction
+ IN PXENBUS_STORE_TRANSACTION Transaction,
+ IN BOOLEAN Enabled
)
{
PXENVIF_FRONTEND Frontend;
NTSTATUS status;
- LONG Index;
Frontend = Transmitter->Frontend;
FrontendGetPath(Frontend),
"request-multicast-control",
"%u",
- TRUE);
+ Enabled);
if (!NT_SUCCESS(status))
goto fail1;
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+TransmitterRequestMulticastControl(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN BOOLEAN Enabled
+ )
+{
+ NTSTATUS status;
+
+ status = STATUS_NOT_SUPPORTED;
+ if (!__TransmitterHasMulticastControl(Transmitter))
+ goto fail1;
+
+ status = __TransmitterRequestMulticastControl(Transmitter, NULL,
+ Enabled);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ return STATUS_SUCCESS;
+
+fail2:
+fail1:
+ return status;
+}
+
+NTSTATUS
+TransmitterStoreWrite(
+ IN PXENVIF_TRANSMITTER Transmitter,
+ IN PXENBUS_STORE_TRANSACTION Transaction
+ )
+{
+ PXENVIF_FRONTEND Frontend;
+ NTSTATUS status;
+ LONG Index;
+
+ Frontend = Transmitter->Frontend;
+
+ if (__TransmitterHasMulticastControl(Transmitter)) {
+ status = __TransmitterRequestMulticastControl(Transmitter,
+ Transaction,
+ TRUE);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+ }
+
Index = 0;
while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
PXENVIF_TRANSMITTER_RING Ring = Transmitter->Ring[Index];