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

Re: [PATCH v2] Add VIF interface V11


  • To: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Thu, 15 Oct 2026 14:49:07 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4SM9eHClurMoMRA6hJv0sSlcQCmkC7Oc52Lzk7llyz0=; b=xFrzs6yrMl+BlC9lub6VUSlzFJJai+UQjQvJ4/UFXTI3twmxizQGD5iZMrvKE1dDKTXvZuZhAw6YNznDyjsCPkQWUNWaKKQFV6lGvCA0y5kVWx1Qd8FbHD7ZBUb1knJq0E+dwoHC0kptPANhMEARQUNeYeHPp3B1BfTPzaP81O3SshTSeS3MDeNxqWRKWFl8VRB0iCiiSp8K5TNUPHkTgva2UPZnBkjqxs9d9W6+7cx9xhdLBtll0b+qAb9Plrr7MvUa6DsSujIck5WbzhQV1DIHgjt9BPSHS488AiuDsuBUBQcypeGHBLQOAwYqJr8LpWj/fSYAAgTaeA9SVwlxUQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iIbwcxCXbYUGMxwvmUQmhmdqkP4sh7KCm0JFyWcckolyuPExBzGggzbDla3tNbvw64SJNJtfXXTyFgolmPlTJnxAIpVWVS0NUkeHZ5YJB+ZGOkhuety/Tq5ngujz8WvBdeb2P4Brw+cvYS4LRDO1I4XADgPB/xp4NwNFfR09I9/uL7tTuUaynF2ZgxW5J5fTdBQ0CVs99G7GQbZOieUNpojNfQ0oiq1UW6XDhnNeoKNBER6knKWJ1Jc+YtH7SqAzXd8zyY9B21vRc7aiK5bhQ83ZWKLgN/O6OIzOSq5Qf+YptPDQOIBdAukDLMX65zcwfvIZLhnvyOd+c2tfmgbZ8A==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Delivery-date: Thu, 15 Oct 2026 14:49:13 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Msip_labels:
  • Thread-index: AQHdXKdmwkEwrN5370eHhtPesbg0q7b+r0rO
  • Thread-topic: [PATCH v2] Add VIF interface V11

Reviewed-by: Owen Smith <owen.smith@xxxxxxxxxx>

________________________________________
From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> on behalf of Tu 
Dinh <ngoc-tu.dinh@xxxxxxxxxx>
Sent: 15 October 2026 2:15 PM
To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Cc: Tu Dinh
Subject: [PATCH v2] Add VIF interface V11

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®.