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

Re: [PATCH v2 3/3] Report IP network prefix in XenStore


  • To: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Wed, 29 Jul 2026 08:22:02 +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=82F9JJsV+rTtZ9cdQkkDgOYw4Vo/utWgHos4HlCk9kU=; b=h/q47kaeO2zqnfKh94JxuIFmdeNeQulKBQVUSBf/EUkkOIl1YFadsdreWBQvnCMctbyPwDd1gsHSF8HF3hhFDTfX8GbZF/R7EjneVoPKqPxxo8ZA4HpFtLyH8WilmKGFsDA+qlgjA+BPS9WLgOUUFfd8PXW3XRxNz7vyK7gU6ujmBBYWwQiUqxNa6xhuv47onW9L641yJVnNe42f91s2KuvXPBMDlLgxJKy/JnZLeRQ+VA2y5SycqQd1LP3+D7NfrOEyp/tjxr8y+BV4NB0r/Cd+rp4B+XX6VwNGxRomnjO2MQb/+gpzZT96IiWn62TiUz8eZTmoGrOfOrPwZ2a03A==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AFmBW+mVc7Tv7YlHk/C6AGbf3P8P1ui8b21K3S1/khQDFOvT9aUNhhU7QjTPAtasPWcb2d1UbDMZMgErj73UyNwuScNkCP5Ot919NHnaysK0MAnf8awp2JP2ymWTOR/7CoXjBk+xSSh2CgcMA6gTKgeYQtS/dS2qnhJ0nLAClc7l8fIPcW1I5XPtLA8Jfc/yd1hxXtYKMk52Nn3ISc6fGhsGL0cFtUmTZqNXeHqtBsdUnZzYbo7mwN/rc3tEhLAfTHA7t7VzExO30O82gEFJdsi535LO7ML4zz1iD33OMsCfZP0qq3ehB6Dq/i/leagSUzQ5/29xCJxhEnLXD9Gsbg==
  • 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: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Delivery-date: Wed, 29 Jul 2026 08:22:08 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Msip_labels:
  • Thread-index: AQHdHp+pGfAliILHYk2zgX4h/h1sYbaEKWlW
  • Thread-topic: [PATCH v2 3/3] Report IP network prefix in XenStore

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: 28 July 2026 3:44 PM
To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Cc: Tu Dinh
Subject: [PATCH v2 3/3] Report IP network prefix in XenStore

xenstore-paths.pandoc 644ea6f84510 specified a new key "~/attr/vif/
$DEVID/ipv4/$INDEX/prefix" for reporting network prefixes.

Resolve this info from MIB_UNICASTIPADDRESS_ROW.OnLinkPrefixLength for
reporting.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
 src/xenvif/frontend.c | 60 ++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 53 insertions(+), 7 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 680a338..086d0df 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -69,6 +69,7 @@ typedef struct _XENVIF_FRONTEND_HASH {

 typedef struct _XENVIF_ADDRESS {
     SOCKADDR_INET               Address;
+    UINT8                       Prefix;
 } XENVIF_ADDRESS, *PXENVIF_ADDRESS;

 struct _XENVIF_FRONTEND {
@@ -541,7 +542,8 @@ found:
 static NTSTATUS
 FrontendInsertAddress(
     IN  PXENVIF_FRONTEND    Frontend,
-    IN  const SOCKADDR_INET *Address
+    IN  const SOCKADDR_INET *Address,
+    IN  UINT8               Prefix
     )
 {
     ULONG                   Index;
@@ -559,14 +561,16 @@ FrontendInsertAddress(
         if (Address->si_family == AF_INET) {
             if (RtlEqualMemory(&Address->Ipv4.sin_addr.s_addr,
                                &Entry->Address.Ipv4.sin_addr.s_addr,
-                                 IPV4_ADDRESS_LENGTH))
+                                 IPV4_ADDRESS_LENGTH) &&
+                Prefix == Entry->Prefix)
                 goto done;
         } else {
             ASSERT3U(Address->si_family, ==, AF_INET6);

             if (RtlEqualMemory(&Address->Ipv6.sin6_addr.s6_addr,
                                &Entry->Address.Ipv6.sin6_addr.s6_addr,
-                               IPV6_ADDRESS_LENGTH))
+                               IPV6_ADDRESS_LENGTH) &&
+                Prefix == Entry->Prefix)
                 goto done;
         }
     }
@@ -585,7 +589,7 @@ FrontendInsertAddress(
     if (Frontend->AddressCount != 0)
         __FrontendFree(Frontend->AddressTable);

-    Table[Frontend->AddressCount++] = (XENVIF_ADDRESS){ *Address };
+    Table[Frontend->AddressCount++] = (XENVIF_ADDRESS){ *Address, Prefix };
     Frontend->AddressTable = Table;

 done:
@@ -627,7 +631,9 @@ FrontendProcessAddressTable(
             Row->Address.si_family != AF_INET6)
             continue;

-        status = FrontendInsertAddress(Frontend, &Row->Address);
+        status = FrontendInsertAddress(Frontend,
+                                       &Row->Address,
+                                       Row->OnLinkPrefixLength);
         if (!NT_SUCCESS(status))
             goto fail1;
     }
@@ -685,7 +691,7 @@ FrontendDumpIPv4Address(
     _In_ PXENVIF_ADDRESS            Entry
     )
 {
-    CHAR                            Node[sizeof ("ipv4/XXXXXXXXXX")];
+    CHAR                            Node[sizeof ("ipv4/XXXXXXXXXX/prefix")];
     PIN_ADDR                        Address;
     NTSTATUS                        status;

@@ -711,6 +717,26 @@ FrontendDumpIPv4Address(
     if (!NT_SUCCESS(status))
         return status;

+    if (Entry->Prefix > 32)
+        return STATUS_SUCCESS;
+
+    status = RtlStringCbPrintfA(Node,
+                                sizeof (Node),
+                                "ipv4/%u/prefix",
+                                AddressIndex);
+    if (!NT_SUCCESS(status))
+        return status;
+
+    status = XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          Transaction,
+                          __FrontendGetPrefix(Frontend),
+                          Node,
+                          "%hhu",
+                          Entry->Prefix);
+    if (!NT_SUCCESS(status))
+        return status;
+
     return STATUS_SUCCESS;
 }

@@ -722,7 +748,7 @@ FrontendDumpIPv6Address(
     _In_ PXENVIF_ADDRESS            Entry
     )
 {
-    CHAR                            Node[sizeof ("ipv6/XXXXXXXXXX")];
+    CHAR                            Node[sizeof ("ipv6/XXXXXXXXXX/prefix")];
     ULONG                           Index;
     ULONG                           Count;
     ULONG                           ZeroIndex;
@@ -810,6 +836,26 @@ FrontendDumpIPv6Address(
     if (!NT_SUCCESS(status))
         return status;

+    if (Entry->Prefix > 128)
+        return STATUS_SUCCESS;
+
+    status = RtlStringCbPrintfA(Node,
+                                sizeof (Node),
+                                "ipv6/%u/prefix",
+                                AddressIndex);
+    if (!NT_SUCCESS(status))
+        return status;
+
+    status = XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          Transaction,
+                          __FrontendGetPrefix(Frontend),
+                          Node,
+                          "%hhu",
+                          Entry->Prefix);
+    if (!NT_SUCCESS(status))
+        return status;
+
     return STATUS_SUCCESS;
 }

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