[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/2] Dynamic multicast control
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@xxxxxxxxxx> --- src/xenvif/frontend.c | 41 +++++++++++++++++++++++++++++++ src/xenvif/frontend.h | 7 ++++++ src/xenvif/transmitter.c | 64 +++++++++++++++++++++++++++++++++++++++++++----- src/xenvif/transmitter.h | 6 +++++ src/xenvif/vif.c | 2 +- 5 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c index 8f5a492..e513790 100644 --- a/src/xenvif/frontend.c +++ b/src/xenvif/frontend.c @@ -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 diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h index d90f977..9cac412 100644 --- a/src/xenvif/frontend.h +++ b/src/xenvif/frontend.h @@ -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 diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index 7165ecc..5289c6c 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -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]; diff --git a/src/xenvif/transmitter.h b/src/xenvif/transmitter.h index 3e72b74..5e74667 100644 --- a/src/xenvif/transmitter.h +++ b/src/xenvif/transmitter.h @@ -146,4 +146,10 @@ TransmitterHasMulticastControl( IN PXENVIF_TRANSMITTER Transmitter ); +NTSTATUS +TransmitterRequestMulticastControl( + IN PXENVIF_TRANSMITTER Transmitter, + IN BOOLEAN Enabled + ); + #endif // _XENVIF_TRANSMITTER_H diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c index 74df4ac..ce94a56 100644 --- a/src/xenvif/vif.c +++ b/src/xenvif/vif.c @@ -819,7 +819,7 @@ VifMacSetFilterLevel( AcquireMrswLockShared(&Context->Lock); - status = MacSetFilterLevel(FrontendGetMac(Context->Frontend), Type, Level); + status = FrontendSetFilterLevel(Context->Frontend, Type, Level); ReleaseMrswLockShared(&Context->Lock); -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |