]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Introduce granter abstraction
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 11 Apr 2014 14:00:28 +0000 (15:00 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Fri, 11 Apr 2014 14:13:56 +0000 (15:13 +0100)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
proj/xenvif/xenvif.vcxproj
src/xenvif/frontend.c
src/xenvif/frontend.h
src/xenvif/granter.c [new file with mode: 0644]
src/xenvif/granter.h [new file with mode: 0644]
src/xenvif/transmitter.c

index 9b06e12797d2f2af9a04a1e4a321b83d875c7794..ac799c7d3f86401e533b5634be64f3b43faa6c0f 100644 (file)
@@ -85,6 +85,7 @@
                <ClCompile Include="../../src/xenvif/frontend.c" />
                <ClCompile Include="../../src/xenvif/mac.c" />
                <ClCompile Include="../../src/xenvif/notifier.c" />
+               <ClCompile Include="../../src/xenvif/granter.c" />
                <ClCompile Include="../../src/xenvif/parse.c" />
                <ClCompile Include="../../src/xenvif/pdo.c" />
                <ClCompile Include="../../src/xenvif/pool.c" />
index 33c8f69eca72775b335a78034c13d60dd7ca4207..d8767f2957128d1f83e088c1f307ab9a2486f02f 100644 (file)
@@ -46,6 +46,7 @@
 #include "thread.h"
 #include "frontend.h"
 #include "names.h"
+#include "granter.h"
 #include "notifier.h"
 #include "mac.h"
 #include "tcpip.h"
@@ -67,6 +68,7 @@ struct _XENVIF_FRONTEND {
     PXENBUS_STORE_WATCH         Watch;
     PCHAR                       BackendPath;
     USHORT                      BackendDomain;
+    PXENVIF_GRANTER             Granter;
     PXENVIF_NOTIFIER            Notifier;
     PXENVIF_MAC                 Mac;
     PXENVIF_RECEIVER            Receiver;
@@ -292,6 +294,22 @@ FrontendGetBackendDomain(
     return __FrontendGetBackendDomain(Frontend);
 }
 
+static FORCEINLINE PXENVIF_GRANTER
+__FrontendGetGranter(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    return Frontend->Granter;
+}
+
+PXENVIF_GRANTER
+FrontendGetGranter(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    return __FrontendGetGranter(Frontend);
+}
+
 static FORCEINLINE PXENVIF_NOTIFIER
 __FrontendGetNotifier(
     IN  PXENVIF_FRONTEND    Frontend
@@ -1043,22 +1061,26 @@ __FrontendConnect(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = MacConnect(__FrontendGetMac(Frontend));
+    status = GranterConnect(__FrontendGetGranter(Frontend));
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = ReceiverConnect(__FrontendGetReceiver(Frontend));
+    status = MacConnect(__FrontendGetMac(Frontend));
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
+    status = ReceiverConnect(__FrontendGetReceiver(Frontend));
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    status = NotifierConnect(__FrontendGetNotifier(Frontend));
+    status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
     if (!NT_SUCCESS(status))
         goto fail5;
 
+    status = NotifierConnect(__FrontendGetNotifier(Frontend));
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
     Attempt = 0;
     do {
         PXENBUS_STORE_TRANSACTION   Transaction;
@@ -1102,7 +1124,7 @@ abort:
     } while (status == STATUS_RETRY);
 
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     status = STORE(Printf,
                    Frontend->StoreInterface,
@@ -1112,20 +1134,23 @@ abort:
                    "%u",
                    XenbusStateConnected);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     State = XenbusStateInitWait;
     status = __FrontendWaitForStateChange(Frontend, Path, &State);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail9;
 
     status = STATUS_UNSUCCESSFUL;
     if (State != XenbusStateConnected)
-        goto fail9;
+        goto fail10;
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
+fail10:
+    Error("fail10\n");
+
 fail9:
     Error("fail9\n");
 
@@ -1135,25 +1160,27 @@ fail8:
 fail7:
     Error("fail7\n");
 
+    NotifierDisconnect(__FrontendGetNotifier(Frontend));
+
 fail6:
-    Error("fail7\n");
+    Error("fail6\n");
 
-    NotifierDisconnect(__FrontendGetNotifier(Frontend));
+    TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
 
 fail5:
     Error("fail5\n");
 
-    TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
+    ReceiverDisconnect(__FrontendGetReceiver(Frontend));
 
 fail4:
     Error("fail4\n");
 
-    ReceiverDisconnect(__FrontendGetReceiver(Frontend));
+    MacDisconnect(__FrontendGetMac(Frontend));
 
 fail3:
     Error("fail3\n");
 
-    MacDisconnect(__FrontendGetMac(Frontend));
+    GranterDisconnect(__FrontendGetGranter(Frontend));
 
 fail2:
     Error("fail2\n");
@@ -1184,6 +1211,7 @@ __FrontendDisconnect(
     TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
     ReceiverDisconnect(__FrontendGetReceiver(Frontend));
     MacDisconnect(__FrontendGetMac(Frontend));
+    GranterDisconnect(__FrontendGetGranter(Frontend));
 
     DEBUG(Deregister,
           Frontend->DebugInterface,
@@ -1205,39 +1233,48 @@ __FrontendEnable(
 
     Trace("====>\n");
 
-    status = MacEnable(__FrontendGetMac(Frontend));
+    status = GranterEnable(__FrontendGetGranter(Frontend));
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = ReceiverEnable(__FrontendGetReceiver(Frontend));
+    status = MacEnable(__FrontendGetMac(Frontend));
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
+    status = ReceiverEnable(__FrontendGetReceiver(Frontend));
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = NotifierEnable(__FrontendGetNotifier(Frontend));
+    status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    status = NotifierEnable(__FrontendGetNotifier(Frontend));
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
     Trace("<====\n");
     return STATUS_SUCCESS;
 
+fail5:
+    Error("fail5\n");
+
+    TransmitterDisable(__FrontendGetTransmitter(Frontend));
+
 fail4:
     Error("fail4\n");
 
-    TransmitterDisable(__FrontendGetTransmitter(Frontend));
+    ReceiverDisable(__FrontendGetReceiver(Frontend));
 
 fail3:
     Error("fail3\n");
 
-    ReceiverDisable(__FrontendGetReceiver(Frontend));
+    MacDisable(__FrontendGetMac(Frontend));
 
 fail2:
     Error("fail2\n");
 
-    MacDisable(__FrontendGetMac(Frontend));
+    GranterDisable(__FrontendGetGranter(Frontend));
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -1256,6 +1293,7 @@ __FrontendDisable(
     TransmitterDisable(__FrontendGetTransmitter(Frontend));
     ReceiverDisable(__FrontendGetReceiver(Frontend));
     MacDisable(__FrontendGetMac(Frontend));
+    GranterDisable(__FrontendGetGranter(Frontend));
 
     Trace("<====\n");
 }
@@ -1611,7 +1649,7 @@ FrontendInitialize(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = MacInitialize(*Frontend, &(*Frontend)->Mac);
+    status = GranterInitialize(*Frontend, &(*Frontend)->Granter);
     if (!NT_SUCCESS(status))
         goto fail7;
 
@@ -1619,18 +1657,22 @@ FrontendInitialize(
     if (!NT_SUCCESS(status))
         goto fail8;
 
-    status = ReceiverInitialize(*Frontend, 1, &(*Frontend)->Receiver);
+    status = MacInitialize(*Frontend, &(*Frontend)->Mac);
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    status = TransmitterInitialize(*Frontend, 1, &(*Frontend)->Transmitter);
+    status = ReceiverInitialize(*Frontend, 1, &(*Frontend)->Receiver);
     if (!NT_SUCCESS(status))
         goto fail10;
 
-    status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread);
+    status = TransmitterInitialize(*Frontend, 1, &(*Frontend)->Transmitter);
     if (!NT_SUCCESS(status))
         goto fail11;
 
+    status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread);
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     (*Frontend)->Magic = FRONTEND_MAGIC;
     _ReadWriteBarrier();
 
@@ -1641,7 +1683,7 @@ FrontendInitialize(
                                           &(*Frontend)->Handle);
     if (!NT_SUCCESS(status)) {
         if (status != STATUS_NOT_SUPPORTED) 
-            goto fail12;
+            goto fail13;
         
         // If IP Helper isn't available (as in Windows PE) then
         // NotifyUnicastIpAddressChange will not be supported
@@ -1658,8 +1700,8 @@ FrontendInitialize(
 
     return STATUS_SUCCESS;
 
-fail12:
-    Error("fail12\n");
+fail13:
+    Error("fail13\n");
 
     (*Frontend)->Magic = 0;
 
@@ -1667,18 +1709,24 @@ fail12:
     ThreadJoin((*Frontend)->MibThread);
     (*Frontend)->MibThread = NULL;
 
-fail11:
-    Error("fail11\n");
+fail12:
+    Error("fail12\n");
 
     TransmitterTeardown(__FrontendGetTransmitter(*Frontend));
     (*Frontend)->Transmitter = NULL;
 
-fail10:
-    Error("fail10\n");
+fail11:
+    Error("fail11\n");
 
     ReceiverTeardown(__FrontendGetReceiver(*Frontend));
     (*Frontend)->Receiver = NULL;
 
+fail10:
+    Error("fail10\n");
+
+    MacTeardown(__FrontendGetMac(*Frontend));
+    (*Frontend)->Mac = NULL;
+
 fail9:
     Error("fail9\n");
 
@@ -1688,8 +1736,8 @@ fail9:
 fail8:
     Error("fail8\n");
 
-    MacTeardown(__FrontendGetMac(*Frontend));
-    (*Frontend)->Mac = NULL;
+    GranterTeardown(__FrontendGetGranter(*Frontend));
+    (*Frontend)->Granter = NULL;
 
 fail7:
     Error("fail7\n");
@@ -1792,11 +1840,14 @@ FrontendTeardown(
     ReceiverTeardown(__FrontendGetReceiver(Frontend));
     Frontend->Receiver = NULL;
 
+    MacTeardown(__FrontendGetMac(Frontend));
+    Frontend->Mac = NULL;
+
     NotifierTeardown(__FrontendGetNotifier(Frontend));
     Frontend->Notifier = NULL;
 
-    MacTeardown(__FrontendGetMac(Frontend));
-    Frontend->Mac = NULL;
+    GranterTeardown(__FrontendGetGranter(Frontend));
+    Frontend->Granter = NULL;
 
     ThreadAlert(Frontend->EjectThread);
     ThreadJoin(Frontend->EjectThread);
index 22747deab21119e5e532440e2ab14e408eed33b3..e79ce52d3f055cb3bea642da8b6aa9b5e1f80c25 100644 (file)
@@ -114,6 +114,13 @@ FrontendGetBackendDomain(
     IN  PXENVIF_FRONTEND    Frontend
     );
 
+#include "granter.h"
+
+extern PXENVIF_GRANTER
+FrontendGetGranter(
+    IN  PXENVIF_FRONTEND    Frontend
+    );
+
 #include "notifier.h"
 
 extern PXENVIF_NOTIFIER
diff --git a/src/xenvif/granter.c b/src/xenvif/granter.c
new file mode 100644 (file)
index 0000000..4d819ff
--- /dev/null
@@ -0,0 +1,242 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, 
+ * with or without modification, are permitted provided 
+ * that the following conditions are met:
+ * 
+ * *   Redistributions of source code must retain the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer in the documentation and/or other 
+ *     materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+#include <util.h>
+#include <evtchn_interface.h>
+#include <store_interface.h>
+
+#include "pdo.h"
+#include "frontend.h"
+#include "granter.h"
+#include "dbg_print.h"
+#include "assert.h"
+
+struct _XENVIF_GRANTER {
+    PXENVIF_FRONTEND            Frontend;
+
+    PXENBUS_GNTTAB_INTERFACE    GnttabInterface;
+};
+
+#define GRANTER_POOL    'NARG'
+
+static FORCEINLINE PVOID
+__GranterAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocateNonPagedPoolWithTag(Length, GRANTER_POOL);
+}
+
+static FORCEINLINE VOID
+__GranterFree(
+    IN  PVOID   Buffer
+    )
+{
+    __FreePoolWithTag(Buffer, GRANTER_POOL);
+}
+
+NTSTATUS
+GranterInitialize(
+    IN  PXENVIF_FRONTEND    Frontend,
+    OUT PXENVIF_GRANTER     *Granter
+    )
+{
+    NTSTATUS                status;
+
+    *Granter = __GranterAllocate(sizeof (XENVIF_GRANTER));
+
+    status = STATUS_NO_MEMORY;
+    if (*Granter == NULL)
+        goto fail1;
+
+    (*Granter)->Frontend = Frontend;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+GranterConnect(
+    IN  PXENVIF_GRANTER     Granter
+    )
+{
+    PXENVIF_FRONTEND        Frontend;
+
+    Frontend = Granter->Frontend;
+
+    Granter->GnttabInterface = FrontendGetGnttabInterface(Frontend);
+
+    GNTTAB(Acquire, Granter->GnttabInterface);
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+GranterEnable(
+    IN  PXENVIF_GRANTER     Granter
+    )
+{
+    UNREFERENCED_PARAMETER(Granter);
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+GranterGet(
+    IN  PXENVIF_GRANTER         Granter,
+    OUT PXENVIF_GRANTER_HANDLE  Handle
+    )
+{
+    ULONG                       Reference;
+    NTSTATUS                    status;
+
+    status = GNTTAB(Get,
+                    Granter->GnttabInterface,
+                    &Reference);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    *Handle = (XENVIF_GRANTER_HANDLE)(ULONG_PTR)Reference;
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+GranterPermitAccess(
+    IN  PXENVIF_GRANTER         Granter,
+    IN  XENVIF_GRANTER_HANDLE   Handle,
+    IN  PFN_NUMBER              Pfn,
+    IN  BOOLEAN                 ReadOnly
+    )
+{
+    PXENVIF_FRONTEND            Frontend;
+    ULONG_PTR                   Reference;
+    NTSTATUS                    status;
+
+    Frontend = Granter->Frontend;
+
+    Reference = (ULONG_PTR)Handle;
+
+    status = GNTTAB(PermitForeignAccess,
+                    Granter->GnttabInterface,
+                    (ULONG)Reference,
+                    FrontendGetBackendDomain(Frontend),
+                    GNTTAB_ENTRY_FULL_PAGE,
+                    Pfn,
+                    ReadOnly);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+VOID
+GranterRevokeAccess(
+    IN  PXENVIF_GRANTER         Granter,
+    IN  XENVIF_GRANTER_HANDLE   Handle
+    )
+{
+    ULONG_PTR                   Reference;
+
+    Reference = (ULONG_PTR)Handle;
+
+    (VOID) GNTTAB(RevokeForeignAccess,
+                  Granter->GnttabInterface,
+                  (ULONG)Reference);
+}
+
+VOID
+GranterPut(
+    IN  PXENVIF_GRANTER         Granter,
+    IN  XENVIF_GRANTER_HANDLE   Handle
+    )
+{
+    ULONG_PTR                   Reference;
+
+    Reference = (ULONG_PTR)Handle;
+
+    GNTTAB(Put,
+           Granter->GnttabInterface,
+           (ULONG)Reference);
+}
+
+ULONG
+GranterGetReference(
+    IN  XENVIF_GRANTER_HANDLE   Handle
+    )
+{
+    return (ULONG)(ULONG_PTR)Handle;
+}
+
+VOID
+GranterDisable(
+    IN  PXENVIF_GRANTER     Granter
+    )
+{
+    UNREFERENCED_PARAMETER(Granter);
+}
+
+VOID
+GranterDisconnect(
+    IN  PXENVIF_GRANTER     Granter
+    )
+{
+    GNTTAB(Release, Granter->GnttabInterface);
+    Granter->GnttabInterface = NULL;
+}
+
+VOID
+GranterTeardown(
+    IN  PXENVIF_GRANTER     Granter
+    )
+{
+    Granter->Frontend = NULL;
+
+    ASSERT(IsZeroMemory(Granter, sizeof (XENVIF_GRANTER)));
+
+    __GranterFree(Granter);
+}
diff --git a/src/xenvif/granter.h b/src/xenvif/granter.h
new file mode 100644 (file)
index 0000000..d32303f
--- /dev/null
@@ -0,0 +1,104 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, 
+ * with or without modification, are permitted provided 
+ * that the following conditions are met:
+ * 
+ * *   Redistributions of source code must retain the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer in the documentation and/or other 
+ *     materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENVIF_GRANTER_H
+#define _XENVIF_GRANTER_H
+
+#include <ntddk.h>
+#include <gnttab_interface.h>
+
+typedef struct _XENVIF_GRANTER  XENVIF_GRANTER, *PXENVIF_GRANTER;
+
+typedef PVOID XENVIF_GRANTER_HANDLE, *PXENVIF_GRANTER_HANDLE;
+
+NTSTATUS
+GranterInitialize(
+    IN  PXENVIF_FRONTEND    Frontend,
+    OUT PXENVIF_GRANTER     *Granter
+    );
+
+NTSTATUS
+GranterConnect(
+    IN  PXENVIF_GRANTER     Granter
+    );
+
+NTSTATUS
+GranterEnable(
+    IN  PXENVIF_GRANTER     Granter
+    );
+
+NTSTATUS
+GranterGet(
+    IN  PXENVIF_GRANTER         Granter,
+    OUT PXENVIF_GRANTER_HANDLE  Handle
+    );
+
+NTSTATUS
+GranterPermitAccess(
+    IN  PXENVIF_GRANTER         Granter,
+    IN  XENVIF_GRANTER_HANDLE   Handle,
+    IN  PFN_NUMBER              Pfn,
+    IN  BOOLEAN                 ReadOnly
+    );
+
+VOID
+GranterRevokeAccess(
+    IN  PXENVIF_GRANTER         Granter,
+    IN  XENVIF_GRANTER_HANDLE   Handle
+    );
+
+VOID
+GranterPut(
+    IN  PXENVIF_GRANTER         Granter,
+    IN  XENVIF_GRANTER_HANDLE   Handle
+    );
+
+ULONG
+GranterGetReference(
+    IN  XENVIF_GRANTER_HANDLE   Handle
+    );
+
+VOID
+GranterDisable(
+    IN  PXENVIF_GRANTER Granter
+    );
+
+VOID
+GranterDisconnect(
+    IN  PXENVIF_GRANTER Granter
+    );
+
+VOID
+GranterTeardown(
+    IN  PXENVIF_GRANTER Granter
+    );
+
+#endif  // _XENVIF_GRANTER_H
index 3571031ca6c968ea62b3dfc8b0cf1e4c6af22245..1900732543ebfa35f23968248071bf5900fef5fa 100644 (file)
@@ -47,6 +47,7 @@
 #include "checksum.h"
 #include "parse.h"
 #include "transmitter.h"
+#include "granter.h"
 #include "mac.h"
 #include "vif.h"
 #include "thread.h"
@@ -77,7 +78,7 @@ typedef struct _TRANSMITTER_TAG {
     ULONG                   Next;
     TRANSMITTER_TAG_TYPE    Type;
     PVOID                   Context;
-    ULONG                   Reference;
+    XENVIF_GRANTER_HANDLE   Handle;
     ULONG                   Offset;
     ULONG                   Length;
 } TRANSMITTER_TAG, *PTRANSMITTER_TAG;
@@ -122,7 +123,7 @@ typedef struct _TRANSMITTER_RING {
     PMDL                                    Mdl;
     netif_tx_front_ring_t                   Front;
     netif_tx_sring_t                        *Shared;
-    ULONG                                   Reference;
+    XENVIF_GRANTER_HANDLE                   Handle;
     BOOLEAN                                 Connected;
     BOOLEAN                                 Enabled;
     BOOLEAN                                 Stopped;
@@ -165,7 +166,6 @@ struct _XENVIF_TRANSMITTER {
 
     PXENBUS_DEBUG_INTERFACE             DebugInterface;
     PXENBUS_STORE_INTERFACE             StoreInterface;
-    PXENBUS_GNTTAB_INTERFACE            GnttabInterface;
     PXENVIF_VIF_INTERFACE               VifInterface;
 
     PXENBUS_DEBUG_CALLBACK              DebugCallback;
@@ -769,13 +769,10 @@ __RingCopyPayload(
 
         Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-        status = GNTTAB(PermitForeignAccess,
-                        Transmitter->GnttabInterface,
-                        Tag->Reference,
-                        FrontendGetBackendDomain(Frontend),
-                        GNTTAB_ENTRY_FULL_PAGE,
-                        Pfn,
-                        TRUE);
+        status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                     Tag->Handle,
+                                     Pfn,
+                                     TRUE);
         ASSERT(NT_SUCCESS(status));
 
         Tag->Offset = 0;
@@ -810,9 +807,8 @@ fail1:
         Tag->Length = 0;
         Tag->Offset = 0;
 
-        (VOID) GNTTAB(RevokeForeignAccess,
-                      Transmitter->GnttabInterface,
-                      Tag->Reference);
+        GranterRevokeAccess(FrontendGetGranter(Frontend),
+                            Tag->Handle);
 
         ASSERT3U(Tag->Type, ==, TAG_BUFFER);
         Buffer = Tag->Context;
@@ -889,13 +885,10 @@ __RingGrantPayload(
             PageOffset = MdlOffset & (PAGE_SIZE - 1);
             PageLength = __min(MdlLength, PAGE_SIZE - PageOffset);
 
-            status = GNTTAB(PermitForeignAccess,
-                            Transmitter->GnttabInterface,
-                            Tag->Reference,
-                            FrontendGetBackendDomain(Frontend),
-                            GNTTAB_ENTRY_FULL_PAGE,
-                            Pfn,
-                            TRUE);
+            status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                         Tag->Handle,
+                                         Pfn,
+                                         TRUE);
             ASSERT(NT_SUCCESS(status));
 
             Tag->Offset = PageOffset;
@@ -947,9 +940,8 @@ fail1:
         Tag->Length = 0;
         Tag->Offset = 0;
 
-        (VOID) GNTTAB(RevokeForeignAccess,
-                      Transmitter->GnttabInterface,
-                      Tag->Reference);
+        GranterRevokeAccess(FrontendGetGranter(Frontend),
+                            Tag->Handle);
 
         Tag->Context = NULL;
         Tag->Type = TAG_TYPE_INVALID;
@@ -1023,13 +1015,10 @@ __RingPrepareHeader(
 
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-    status = GNTTAB(PermitForeignAccess,
-                    Transmitter->GnttabInterface,
-                    Tag->Reference,
-                    FrontendGetBackendDomain(Frontend),
-                    GNTTAB_ENTRY_FULL_PAGE,
-                    Pfn,
-                    TRUE);
+    status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                 Tag->Handle,
+                                 Pfn,
+                                 TRUE);
     ASSERT(NT_SUCCESS(status));
 
     Tag->Offset = 0;
@@ -1225,9 +1214,8 @@ fail3:
     Tag->Length = 0;
     Tag->Offset = 0;
 
-    (VOID) GNTTAB(RevokeForeignAccess,
-                  Transmitter->GnttabInterface,
-                  Tag->Reference);
+    GranterRevokeAccess(FrontendGetGranter(Frontend),
+                        Tag->Handle);
 
     Tag->Context = NULL;
     Tag->Type = TAG_TYPE_INVALID;
@@ -1275,7 +1263,6 @@ __RingUnprepareTags(
         PLIST_ENTRY                 ListEntry;
         PTRANSMITTER_TAG            Tag;
         PXENVIF_TRANSMITTER_PACKET  Packet;
-        NTSTATUS                    status;
 
         --State->Count;
 
@@ -1289,10 +1276,8 @@ __RingUnprepareTags(
         Tag->Length = 0;
         Tag->Offset = 0;
 
-        status = GNTTAB(RevokeForeignAccess,
-                        Transmitter->GnttabInterface,
-                        Tag->Reference);
-        ASSERT(NT_SUCCESS(status));
+        GranterRevokeAccess(FrontendGetGranter(Frontend),
+                            Tag->Handle);
 
         switch (Tag->Type) {
         case TAG_BUFFER: {
@@ -1615,13 +1600,10 @@ __RingPrepareGratuitousArp(
 
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-    status = GNTTAB(PermitForeignAccess,
-                    Transmitter->GnttabInterface,
-                    Tag->Reference,
-                    FrontendGetBackendDomain(Frontend),
-                    GNTTAB_ENTRY_FULL_PAGE,
-                    Pfn,
-                    TRUE);
+    status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                 Tag->Handle,
+                                 Pfn,
+                                 TRUE);
     ASSERT(NT_SUCCESS(status));
 
     Tag->Offset = 0;
@@ -1764,13 +1746,10 @@ __RingPrepareNeighbourAdvertisement(
 
     Pfn = MmGetMdlPfnArray(Mdl)[0];
 
-    status = GNTTAB(PermitForeignAccess,
-                    Transmitter->GnttabInterface,
-                    Tag->Reference,
-                    FrontendGetBackendDomain(Frontend),
-                    GNTTAB_ENTRY_FULL_PAGE,
-                    Pfn,
-                    TRUE);
+    status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                 Tag->Handle,
+                                 Pfn,
+                                 TRUE);
     ASSERT(NT_SUCCESS(status));
 
     Tag->Offset = 0;
@@ -1859,7 +1838,7 @@ __RingPostTags(
         id = (USHORT)(Tag - &Ring->Tag[0]);
 
         req->id = id | REQ_ID_INTEGRITY_CHECK;
-        req->gref = Tag->Reference;
+        req->gref = GranterGetReference(Tag->Handle);
         req->offset = (USHORT)Tag->Offset;
         req->size = (USHORT)Tag->Length;
         req->flags = NETTXF_more_data;
@@ -2030,17 +2009,16 @@ __RingReleaseTag(
     )
 {
     PXENVIF_TRANSMITTER     Transmitter;
-    NTSTATUS                status;
+    PXENVIF_FRONTEND        Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     Tag->Length = 0;
     Tag->Offset = 0;
 
-    status = GNTTAB(RevokeForeignAccess,
-                    Transmitter->GnttabInterface,
-                    Tag->Reference);
-    ASSERT(NT_SUCCESS(status));
+    GranterRevokeAccess(FrontendGetGranter(Frontend),
+                        Tag->Handle);
 
     __TransmitterPutTag(Ring, Tag);
 }
@@ -2987,13 +2965,8 @@ __RingConnect(
     FRONT_RING_INIT(&Ring->Front, Ring->Shared, PAGE_SIZE);
     ASSERT3P(Ring->Front.sring, ==, Ring->Shared);
 
-    Transmitter->GnttabInterface = FrontendGetGnttabInterface(Frontend);
-
-    GNTTAB(Acquire, Transmitter->GnttabInterface);
-
-    status = GNTTAB(Get,
-                    Transmitter->GnttabInterface,
-                    &Ring->Reference);
+    status = GranterGet(FrontendGetGranter(Frontend),
+                        &Ring->Handle);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -3001,9 +2974,8 @@ __RingConnect(
     for (Index = 0; Index < MAXIMUM_TAG_COUNT; Index++) {
         PTRANSMITTER_TAG Tag = &Ring->Tag[Index];
 
-        status = GNTTAB(Get,
-                        Transmitter->GnttabInterface,
-                        &Tag->Reference);
+        status = GranterGet(FrontendGetGranter(Frontend),
+                            &Tag->Handle);
         if (!NT_SUCCESS(status))
             goto fail3;
 
@@ -3013,13 +2985,10 @@ __RingConnect(
 
     Pfn = MmGetMdlPfnArray(Ring->Mdl)[0];
 
-    status = GNTTAB(PermitForeignAccess,
-                    Transmitter->GnttabInterface,
-                    Ring->Reference,
-                    FrontendGetBackendDomain(Frontend),
-                    GNTTAB_ENTRY_FULL_PAGE,
-                    Pfn,
-                    FALSE);
+    status = GranterPermitAccess(FrontendGetGranter(Frontend),
+                                 Ring->Handle,
+                                 Pfn,
+                                 FALSE);
     ASSERT(NT_SUCCESS(status));
 
     Ring->Connected = TRUE;
@@ -3035,24 +3004,19 @@ fail3:
         Ring->HeadFreeTag = Tag->Next;
         Tag->Next = 0;
 
-        GNTTAB(Put,
-               Transmitter->GnttabInterface,
-               Tag->Reference);
-        Tag->Reference = 0;
+        GranterPut(FrontendGetGranter(Frontend),
+                   Tag->Handle);
+        Tag->Handle = NULL;
     }
     Ring->HeadFreeTag = 0;
 
-    GNTTAB(Put,
-           Transmitter->GnttabInterface,
-           Ring->Reference);
-    Ring->Reference = 0;
+    GranterPut(FrontendGetGranter(Frontend),
+               Ring->Handle);
+    Ring->Handle = NULL;
 
 fail2:
     Error("fail2\n");
 
-    GNTTAB(Release, Transmitter->GnttabInterface);
-    Transmitter->GnttabInterface = NULL;
-
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
 
@@ -3085,7 +3049,7 @@ __RingStoreWrite(
                    FrontendGetPath(Frontend),
                    "tx-ring-ref",
                    "%u",
-                   Ring->Reference);
+                   GranterGetReference(Ring->Handle));
 
     if (!NT_SUCCESS(status))
         goto fail1;
@@ -3192,7 +3156,6 @@ __RingDisconnect(
     PXENVIF_TRANSMITTER     Transmitter;
     PXENVIF_FRONTEND        Frontend;
     ULONG                   Count;
-    NTSTATUS                status;
 
     ASSERT(Ring->Connected);
     Ring->Connected = FALSE;
@@ -3207,10 +3170,8 @@ __RingDisconnect(
     Ring->RequestsPushed = 0;
     Ring->RequestsPosted = 0;
 
-    status = GNTTAB(RevokeForeignAccess,
-                    Transmitter->GnttabInterface,
-                    Ring->Reference);
-    ASSERT(NT_SUCCESS(status));
+    GranterRevokeAccess(FrontendGetGranter(Frontend),
+                        Ring->Handle);
 
     Count = 0;
     while (Ring->HeadFreeTag != TAG_INDEX_INVALID) {
@@ -3220,10 +3181,9 @@ __RingDisconnect(
         Ring->HeadFreeTag = Tag->Next;
         Tag->Next = 0;
 
-        GNTTAB(Put,
-               Transmitter->GnttabInterface,
-               Tag->Reference);
-        Tag->Reference = 0;
+        GranterPut(FrontendGetGranter(Frontend),
+                   Tag->Handle);
+        Tag->Handle = NULL;
 
         Count++;
     }
@@ -3231,13 +3191,9 @@ __RingDisconnect(
 
     Ring->HeadFreeTag = 0;
 
-    GNTTAB(Put,
-           Transmitter->GnttabInterface,
-           Ring->Reference);
-    Ring->Reference = 0;
-
-    GNTTAB(Release, Transmitter->GnttabInterface);
-    Transmitter->GnttabInterface = NULL;
+    GranterPut(FrontendGetGranter(Frontend),
+               Ring->Handle);
+    Ring->Handle = NULL;
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);