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

[PATCH 3/3] Report IP network prefix in XenStore


  • To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Date: Mon, 27 Jul 2026 10:00:12 +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:In-Reply-To:References:Feedback-ID"
  • Cc: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Delivery-date: Mon, 27 Jul 2026 08:00:30 +0000
  • Feedback-id: default:8631fc262581453bbf619ec5b2062170:Sweego
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

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 481fcee..e4d01fc 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;
 
@@ -724,6 +730,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;
 }
 
@@ -735,7 +761,7 @@ FrontendDumpIPv6Address(
     _In_ PXENVIF_ADDRESS            Entry
     )
 {
-    CHAR                            Node[sizeof ("ipv6/XXXXXXXXXX")];
+    CHAR                            Node[sizeof ("ipv6/XXXXXXXXXX/prefix")];
     ULONG                           Index;
     ULONG                           Count;
     ULONG                           ZeroIndex;
@@ -823,6 +849,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®.