]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Add version 9 of XENVIF_VIF_INTERFACE
authorPaul Durrant <pdurrant@amazon.com>
Fri, 10 Jun 2022 14:05:57 +0000 (15:05 +0100)
committerPaul Durrant <pdurrant@amazon.com>
Tue, 14 Jun 2022 13:49:46 +0000 (14:49 +0100)
This changes XENVIF_VIF_CALLBACK from a varargs function into function taking
a pointer to a new XENVIF_VIF_CALLBACK_PARAMETERS union which is now used to
pass all the arguments specific to the callback type.
To maintain support for version 8 clients a VifCallbackVersion8() function is
added as a shim to unpack the parameters structure and call the client's
varargs callback function.

Signed-off-by: Paul Durrant <pdurrant@amazon.com>
include/revision.h
include/vif_interface.h
src/xenvif/vif.c

index 9920b4c7314da7d759942bb0f69bd0f39b39d274..64e6e34ae14a786fdf96e9321bc3d6aa09a093f6 100644 (file)
@@ -41,6 +41,7 @@
 //                    REVISION   C   V   ST  SU
 #define DEFINE_REVISION_TABLE                       \
     DEFINE_REVISION(0x09000000,  1,  8,  2,  1),    \
-    DEFINE_REVISION(0x09000001,  2,  8,  2,  1)
+    DEFINE_REVISION(0x09000001,  2,  8,  2,  1),    \
+    DEFINE_REVISION(0x09000002,  2,  9,  2,  1)
 
 #endif  // _REVISION_H
index 0e51294524131bab18d87bab70dd05bea07ce291..c157c5ca798e5dc99673cf64eaffb5849188e2bc 100644 (file)
@@ -388,6 +388,49 @@ typedef enum _XENVIF_VIF_CALLBACK_TYPE {
     XENVIF_MAC_STATE_CHANGE
 } XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
 
