[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2] Add VIF interface V11


  • To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Date: Thu, 15 Oct 2026 15:15:51 +0200
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=vates.tech header.i="@vates.tech" header.h="From:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Feedback-ID"
  • Cc: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Delivery-date: Thu, 15 Oct 2026 13:16:05 +0000
  • Feedback-id: default:8631fc262581453bbf619ec5b2062170:Sweego
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

This version makes Count optional, and adds a MaxCount output to
QueryRingCount that represents the maximum number of rings supported by
the current XenVif.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
v2: Make QueryRingCount take both parameters as _Out_opt_.
---
 include/revision.h      |  3 +-
 include/vif_interface.h | 61 ++++++++++++++++++++++++++++++++----
 src/xenvif/vif.c        | 68 ++++++++++++++++++++++++++++++++++++++---
 3 files changed, 121 insertions(+), 11 deletions(-)

diff --git a/include/revision.h b/include/revision.h
index d23639f..4e6a454 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -46,6 +46,7 @@
     DEFINE_REVISION(0x09000002,  2,  9,   2,  1,   1),  \
     DEFINE_REVISION(0x09000003,  2,  10,  2,  1,   1),  \
     DEFINE_REVISION(0x09000004,  2,  10,  2,  1,   2),  \
-    DEFINE_REVISION(0x09000005,  2,  10,  2,  1,   3)
+    DEFINE_REVISION(0x09000005,  2,  10,  2,  1,   3),  \
+    DEFINE_REVISION(0x09000006,  2,  11,  2,  1,   3)

 #endif  // _REVISION_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index cc2f626..3139b13 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -567,7 +567,7 @@ typedef NTSTATUS
     _Out_ PULONGLONG            Value
     );

-/*! \typedef XENVIF_VIF_QUERY_RING_COUNT
+/*! \typedef XENVIF_VIF_QUERY_RING_COUNT_V8
     \brief Query the number of shared rings between frontend
     and backend

@@ -575,11 +575,26 @@ typedef NTSTATUS
     \param Count Buffer to receive the count
 */
 typedef VOID
