]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Dynamic multicast control 8.1.0-rc13
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 21 Jan 2016 09:23:27 +0000 (09:23 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Fri, 29 Jan 2016 10:44:52 +0000 (10:44 +0000)
Only use the multicast control feature of the backend if it supported
"feature-dynamic-multicast-control" otherwise attempts to enable the 'all
multicast' filter level in XENVIF will have no effect and the NDISTest 6.5
MultiCast Address test will fail.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif/frontend.c
src/xenvif/frontend.h
src/xenvif/transmitter.c
src/xenvif/transmitter.h
src/xenvif/vif.c

index 8f5a492e3de533c7520d0676426326d790948836..e513790e52d2364ec04941baddea3a506befa92a 100644 (file)
@@ -1119,6 +1119,47 @@ fail1:
     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
index d90f977c04625f4b130bcfc2b767fe5805a365d1..9cac4124e90fd58edefc8e7a2155257332feb8d0 100644 (file)
@@ -186,6 +186,13 @@ FrontendSetMulticastAddresses(
     IN  ULONG               Count
     );
 
+extern NTSTATUS
+FrontendSetFilterLevel(
+    IN  PXENVIF_FRONTEND        Frontend,
+    IN  ETHERNET_ADDRESS_TYPE   Type,
+    IN  XENVIF_MAC_FILTER_LEVEL Level
+    );
+
 extern VOID
 FrontendAdvertiseIpAddresses(
     IN  PXENVIF_FRONTEND        Frontend
index 7165ecc1c639f526da7e8f3dd338e232241c99b9..5289c6ce3b471d738c67ea523d9b14986936018b 100644 (file)
@@ -4312,7 +4312,7 @@ TransmitterConnect(
                           &Transmitter->StoreInterface,
                           NULL,
                           FrontendGetBackendPath(Frontend),
-                          "feature-multicast-control",
+                          "feature-dynamic-multicast-control",
                           &Buffer);
     if (!NT_SUCCESS(status)) {
         Transmitter->MulticastControl = FALSE;
@@ -4409,15 +4409,15 @@ fail1:
     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;
 
@@ -4427,10 +4427,62 @@ TransmitterStoreWrite(
                           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];
index 3e72b740ab636a9738d97c6d3014abfd3313dd66..5e74667b5a7a0cf48c232b580b3df130fb74281d 100644 (file)
@@ -146,4 +146,10 @@ TransmitterHasMulticastControl(
     IN  PXENVIF_TRANSMITTER Transmitter
     );
 
+NTSTATUS
+TransmitterRequestMulticastControl(
+    IN  PXENVIF_TRANSMITTER Transmitter,
+    IN  BOOLEAN             Enabled
+    );
+
 #endif  // _XENVIF_TRANSMITTER_H
index 74df4ace9df61d3676fe515a04e1212fbb92a9b1..ce94a56a698f276dff8baf74716fabadc2807fc8 100644 (file)
@@ -819,7 +819,7 @@ VifMacSetFilterLevel(
 
     AcquireMrswLockShared(&Context->Lock);
 
-    status = MacSetFilterLevel(FrontendGetMac(Context->Frontend), Type, Level);
+    status = FrontendSetFilterLevel(Context->Frontend, Type, Level);
 
     ReleaseMrswLockShared(&Context->Lock);