+/*! \typedef XENVIF_VIF_CALLBACK_PARAMETERS_V9
+    \brief VIF interface version 9 parameters for provider to subscriber callback function
+
+    \b XENVIF_TRANSMITTER_RETURN_PACKET:
+    \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+    \param Completion Packet completion information
+
+    \b XENVIF_RECEIVER_QUEUE_PACKET:
+    \param Index The index of the queue on which the packet was received
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param Flags Packet checksum flags
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Info Header information for the packet
+    \param Hash Hash information for the packet
+    \param More A flag to indicate whether more packets will be queued for the same CPU
+    \param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
+
+    \b XENVIF_MAC_STATE_CHANGE:
+    No additional arguments
+*/
+union _XENVIF_VIF_CALLBACK_PARAMETERS_V9 {
+    struct {
+        PVOID                                       Cookie;
+        PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion;
+    } TransmitterReturnPacket;
+    struct {
+        ULONG                           Index;
+        PMDL                            Mdl;
+        ULONG                           Offset;
+        ULONG                           Length;
+        XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+        USHORT                          MaximumSegmentSize;
+        USHORT                          TagControlInformation;
+        PXENVIF_PACKET_INFO             Info;
+        PXENVIF_PACKET_HASH             Hash;
+        BOOLEAN                         More;
+        PVOID                           Cookie;
+    } ReceiverQueuePacket;
+};
+
 /*! \typedef XENVIF_VIF_ACQUIRE
     \brief Acquire a reference to the VIF interface
 
@@ -408,38 +451,34 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+typedef VOID
+(*XENVIF_VIF_CALLBACK_V8)(
+    IN  PVOID                       Argument OPTIONAL,
+    IN  XENVIF_VIF_CALLBACK_TYPE    Type,
+    ...
+    );
+
+typedef union _XENVIF_VIF_CALLBACK_PARAMETERS_V9 XENVIF_VIF_CALLBACK_PARAMETERS, *PXENVIF_VIF_CALLBACK_PARAMETERS;
+
 /*! \typedef XENVIF_VIF_CALLBACK
     \brief Provider to subscriber callback function
 
     \param Argument An optional context argument passed to the callback
     \param Type The callback type
-    \param ... Additional paramaters required by \a Type
-
-    \b XENVIF_TRANSMITTER_RETURN_PACKET:
-    \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
-    \param Completion Packet completion information
-
-    \b XENVIF_RECEIVER_QUEUE_PACKET:
-    \param Index The index of the queue on which the packet was received
-    \param Mdl The initial MDL of the packet
-    \param Offset The offset of the packet data in the initial MDL
-    \param Length The total length of the packet
-    \param Flags Packet checksum flags
-    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
-    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
-    \param Info Header information for the packet
-    \param Hash Hash information for the packet
-    \param More A flag to indicate whether more packets will be queued for the same CPU
-    \param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
-
-    \b XENVIF_MAC_STATE_CHANGE:
-    No additional arguments
+    \param Parameters The callback parameters
 */
 typedef VOID
 (*XENVIF_VIF_CALLBACK)(
-    IN  PVOID                       Argument OPTIONAL,
-    IN  XENVIF_VIF_CALLBACK_TYPE    Type,
-    ...
+    IN  PVOID                           Argument OPTIONAL,
+    IN  XENVIF_VIF_CALLBACK_TYPE        Type,
+    IN  PXENVIF_VIF_CALLBACK_PARAMETERS Parameters
+    );
+
+typedef NTSTATUS
+(*XENVIF_VIF_ENABLE_V8)(
+    IN  PINTERFACE              Interface,
+    IN  XENVIF_VIF_CALLBACK_V8  Callback,
+    IN  PVOID                   Argument OPTIONAL
     );
 
 /*! \typedef XENVIF_VIF_ENABLE
@@ -818,6 +857,40 @@ DEFINE_GUID(GUID_XENVIF_VIF_INTERFACE,
     \ingroup interfaces
 */
 struct _XENVIF_VIF_INTERFACE_V8 {
+    INTERFACE                                       Interface;
+    XENVIF_VIF_ACQUIRE                              Acquire;
+    XENVIF_VIF_RELEASE                              Release;
+    XENVIF_VIF_ENABLE_V8                            EnableVersion8;
+    XENVIF_VIF_DISABLE                              Disable;
+    XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
+    XENVIF_VIF_QUERY_RING_COUNT                     QueryRingCount;
+    XENVIF_VIF_UPDATE_HASH_MAPPING                  UpdateHashMapping;
+    XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
+    XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
+    XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
+    XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
+    XENVIF_VIF_RECEIVER_SET_HASH_ALGORITHM          ReceiverSetHashAlgorithm;
+    XENVIF_VIF_RECEIVER_QUERY_HASH_CAPABILITIES     ReceiverQueryHashCapabilities;
+    XENVIF_VIF_RECEIVER_UPDATE_HASH_PARAMETERS      ReceiverUpdateHashParameters;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKET             TransmitterQueuePacket;
+    XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
+    XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
+    XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
+    XENVIF_VIF_MAC_QUERY_STATE                      MacQueryState;
+    XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE         MacQueryMaximumFrameSize;
+    XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS          MacQueryPermanentAddress;
+    XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS            MacQueryCurrentAddress;
+    XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES        MacQueryMulticastAddresses;
+    XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES          MacSetMulticastAddresses;
+    XENVIF_VIF_MAC_SET_FILTER_LEVEL                 MacSetFilterLevel;
+    XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
+};
+
+/*! \struct _XENVIF_VIF_INTERFACE_V9
+    \brief VIF interface version 9
+    \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V9 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
@@ -847,7 +920,7 @@ struct _XENVIF_VIF_INTERFACE_V8 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-typedef struct _XENVIF_VIF_INTERFACE_V8 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V9 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
 
 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -858,6 +931,6 @@ typedef struct _XENVIF_VIF_INTERFACE_V8 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER
 #endif  // _WINDLL
 
 #define XENVIF_VIF_INTERFACE_VERSION_MIN    8
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    8
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    9
 
 #endif  // _XENVIF_INTERFACE_H
index 33aceed5bba8c0630a131ca4d6452239cff05def..102f24d1288822fc6d94e01a5a6894937cd0810e 100644 (file)
@@ -53,6 +53,8 @@ struct _XENVIF_VIF_CONTEXT {
     ULONG                       Version;
     XENVIF_VIF_CALLBACK         Callback;
     PVOID                       Argument;
+    XENVIF_VIF_CALLBACK_V8      CallbackVersion8;
+    PVOID                       ArgumentVersion8;
     PXENVIF_THREAD              MacThread;
     KEVENT                      MacEvent;
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
@@ -104,10 +106,9 @@ VifMac(
 
         if (ThreadIsAlerted(Self))
             break;
-        
+
         if (Context->Enabled)
-            Context->Callback(Context->Argument,
-                              XENVIF_MAC_STATE_CHANGE);
+            Context->Callback(Context->Argument, XENVIF_MAC_STATE_CHANGE, NULL);
 
         KeSetEvent(&Context->MacEvent, IO_NO_INCREMENT, FALSE);
     }
@@ -236,6 +237,93 @@ fail1:
     return status;
 }
 
+static VOID
+VifCallbackVersion8(
+    IN  PVOID                           _Argument OPTIONAL,
+    IN  XENVIF_VIF_CALLBACK_TYPE        Type,
+    IN  PXENVIF_VIF_CALLBACK_PARAMETERS Parameters
+    )
+{
+    PXENVIF_VIF_CONTEXT                 Context = _Argument;
+    XENVIF_VIF_CALLBACK_V8              Callback = Context->CallbackVersion8;
+    PVOID                               Argument = Context->ArgumentVersion8;
+
+    switch (Type) {
+    case XENVIF_TRANSMITTER_RETURN_PACKET: {
+        PVOID                                       Cookie = Parameters->TransmitterReturnPacket.Cookie;
+        PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion = Parameters->TransmitterReturnPacket.Completion;
+
+        Callback(Argument,
+                 XENVIF_TRANSMITTER_RETURN_PACKET,
+                 Cookie,
+                 Completion);
+        break;
+    }
+    case XENVIF_RECEIVER_QUEUE_PACKET: {
+        ULONG                           Index = Parameters->ReceiverQueuePacket.Index;
+        PMDL                            Mdl = Parameters->ReceiverQueuePacket.Mdl;
+        ULONG                           Offset = Parameters->ReceiverQueuePacket.Offset;
+        ULONG                           Length=  Parameters->ReceiverQueuePacket.Length;
+        XENVIF_PACKET_CHECKSUM_FLAGS    Flags = Parameters->ReceiverQueuePacket.Flags;
+        USHORT                          MaximumSegmentSize = Parameters->ReceiverQueuePacket.MaximumSegmentSize;
+        USHORT                          TagControlInformation = Parameters->ReceiverQueuePacket.TagControlInformation;
+        PXENVIF_PACKET_INFO             Info = Parameters->ReceiverQueuePacket.Info;
+        PXENVIF_PACKET_HASH             Hash = Parameters->ReceiverQueuePacket.Hash;
+        BOOLEAN                         More = Parameters->ReceiverQueuePacket.More;
+        PVOID                           Cookie = Parameters->ReceiverQueuePacket.Cookie;
+
+        Callback(Argument,
+                 XENVIF_RECEIVER_QUEUE_PACKET,
+                 Index,
+                 Mdl,
+                 Offset,
+                 Length,
+                 Flags,
+                 MaximumSegmentSize,
+                 TagControlInformation,
+                 Info,
+                 Hash,
+                 More,
+                 Cookie);
+        break;
+    }
+    case XENVIF_MAC_STATE_CHANGE:
+        Callback(Argument, XENVIF_MAC_STATE_CHANGE);
+        break;
+
+    default:
+        ASSERT(FALSE);
+        break;
+    }
+}
+
+static NTSTATUS
+VifEnableVersion8(
+    IN  PINTERFACE                  Interface,
+    IN  XENVIF_VIF_CALLBACK_V8      Callback,
+    IN  PVOID                       Argument
+    )
+{
+    PXENVIF_VIF_CONTEXT             Context = Interface->Context;
+    KIRQL                           Irql;
+    NTSTATUS                        status;
+
+    Trace("====>\n");
+
+    AcquireMrswLockExclusive(&Context->Lock, &Irql);
+
+    Context->CallbackVersion8 = Callback;
+    Context->ArgumentVersion8 = Argument;
+
+    ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
+
+    status = VifEnable(Interface, VifCallbackVersion8, Context);
+
+    Trace("<====\n");
+
+    return status;
+}
+
 static VOID
 VifDisable(
     IN  PINTERFACE      Interface
@@ -287,6 +375,9 @@ VifDisable(
     Context->Argument = NULL;
     Context->Callback = NULL;
 
+    Context->ArgumentVersion8 = NULL;
+    Context->CallbackVersion8 = NULL;
+
     ReleaseMrswLockShared(&Context->Lock);
 
 done:
@@ -793,6 +884,36 @@ static struct _XENVIF_VIF_INTERFACE_V8 VifInterfaceVersion8 = {
     { sizeof (struct _XENVIF_VIF_INTERFACE_V8), 8, NULL, NULL, NULL },
     VifAcquire,
     VifRelease,
+    VifEnableVersion8,
+    VifDisable,
+    VifQueryStatistic,
+    VifQueryRingCount,
+    VifUpdateHashMapping,
+    VifReceiverReturnPacket,
+    VifReceiverSetOffloadOptions,
+    VifReceiverSetBackfillSize,
+    VifReceiverQueryRingSize,
+    VifReceiverSetHashAlgorithm,
+    VifReceiverQueryHashCapabilities,
+    VifReceiverUpdateHashParameters,
+    VifTransmitterQueuePacket,
+    VifTransmitterQueryOffloadOptions,
+    VifTransmitterQueryLargePacketSize,
+    VifTransmitterQueryRingSize,
+    VifMacQueryState,
+    VifMacQueryMaximumFrameSize,
+    VifMacQueryPermanentAddress,
+    VifMacQueryCurrentAddress,
+    VifMacQueryMulticastAddresses,
+    VifMacSetMulticastAddresses,
+    VifMacSetFilterLevel,
+    VifMacQueryFilterLevel
+};
+
+static struct _XENVIF_VIF_INTERFACE_V9 VifInterfaceVersion9 = {
+    { sizeof (struct _XENVIF_VIF_INTERFACE_V9), 9, NULL, NULL, NULL },
+    VifAcquire,
+    VifRelease,
     VifEnable,
     VifDisable,
     VifQueryStatistic,
@@ -900,6 +1021,23 @@ VifGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 9: {
+        struct _XENVIF_VIF_INTERFACE_V9 *VifInterface;
+
+        VifInterface = (struct _XENVIF_VIF_INTERFACE_V9 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V9))
+            break;
+
+        *VifInterface = VifInterfaceVersion9;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;
@@ -935,38 +1073,6 @@ VifTeardown(
     Trace("<====\n");
 }
 
-static FORCEINLINE VOID
-__VifReceiverQueuePacket(
-    IN  PXENVIF_VIF_CONTEXT             Context,
-    IN  ULONG                           Index,
-    IN  PMDL                            Mdl,
-    IN  ULONG                           Offset,
-    IN  ULONG                           Length,
-    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
-    IN  USHORT                          MaximumSegmentSize,
-    IN  USHORT                          TagControlInformation,
-    IN  PXENVIF_PACKET_INFO             Info,
-    IN  PXENVIF_PACKET_HASH             Hash,
-    IN  BOOLEAN                         More,
-    IN  PVOID                           Cookie
-    )
-{
-    Context->Callback(Context->Argument,
-                      XENVIF_RECEIVER_QUEUE_PACKET,
-                      Index,
-                      Mdl,
-                      Offset,
-                      Length,
-                      Flags,
-                      MaximumSegmentSize,
-                      TagControlInformation,
-                      Info,
-                      Hash,
-                      More,
-                      Cookie);
-
-}
-
 VOID
 VifReceiverQueuePacket(
     IN  PXENVIF_VIF_CONTEXT             Context,
@@ -984,29 +1090,25 @@ VifReceiverQueuePacket(
     )
 {
     KIRQL                               Irql;
+    XENVIF_VIF_CALLBACK_PARAMETERS      Parameters;
+
+    RtlZeroMemory(&Parameters, sizeof (XENVIF_VIF_CALLBACK_PARAMETERS));
 
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    switch (Context->Version) {
-    case 8:
-        __VifReceiverQueuePacket(Context,
-                                 Index,
-                                 Mdl,
-                                 Offset,
-                                 Length,
-                                 Flags,
-                                 MaximumSegmentSize,
-                                 TagControlInformation,
-                                 Info,
-                                 Hash,
-                                 More,
-                                 Cookie);
-        break;
+    Parameters.ReceiverQueuePacket.Index = Index;
+    Parameters.ReceiverQueuePacket.Mdl = Mdl;
+    Parameters.ReceiverQueuePacket.Offset = Offset;
+    Parameters.ReceiverQueuePacket.Length = Length;
+    Parameters.ReceiverQueuePacket.Flags = Flags;
+    Parameters.ReceiverQueuePacket.MaximumSegmentSize = MaximumSegmentSize;
+    Parameters.ReceiverQueuePacket.TagControlInformation = TagControlInformation;
+    Parameters.ReceiverQueuePacket.Info = Info;
+    Parameters.ReceiverQueuePacket.Hash = Hash;
+    Parameters.ReceiverQueuePacket.More = More;
+    Parameters.ReceiverQueuePacket.Cookie = Cookie;
 
-    default:
-        ASSERT(FALSE);
-        break;
-    }
+    Context->Callback(Context->Argument, XENVIF_RECEIVER_QUEUE_PACKET, &Parameters);
 
     KeLowerIrql(Irql);
 }
@@ -1018,18 +1120,14 @@ VifTransmitterReturnPacket(
     IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
     )
 {
-    switch (Context->Version) {
-    case 8:
-        Context->Callback(Context->Argument,
-                          XENVIF_TRANSMITTER_RETURN_PACKET,
-                          Cookie,
-                          Completion);
-        break;
+    XENVIF_VIF_CALLBACK_PARAMETERS                  Parameters;
 
-    default:
-        ASSERT(FALSE);
-        break;
-    }
+    RtlZeroMemory(&Parameters, sizeof (XENVIF_VIF_CALLBACK_PARAMETERS));
+
+    Parameters.TransmitterReturnPacket.Cookie = Cookie;
+    Parameters.TransmitterReturnPacket.Completion = Completion;
+
+    Context->Callback(Context->Argument, XENVIF_TRANSMITTER_RETURN_PACKET, &Parameters);
 }
 
 PXENVIF_THREAD