-(*XENVIF_VIF_QUERY_RING_COUNT)(
+(*XENVIF_VIF_QUERY_RING_COUNT_V8)(
     _In_ PINTERFACE Interface,
     _Out_ PULONG    Count
     );

+/*! \typedef XENVIF_VIF_QUERY_RING_COUNT
+    \brief Query the number of shared rings between frontend
+    and backend
+
+    \param Interface The interface header
+    \param Count Buffer to receive the count
+    \param MaxCount Buffer to receive the maximum possible ring count
+*/
+typedef VOID
+(*XENVIF_VIF_QUERY_RING_COUNT)(
+    _In_ PINTERFACE     Interface,
+    _Out_opt_ PULONG    Count,
+    _Out_opt_ PULONG    MaxCount
+    );
+
 /*! \typedef XENVIF_VIF_UPDATE_HASH_MAPPING
     \brief Update the mapping of hash to transmitter/receiver ring

@@ -900,7 +915,7 @@ struct _XENVIF_VIF_INTERFACE_V8 {
     XENVIF_VIF_ENABLE_V8                            EnableVersion8;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_QUERY_RING_COUNT                     QueryRingCount;
+    XENVIF_VIF_QUERY_RING_COUNT_V8                  QueryRingCountVersion8;
     XENVIF_VIF_UPDATE_HASH_MAPPING                  UpdateHashMapping;
     XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
@@ -934,7 +949,7 @@ struct _XENVIF_VIF_INTERFACE_V9 {
     XENVIF_VIF_ENABLE_V9                            EnableVersion9;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_QUERY_RING_COUNT                     QueryRingCount;
+    XENVIF_VIF_QUERY_RING_COUNT_V8                  QueryRingCountVersion8;
     XENVIF_VIF_UPDATE_HASH_MAPPING                  UpdateHashMapping;
     XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
@@ -962,6 +977,40 @@ struct _XENVIF_VIF_INTERFACE_V9 {
     \ingroup interfaces
 */
 struct _XENVIF_VIF_INTERFACE_V10 {
+    INTERFACE                                       Interface;
+    XENVIF_VIF_ACQUIRE                              Acquire;
+    XENVIF_VIF_RELEASE                              Release;
+    XENVIF_VIF_ENABLE                               Enable;
+    XENVIF_VIF_DISABLE                              Disable;
+    XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
+    XENVIF_VIF_QUERY_RING_COUNT_V8                  QueryRingCountVersion8;
+    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_V11
+    \brief VIF interface version 11
+    \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V11 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
@@ -991,7 +1040,7 @@ struct _XENVIF_VIF_INTERFACE_V10 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };

-typedef struct _XENVIF_VIF_INTERFACE_V10 XENVIF_VIF_INTERFACE, 
*PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V11 XENVIF_VIF_INTERFACE, 
*PXENVIF_VIF_INTERFACE;

 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -1002,6 +1051,6 @@ typedef struct _XENVIF_VIF_INTERFACE_V10 
XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTE
 #endif  // _WINDLL

 #define XENVIF_VIF_INTERFACE_VERSION_MIN    8
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    10
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    11

 #endif  // _XENVIF_INTERFACE_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 4937bb6..db44e37 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -538,18 +538,31 @@ done:
 static VOID
 VifQueryRingCount(
     _In_ PINTERFACE     Interface,
-    _Out_ PULONG        Count
+    _Out_opt_ PULONG    Count,
+    _Out_opt_ PULONG    MaxCount
     )
 {
     PXENVIF_VIF_CONTEXT Context = Interface->Context;

     AcquireMrswLockShared(&Context->Lock);

-    *Count = FrontendGetNumQueues(Context->Frontend);
+    if (Count)
+        *Count = FrontendGetNumQueues(Context->Frontend);
+    if (MaxCount)
+        *MaxCount = FrontendGetMaxQueues(Context->Frontend);

     ReleaseMrswLockShared(&Context->Lock);
 }

+static VOID
+VifQueryRingCountVersion8(
+    _In_ PINTERFACE Interface,
+    _Out_ PULONG    Count
+    )
+{
+    VifQueryRingCount(Interface, Count, NULL);
+}
+
 static NTSTATUS
 VifUpdateHashMapping(
     _In_ PINTERFACE         Interface,
@@ -1008,7 +1021,7 @@ static struct _XENVIF_VIF_INTERFACE_V8 
VifInterfaceVersion8 = {
     VifEnableVersion8,
     VifDisable,
     VifQueryStatistic,
-    VifQueryRingCount,
+    VifQueryRingCountVersion8,
     VifUpdateHashMapping,
     VifReceiverReturnPacket,
     VifReceiverSetOffloadOptions,
@@ -1038,7 +1051,7 @@ static struct _XENVIF_VIF_INTERFACE_V9 
VifInterfaceVersion9 = {
     VifEnableVersion9,
     VifDisable,
     VifQueryStatistic,
-    VifQueryRingCount,
+    VifQueryRingCountVersion8,
     VifUpdateHashMapping,
     VifReceiverReturnPacket,
     VifReceiverSetOffloadOptions,
@@ -1068,6 +1081,36 @@ static struct _XENVIF_VIF_INTERFACE_V10 
VifInterfaceVersion10 = {
     VifEnable,
     VifDisable,
     VifQueryStatistic,
+    VifQueryRingCountVersion8,
+    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_V11 VifInterfaceVersion11 = {
+    { sizeof (struct _XENVIF_VIF_INTERFACE_V11), 11, NULL, NULL, NULL },
+    VifAcquire,
+    VifRelease,
+    VifEnable,
+    VifDisable,
+    VifQueryStatistic,
     VifQueryRingCount,
     VifUpdateHashMapping,
     VifReceiverReturnPacket,
@@ -1211,6 +1254,23 @@ VifGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 11: {
+        struct _XENVIF_VIF_INTERFACE_V11 *VifInterface;
+
+        VifInterface = (struct _XENVIF_VIF_INTERFACE_V11 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V11))
+            break;
+
+        *VifInterface = VifInterfaceVersion11;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;
--
2.55.0.windows.3


--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.