#include "tcpip.h"
#include "receiver.h"
#include "transmitter.h"
+#include "poller.h"
#include "link.h"
#include "dbg_print.h"
#include "assert.h"
PXENVIF_MAC Mac;
PXENVIF_RECEIVER Receiver;
PXENVIF_TRANSMITTER Transmitter;
+ PXENVIF_POLLER Poller;
PXENVIF_CONTROLLER Controller;
XENBUS_DEBUG_INTERFACE DebugInterface;
DEFINE_FRONTEND_GET_FUNCTION(Mac, PXENVIF_MAC)
DEFINE_FRONTEND_GET_FUNCTION(Receiver, PXENVIF_RECEIVER)
DEFINE_FRONTEND_GET_FUNCTION(Transmitter, PXENVIF_TRANSMITTER)
+DEFINE_FRONTEND_GET_FUNCTION(Poller, PXENVIF_POLLER)
DEFINE_FRONTEND_GET_FUNCTION(Controller, PXENVIF_CONTROLLER)
static BOOLEAN
FrontendSetNumQueues(Frontend);
FrontendSetSplit(Frontend);
- status = ReceiverConnect(__FrontendGetReceiver(Frontend));
+ status = PollerConnect(__FrontendGetPoller(Frontend));
if (!NT_SUCCESS(status))
goto fail4;
- status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
+ status = ReceiverConnect(__FrontendGetReceiver(Frontend));
if (!NT_SUCCESS(status))
goto fail5;
- status = ControllerConnect(__FrontendGetController(Frontend));
+ status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
if (!NT_SUCCESS(status))
goto fail6;
+ status = ControllerConnect(__FrontendGetController(Frontend));
+ if (!NT_SUCCESS(status))
+ goto fail7;
+
Attempt = 0;
do {
PXENBUS_STORE_TRANSACTION Transaction;
if (!NT_SUCCESS(status))
break;
+ status = PollerStoreWrite(__FrontendGetPoller(Frontend),
+ Transaction);
+ if (!NT_SUCCESS(status))
+ goto abort;
+
status = ReceiverStoreWrite(__FrontendGetReceiver(Frontend),
Transaction);
if (!NT_SUCCESS(status))
} while (status == STATUS_RETRY);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
State = XenbusStateUnknown;
while (State != XenbusStateConnected) {
status = STATUS_UNSUCCESSFUL;
if (State != XenbusStateConnected)
- goto fail8;
+ goto fail9;
ControllerEnable(__FrontendGetController(Frontend));
Trace("<====\n");
return STATUS_SUCCESS;
+fail9:
+ Error("fail9\n");
+
fail8:
Error("fail8\n");
+ ControllerDisconnect(__FrontendGetController(Frontend));
+
fail7:
Error("fail7\n");
- ControllerDisconnect(__FrontendGetController(Frontend));
+ TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
fail6:
Error("fail6\n");
- TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
+ ReceiverDisconnect(__FrontendGetReceiver(Frontend));
fail5:
Error("fail5\n");
- ReceiverDisconnect(__FrontendGetReceiver(Frontend));
+ PollerDisconnect(__FrontendGetPoller(Frontend));
fail4:
Error("fail4\n");
ControllerDisconnect(__FrontendGetController(Frontend));
TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
ReceiverDisconnect(__FrontendGetReceiver(Frontend));
+ PollerDisconnect(__FrontendGetPoller(Frontend));
MacDisconnect(__FrontendGetMac(Frontend));
Frontend->Split = FALSE;
if (!NT_SUCCESS(status))
goto fail1;
- status = ReceiverEnable(__FrontendGetReceiver(Frontend));
+ status = PollerEnable(__FrontendGetPoller(Frontend));
if (!NT_SUCCESS(status))
goto fail2;
- status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
+ status = ReceiverEnable(__FrontendGetReceiver(Frontend));
if (!NT_SUCCESS(status))
goto fail3;
- status = __FrontendUpdateHash(Frontend, &Frontend->Hash);
+ status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
if (!NT_SUCCESS(status))
goto fail4;
+ status = __FrontendUpdateHash(Frontend, &Frontend->Hash);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
(VOID) FrontendNotifyMulticastAddresses(Frontend, TRUE);
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));
+ PollerDisable(__FrontendGetPoller(Frontend));
fail2:
Error("fail2\n");
TransmitterDisable(__FrontendGetTransmitter(Frontend));
ReceiverDisable(__FrontendGetReceiver(Frontend));
+ PollerDisable(__FrontendGetPoller(Frontend));
MacDisable(__FrontendGetMac(Frontend));
Trace("<====\n");
if (!NT_SUCCESS(status))
goto fail8;
- status = ControllerInitialize(*Frontend, &(*Frontend)->Controller);
+ status = PollerInitialize(*Frontend, &(*Frontend)->Poller);
if (!NT_SUCCESS(status))
goto fail9;
+ status = ControllerInitialize(*Frontend, &(*Frontend)->Controller);
+ if (!NT_SUCCESS(status))
+ goto fail10;
+
KeInitializeEvent(&(*Frontend)->EjectEvent, NotificationEvent, FALSE);
status = ThreadCreate(FrontendEject, *Frontend, &(*Frontend)->EjectThread);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail11;
status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail12;
(*Frontend)->StatisticsCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
(*Frontend)->Statistics = __FrontendAllocate(sizeof (XENVIF_FRONTEND_STATISTICS) *
status = STATUS_NO_MEMORY;
if ((*Frontend)->Statistics == NULL)
- goto fail12;
+ goto fail13;
Trace("<====\n");
return STATUS_SUCCESS;
-fail12:
- Error("fail12\n");
+fail13:
+ Error("fail13\n");
ThreadAlert((*Frontend)->MibThread);
ThreadJoin((*Frontend)->MibThread);
(*Frontend)->MibThread = NULL;
-fail11:
- Error("fail11\n");
+fail12:
+ Error("fail12\n");
ThreadAlert((*Frontend)->EjectThread);
ThreadJoin((*Frontend)->EjectThread);
(*Frontend)->EjectThread = NULL;
-fail10:
- Error("fail10\n");
+fail11:
+ Error("fail11\n");
RtlZeroMemory(&(*Frontend)->EjectEvent, sizeof (KEVENT));
ControllerTeardown(__FrontendGetController(*Frontend));
(*Frontend)->Controller = NULL;
+fail10:
+ PollerTeardown(__FrontendGetPoller(*Frontend));
+ (*Frontend)->Poller = NULL;
+
fail9:
TransmitterTeardown(__FrontendGetTransmitter(*Frontend));
(*Frontend)->Transmitter = NULL;
ControllerTeardown(__FrontendGetController(Frontend));
Frontend->Controller = NULL;
+ PollerTeardown(__FrontendGetPoller(Frontend));
+ Frontend->Poller = NULL;
+
TransmitterTeardown(__FrontendGetTransmitter(Frontend));
Frontend->Transmitter = NULL;
IN PXENVIF_FRONTEND Frontend
);
+#include "poller.h"
+
+extern PXENVIF_POLLER
+FrontendGetPoller(
+ IN PXENVIF_FRONTEND Frontend
+ );
+
#include "controller.h"
extern PXENVIF_CONTROLLER
--- /dev/null
+/* 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 documetation 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 <procgrp.h>
+#include <ntstrsafe.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <xen.h>
+
+#include <debug_interface.h>
+#include <store_interface.h>
+#include <evtchn_interface.h>
+
+#include "pdo.h"
+#include "frontend.h"
+#include "poller.h"
+#include "vif.h"
+#include "thread.h"
+#include "registry.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define MAXNAMELEN 128
+
+struct _XENVIF_POLLER {
+ PXENVIF_FRONTEND Frontend;
+ XENBUS_DEBUG_INTERFACE DebugInterface;
+ PXENBUS_DEBUG_CALLBACK DebugCallback;
+};
+
+#define XENVIF_POLLER_TAG 'LLOP'
+
+static FORCEINLINE PVOID
+__PollerAllocate(
+ IN ULONG Length
+ )
+{
+ return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_POLLER_TAG);
+}
+
+static FORCEINLINE VOID
+__PollerFree(
+ IN PVOID Buffer
+ )
+{
+ __FreePoolWithTag(Buffer, XENVIF_POLLER_TAG);
+}
+
+static VOID
+PollerDebugCallback(
+ IN PVOID Argument,
+ IN BOOLEAN Crashing
+ )
+{
+ UNREFERENCED_PARAMETER(Argument);
+ UNREFERENCED_PARAMETER(Crashing);
+}
+
+NTSTATUS
+PollerInitialize(
+ IN PXENVIF_FRONTEND Frontend,
+ OUT PXENVIF_POLLER *Poller
+ )
+{
+ NTSTATUS status;
+
+ *Poller = __PollerAllocate(sizeof (XENVIF_POLLER));
+
+ status = STATUS_NO_MEMORY;
+ if (*Poller == NULL)
+ goto fail1;
+
+ FdoGetDebugInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
+ &(*Poller)->DebugInterface);
+
+ (*Poller)->Frontend = Frontend;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+PollerConnect(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ NTSTATUS status;
+
+ Trace("====>\n");
+
+ status = XENBUS_DEBUG(Acquire, &Poller->DebugInterface);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = XENBUS_DEBUG(Register,
+ &Poller->DebugInterface,
+ __MODULE__ "|POLLER",
+ PollerDebugCallback,
+ Poller,
+ &Poller->DebugCallback);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Trace("<====\n");
+ return STATUS_SUCCESS;
+
+fail2:
+ Error("fail2\n");
+
+ XENBUS_DEBUG(Release, &Poller->DebugInterface);
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+PollerStoreWrite(
+ IN PXENVIF_POLLER Poller,
+ IN PXENBUS_STORE_TRANSACTION Transaction
+ )
+{
+ UNREFERENCED_PARAMETER(Poller);
+ UNREFERENCED_PARAMETER(Transaction);
+
+ Trace("<===>\n");
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+PollerEnable(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ UNREFERENCED_PARAMETER(Poller);
+
+ Trace("<===>\n");
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+PollerDisable(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ UNREFERENCED_PARAMETER(Poller);
+
+ Trace("<===>\n");
+}
+
+VOID
+PollerDisconnect(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ Trace("====>\n");
+
+ XENBUS_DEBUG(Deregister,
+ &Poller->DebugInterface,
+ Poller->DebugCallback);
+ Poller->DebugCallback = NULL;
+
+ XENBUS_DEBUG(Release, &Poller->DebugInterface);
+
+ Trace("<====\n");
+}
+
+VOID
+PollerTeardown(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+ RtlZeroMemory(&Poller->DebugInterface,
+ sizeof (XENBUS_DEBUG_INTERFACE));
+
+ ASSERT(IsZeroMemory(Poller, sizeof (XENVIF_POLLER)));
+ __PollerFree(Poller);
+}
--- /dev/null
+/* 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_POLLER_H
+#define _XENVIF_POLLER_H
+
+#include <ntddk.h>
+
+#include <vif_interface.h>
+
+#include "frontend.h"
+
+typedef struct _XENVIF_POLLER XENVIF_POLLER, *PXENVIF_POLLER;
+
+extern NTSTATUS
+PollerInitialize(
+ IN PXENVIF_FRONTEND Frontend,
+ OUT PXENVIF_POLLER *Poller
+ );
+
+extern NTSTATUS
+PollerConnect(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern NTSTATUS
+PollerStoreWrite(
+ IN PXENVIF_POLLER Poller,
+ IN PXENBUS_STORE_TRANSACTION Transaction
+ );
+
+extern NTSTATUS
+PollerEnable(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern VOID
+PollerDisable(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern VOID
+PollerDisconnect(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern VOID
+PollerTeardown(
+ IN PXENVIF_POLLER Poller
+ );
+
+#endif // _XENVIF_POLLER_H
<ClCompile Include="../../src/xenvif/mac.c" />
<ClCompile Include="../../src/xenvif/parse.c" />
<ClCompile Include="../../src/xenvif/pdo.c" />
+ <ClCompile Include="../../src/xenvif/poller.c" />
<ClCompile Include="../../src/xenvif/receiver.c" />
<ClCompile Include="../../src/xenvif/registry.c" />
<ClCompile Include="../../src/xenvif/settings.c" />