ULONG Dpcs;
ULONG Events;
BOOLEAN Connected;
- BOOLEAN Enabled;
USHORT RequestId;
struct xen_netif_ctrl_request Request;
struct xen_netif_ctrl_response Response;
BOOLEAN Notify;
NTSTATUS status;
+ status = STATUS_NOT_SUPPORTED;
+ if (!Controller->Connected)
+ goto fail1;
+
status = STATUS_INSUFFICIENT_RESOURCES;
if (RING_FULL(&Controller->Front))
- goto fail1;
+ goto fail2;
Controller->Request.type = Type;
Controller->Request.id = Controller->RequestId++;
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n", status);
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
__ControllerAcquireLock(Controller);
- if (Controller->Enabled) {
+ if (Controller->Connected) {
KeMemoryBarrier();
if (Controller->Shared->rsp_prod != rsp_prod &&
- Controller->Front.rsp_cons == rsp_cons) {
+ Controller->Front.rsp_cons == rsp_cons) {
XENBUS_DEBUG(Trigger,
&Controller->DebugInterface,
Controller->DebugCallback);
__ControllerAcquireLock(Controller);
- if (Controller->Enabled)
+ if (Controller->Connected)
ControllerPoll(Controller);
__ControllerReleaseLock(Controller);
IN PXENVIF_CONTROLLER Controller
)
{
- Trace("====>\n");
-
- __ControllerAcquireLock(Controller);
+ UNREFERENCED_PARAMETER(Controller);
- Controller->Enabled = TRUE;
-
- __ControllerReleaseLock(Controller);
-
- Trace("<====\n");
+ Trace("<===>\n");
}
VOID
IN PXENVIF_CONTROLLER Controller
)
{
- Trace("====>\n");
-
- __ControllerAcquireLock(Controller);
-
- Controller->Enabled = FALSE;
+ UNREFERENCED_PARAMETER(Controller);
- __ControllerReleaseLock(Controller);
-
- Trace("<====\n");
+ Trace("<===>\n");
}
VOID
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Connected)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM,
Algorithm,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS,
0,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, Flags);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Connected)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS,
Flags,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Controller->Mdl == NULL)
- goto fail2;
+ goto fail1;
Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
ASSERT(Buffer != NULL);
FALSE,
&Entry);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_KEY,
Size,
0);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail3;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
return STATUS_SUCCESS;
-fail5:
- Error("fail5\n");
-
fail4:
Error("fail4\n");
+fail3:
+ Error("fail3\n");
+
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
Controller->GnttabCache,
TRUE,
Entry);
-fail3:
- Error("fail3\n");
-
- __FreePage(Mdl);
-
fail2:
Error("fail2\n");
+ __FreePage(Mdl);
+
fail1:
Error("fail1 (%08x)\n", status);
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE,
0,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, Size);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE,
Size,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = STATUS_INVALID_PARAMETER;
if (Size * sizeof (ULONG) > PAGE_SIZE)
- goto fail2;
+ goto fail1;
Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Controller->Mdl == NULL)
- goto fail3;
+ goto fail2;
Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
ASSERT(Buffer != NULL);
FALSE,
&Entry);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail3;
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING,
Size,
Offset);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail5;
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
return STATUS_SUCCESS;
-fail6:
- Error("fail6\n");
-
fail5:
Error("fail5\n");
+fail4:
+ Error("fail4\n");
+
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
Controller->GnttabCache,
TRUE,
Entry);
-fail4:
- Error("fail4\n");
-
- __FreePage(Mdl);
-
fail3:
Error("fail3\n");
+ __FreePage(Mdl);
+
fail2:
Error("fail2\n");
static FORCEINLINE NTSTATUS
__FrontendUpdateHash(
- IN PXENVIF_FRONTEND Frontend
+ PXENVIF_FRONTEND Frontend,
+ PXENVIF_FRONTEND_HASH Hash
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
- PXENVIF_CONTROLLER Controller;
- ULONG Zero = 0;
- ULONG Size;
- PULONG Mapping;
- ULONG Flags;
- NTSTATUS status;
+ PXENVIF_CONTROLLER Controller;
+ ULONG Zero = 0;
+ ULONG Size;
+ PULONG Mapping;
+ ULONG Flags;
+ NTSTATUS status;
Controller = __FrontendGetController(Frontend);
return status;
}
-NTSTATUS
-FrontendUpdateHash(
- IN PXENVIF_FRONTEND Frontend
- )
-{
- KIRQL Irql;
- NTSTATUS status;
-
- KeAcquireSpinLock(&Frontend->Lock, &Irql);
- status = __FrontendUpdateHash(Frontend);
- KeReleaseSpinLock(&Frontend->Lock, Irql);
-
- return status;
-}
-
NTSTATUS
FrontendSetHashAlgorithm(
IN PXENVIF_FRONTEND Frontend,
IN XENVIF_PACKET_HASH_ALGORITHM Algorithm
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
NTSTATUS status;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
- if (Algorithm == Hash->Algorithm)
- goto done;
-
switch (Algorithm) {
case XENVIF_PACKET_HASH_ALGORITHM_NONE:
case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
(Algorithm == XENVIF_PACKET_HASH_ALGORITHM_TOEPLITZ) ? "TOEPLITZ" :
"");
- Hash->Algorithm = Algorithm;
+ Hash = Frontend->Hash;
+
+ Hash.Algorithm = Algorithm;
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Frontend->Hash = Hash;
-done:
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n");
IN ULONG Size
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
NTSTATUS status;
if (Size > XENVIF_FRONTEND_MAXIMUM_HASH_MAPPING_SIZE)
goto fail1;
- RtlCopyMemory(Hash->Mapping, Mapping, sizeof (ULONG) * Size);
- Hash->Size = Size;
+ Hash = Frontend->Hash;
+
+ RtlCopyMemory(Hash.Mapping, Mapping, sizeof (ULONG) * Size);
+ Hash.Size = Size;
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Frontend->Hash = Hash;
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n", status);
IN PUCHAR Key
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
+ NTSTATUS status;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
- RtlCopyMemory(Hash->Key, Key, XENVIF_VIF_HASH_KEY_SIZE);
+ Hash = Frontend->Hash;
+
+ RtlCopyMemory(Hash.Key, Key, XENVIF_VIF_HASH_KEY_SIZE);
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ Frontend->Hash = Hash;
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ KeReleaseSpinLock(&Frontend->Lock, Irql);
+
+ return status;
}
NTSTATUS
IN ULONG Types
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
ULONG Flags;
+ NTSTATUS status;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
+ Hash = Frontend->Hash;
+
Flags = 0;
if (Types & (1 << XENVIF_PACKET_HASH_TYPE_IPV4))
Flags |= XEN_NETIF_CTRL_HASH_TYPE_IPV4;
if (Types & (1 << XENVIF_PACKET_HASH_TYPE_IPV6_TCP))
Flags |= XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP;
- Hash->Flags = Flags;
+ Hash.Flags = Flags;
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ Frontend->Hash = Hash;
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ KeReleaseSpinLock(&Frontend->Lock, Irql);
+
+ return status;
}
ULONG
IN ULONG Value
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
ULONG Queue;
- switch (Hash->Algorithm) {
+ switch (Frontend->Hash.Algorithm) {
case XENVIF_PACKET_HASH_ALGORITHM_NONE:
case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
Queue = Value % __FrontendGetNumQueues(Frontend);
break;
case XENVIF_PACKET_HASH_ALGORITHM_TOEPLITZ:
- Queue = Hash->Mapping[Value % Hash->Size];
+ Queue = Frontend->Hash.Mapping[Value % Frontend->Hash.Size];
break;
default:
break;
case XenbusStateConnected:
+ case XenbusStateClosed:
break;
default:
if (!NT_SUCCESS(status))
goto fail3;
- status = __FrontendUpdateHash(Frontend);
+ status = __FrontendUpdateHash(Frontend, &Frontend->Hash);
if (!NT_SUCCESS(status))
goto fail4;