]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Publish network information to xenstore using documented paths
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 12 Nov 2015 14:57:49 +0000 (14:57 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 26 Nov 2015 17:42:10 +0000 (17:42 +0000)
My recent patch series to Xen added documented paths for advertising vif
hotplug capability and paths for publishing network interface information
(name, IP addresses, etc.).

This patch modifies XENVIF to make use of those new paths.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif/fdo.c
src/xenvif/frontend.c
src/xenvif/mac.c

index 0e69ba6e61fe7a4c20812ff02a18619fe503851d..82c3fd29fbddacd11fa62a12bde346c2ae513228 100644 (file)
@@ -1318,6 +1318,14 @@ __FdoD3ToD0(
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    (VOID) XENBUS_STORE(Printf,
+                        &Fdo->StoreInterface,
+                        NULL,
+                        "feature/hotplug",
+                        "vif",
+                        "%u",
+                        TRUE);
+
     Trace("<====\n");
 
     return STATUS_SUCCESS;
@@ -1337,6 +1345,12 @@ __FdoD0ToD3(
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
+    (VOID) XENBUS_STORE(Remove,
+                        &Fdo->StoreInterface,
+                        NULL,
+                        "feature/hotplug",
+                        "vif");
+
     (VOID) XENBUS_STORE(WatchRemove,
                         &Fdo->StoreInterface,
                         Fdo->ScanWatch);
index 69aed73328be9d03262464a23c36ccd0ce2b4ebc..98efee5f6ed0fd673cc8c1b75f1d240faf762652 100644 (file)
@@ -87,6 +87,8 @@ struct _XENVIF_FRONTEND {
     ULONG                       StatisticsCount;
 
     PXENVIF_THREAD              MibThread;
+    CHAR                        Alias[IF_MAX_STRING_SIZE + 1];
+    NET_IFINDEX                 InterfaceIndex;
     PSOCKADDR_INET              AddressTable;
     ULONG                       AddressCount;
 };
@@ -458,15 +460,15 @@ fail1:
 }
 
 static NTSTATUS
-FrontendGetInterfaceIndex(
+FrontendProcessInterfaceTable(
     IN  PXENVIF_FRONTEND    Frontend,
-    IN  PMIB_IF_TABLE2      Table,
-    OUT PNET_IFINDEX        InterfaceIndex
+    IN  PMIB_IF_TABLE2      Table
     )
 {
     ETHERNET_ADDRESS        PermanentPhysicalAddress;
     ULONG                   Index;
     PMIB_IF_ROW2            Row;
+    NTSTATUS                status;
 
     MacQueryPermanentAddress(__FrontendGetMac(Frontend),
                              &PermanentPhysicalAddress);
@@ -494,12 +496,13 @@ FrontendGetInterfaceIndex(
     return STATUS_UNSUCCESSFUL;
 
 found:
-    *InterfaceIndex = Row->InterfaceIndex;
+    Frontend->InterfaceIndex = Row->InterfaceIndex;
 
-    Trace("[%u]: %ws (%ws)\n",
-          Row->InterfaceIndex,
-          Row->Alias,
-          Row->Description);
+    status = RtlStringCbPrintfA(Frontend->Alias,
+                                sizeof (Frontend->Alias),
+                                "%ws",
+                                Row->Alias);
+    ASSERT(NT_SUCCESS(status));
 
     return STATUS_SUCCESS;
 }
@@ -564,8 +567,7 @@ fail1:
 static NTSTATUS
 FrontendProcessAddressTable(
     IN  PXENVIF_FRONTEND            Frontend,
-    IN  PMIB_UNICASTIPADDRESS_TABLE Table,
-    IN  NET_IFINDEX                 InterfaceIndex
+    IN  PMIB_UNICASTIPADDRESS_TABLE Table
     )
 {
     ULONG                           Index;
@@ -583,7 +585,7 @@ FrontendProcessAddressTable(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_UNICASTIPADDRESS_ROW   Row = &Table->Table[Index];
 
-        if (Row->InterfaceIndex != InterfaceIndex)
+        if (Row->InterfaceIndex != Frontend->InterfaceIndex)
             continue;
 
         if (Row->Address.si_family != AF_INET &&
@@ -603,6 +605,43 @@ fail1:
     return status;
 }
 
+static NTSTATUS
+FrontendDumpAlias(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    NTSTATUS                status;
+
+    status = XENBUS_STORE(Remove,
+                          &Frontend->StoreInterface,
+                          NULL,
+                          __FrontendGetPrefix(Frontend),
+                          "name");
+    if (!NT_SUCCESS(status) &&
+        status != STATUS_OBJECT_NAME_NOT_FOUND)
+        goto fail1;
+
+    status = XENBUS_STORE(Printf,
+                          &Frontend->StoreInterface,
+                          NULL,
+                          __FrontendGetPrefix(Frontend),
+                          "name",
+                          "%s",
+                          Frontend->Alias);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 static NTSTATUS
 FrontendDumpAddressTable(
     IN  PXENVIF_FRONTEND        Frontend
@@ -647,7 +686,7 @@ FrontendDumpAddressTable(
         switch (Frontend->AddressTable[Index].si_family) {
         case AF_INET: {
             IPV4_ADDRESS    Address;
-            CHAR            Node[sizeof ("ipv4/address/XXXXXXXX")];
+            CHAR            Node[sizeof ("ipv4/XXXXXXXX")];
 
             RtlCopyMemory(Address.Byte,
                           &Frontend->AddressTable[Index].Ipv4.sin_addr.s_addr,
@@ -655,7 +694,7 @@ FrontendDumpAddressTable(
 
             status = RtlStringCbPrintfA(Node,
                                         sizeof (Node),
-                                        "ipv4/address/%u",
+                                        "ipv4/%u",
                                         IpVersion4Count);
             ASSERT(NT_SUCCESS(status));
 
@@ -672,19 +711,12 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 goto fail4;
 
-            Trace("%s: %u.%u.%u.%u\n",
-                  __FrontendGetPrefix(Frontend),
-                  Address.Byte[0],
-                  Address.Byte[1],
-                  Address.Byte[2],
-                  Address.Byte[3]);
-
             IpVersion4Count++;
             break;
         }
         case AF_INET6: {
             IPV6_ADDRESS    Address;
-            CHAR            Node[sizeof ("ipv6/address/XXXXXXXX")];
+            CHAR            Node[sizeof ("ipv6/XXXXXXXX")];
 
             RtlCopyMemory(Address.Byte,
                           &Frontend->AddressTable[Index].Ipv6.sin6_addr.s6_addr,
@@ -692,7 +724,7 @@ FrontendDumpAddressTable(
 
             status = RtlStringCbPrintfA(Node,
                                         sizeof (Node),
-                                        "ipv6/address/%u",
+                                        "ipv6/%u",
                                         IpVersion6Count);
             ASSERT(NT_SUCCESS(status));
 
@@ -713,17 +745,6 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 goto fail4;
 
-            Trace("%s: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
-                  __FrontendGetPrefix(Frontend),
-                  NTOHS(Address.Word[0]),
-                  NTOHS(Address.Word[1]),
-                  NTOHS(Address.Word[2]),
-                  NTOHS(Address.Word[3]),
-                  NTOHS(Address.Word[4]),
-                  NTOHS(Address.Word[5]),
-                  NTOHS(Address.Word[6]),
-                  NTOHS(Address.Word[7]));
-
             IpVersion6Count++;
             break;
         }
@@ -842,7 +863,6 @@ FrontendMib(
 
     for (;;) { 
         PMIB_IF_TABLE2              IfTable;
-        NET_IFINDEX                 InterfaceIndex;
         PMIB_UNICASTIPADDRESS_TABLE UnicastIpAddressTable;
         KIRQL                       Irql;
 
@@ -867,9 +887,8 @@ FrontendMib(
         if (!NT_SUCCESS(status))
             goto loop;
 
-        status = FrontendGetInterfaceIndex(Frontend,
-                                           IfTable,
-                                           &InterfaceIndex);
+        status = FrontendProcessInterfaceTable(Frontend,
+                                               IfTable);
         if (!NT_SUCCESS(status))
             goto loop;
 
@@ -878,22 +897,19 @@ FrontendMib(
         if (!NT_SUCCESS(status))
             goto loop;
 
-        KeAcquireSpinLock(&Frontend->Lock, &Irql);
-
-        // It is not safe to use interfaces before this point
-        if (Frontend->State != FRONTEND_CONNECTED &&
-            Frontend->State != FRONTEND_ENABLED)
-            goto unlock;
-
         status = FrontendProcessAddressTable(Frontend,
-                                             UnicastIpAddressTable,
-                                             InterfaceIndex);
+                                             UnicastIpAddressTable);
         if (!NT_SUCCESS(status))
-            goto unlock;
+            goto loop;
 
-        (VOID) FrontendDumpAddressTable(Frontend);
+        KeAcquireSpinLock(&Frontend->Lock, &Irql);
+
+        if (Frontend->State == FRONTEND_CONNECTED ||
+            Frontend->State == FRONTEND_ENABLED) {
+            (VOID) FrontendDumpAlias(Frontend);
+            (VOID) FrontendDumpAddressTable(Frontend);
+        }
 
-unlock:
         KeReleaseSpinLock(&Frontend->Lock, Irql);
 
 loop:
@@ -1409,6 +1425,12 @@ FrontendClose(
 
     FrontendReleaseBackend(Frontend);
 
+    (VOID) XENBUS_STORE(Remove,
+                        &Frontend->StoreInterface,
+                        NULL,
+                        NULL,
+                        __FrontendGetPrefix(Frontend));
+
     XENBUS_STORE(Release, &Frontend->StoreInterface);
 
     Trace("<====\n");
@@ -2262,7 +2284,7 @@ FrontendInitialize(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    Length = sizeof ("data/vif/") + (ULONG)strlen(Name);
+    Length = sizeof ("attr/vif/") + (ULONG)strlen(Name);
     Prefix = __FrontendAllocate(Length);
 
     status = STATUS_NO_MEMORY;
@@ -2271,7 +2293,7 @@ FrontendInitialize(
 
     status = RtlStringCbPrintfA(Prefix, 
                                 Length,
-                                "data/vif/%s", 
+                                "attr/vif/%s",
                                 Name);
     if (!NT_SUCCESS(status))
         goto fail4;
@@ -2415,6 +2437,16 @@ FrontendTeardown(
     ThreadJoin(Frontend->MibThread);
     Frontend->MibThread = NULL;
 
+    if (Frontend->AddressCount != 0) {
+        __FrontendFree(Frontend->AddressTable);
+
+        Frontend->AddressTable = NULL;
+        Frontend->AddressCount = 0;
+    }
+
+    RtlZeroMemory(Frontend->Alias, sizeof (Frontend->Alias));
+    Frontend->InterfaceIndex = 0;
+
     ThreadAlert(Frontend->EjectThread);
     ThreadJoin(Frontend->EjectThread);
     Frontend->EjectThread = NULL;
index 91467d6793d40653139746756a06a233825bb2a5..0a771a42d7a37c55a146a3fa61efb28241cdad4e 100644 (file)
@@ -101,19 +101,6 @@ __MacSetPermanentAddress(
 
     Mac->PermanentAddress = *Address;
 
-    (VOID) XENBUS_STORE(Printf,
-                        &Mac->StoreInterface,
-                        NULL,
-                        FrontendGetPrefix(Frontend),
-                        "mac/unicast/permanent",
-                        "%02x:%02x:%02x:%02x:%02x:%02x",
-                        Mac->PermanentAddress.Byte[0],
-                        Mac->PermanentAddress.Byte[1],
-                        Mac->PermanentAddress.Byte[2],
-                        Mac->PermanentAddress.Byte[3],
-                        Mac->PermanentAddress.Byte[4],
-                        Mac->PermanentAddress.Byte[5]);
-
     Info("%s: %02X:%02X:%02X:%02X:%02X:%02X\n",
          FrontendGetPrefix(Frontend),
          Mac->PermanentAddress.Byte[0],
@@ -155,19 +142,6 @@ __MacSetCurrentAddress(
 
     Mac->CurrentAddress = *Address;
 
-    (VOID) XENBUS_STORE(Printf,
-                        &Mac->StoreInterface,
-                        NULL,
-                        FrontendGetPrefix(Frontend),
-                        "mac/unicast/current",
-                        "%02x:%02x:%02x:%02x:%02x:%02x",
-                        Mac->CurrentAddress.Byte[0],
-                        Mac->CurrentAddress.Byte[1],
-                        Mac->CurrentAddress.Byte[2],
-                        Mac->CurrentAddress.Byte[3],
-                        Mac->CurrentAddress.Byte[4],
-                        Mac->CurrentAddress.Byte[5]);
-
     Info("%s: %02X:%02X:%02X:%02X:%02X:%02X\n",
          FrontendGetPrefix(Frontend),
          Mac->CurrentAddress.Byte[0],
@@ -261,7 +235,7 @@ fail1:
 }
 
 static NTSTATUS
-MacDumpMulticastList(
+MacDumpAddressTable(
     IN  PXENVIF_MAC     Mac
     )
 {
@@ -283,46 +257,48 @@ MacDumpMulticastList(
     if (!Mac->Connected)
         goto fail1;
 
-    if (Mac->MulticastCount != 0) {
-        Address = __MacAllocate(sizeof (ETHERNET_ADDRESS) *
-                                Mac->MulticastCount);
+    Count = 1 + Mac->MulticastCount;
+
+    Address = __MacAllocate(sizeof (ETHERNET_ADDRESS) *
+                            Count);
 
-        status = STATUS_NO_MEMORY;
-        if (Address == NULL)
-            goto fail2;
+    status = STATUS_NO_MEMORY;
+    if (Address == NULL)
+        goto fail2;
 
-        Count = 0;
-        for (ListEntry = Mac->MulticastList.Flink;
-             ListEntry != &Mac->MulticastList;
-             ListEntry = ListEntry->Flink) {
-            PXENVIF_MAC_MULTICAST   Multicast;
+    Index = 0;
 
-            Multicast = CONTAINING_RECORD(ListEntry,
-                                          XENVIF_MAC_MULTICAST,
-                                          ListEntry);
+    MacQueryCurrentAddress(Mac, &Address[Index]);
+    Index++;
 
-            Address[Count++] = Multicast->Address;
-        }
-        ASSERT3U(Count, ==, Mac->MulticastCount);
-    } else {
-        Address = NULL;
-        Count = 0;
+    for (ListEntry = Mac->MulticastList.Flink;
+         ListEntry != &Mac->MulticastList;
+         ListEntry = ListEntry->Flink) {
+        PXENVIF_MAC_MULTICAST   Multicast;
+
+        Multicast = CONTAINING_RECORD(ListEntry,
+                                      XENVIF_MAC_MULTICAST,
+                                      ListEntry);
+
+        Address[Index++] = Multicast->Address;
     }
 
+    ASSERT3U(Index, ==, Count);
+
     KeReleaseSpinLock(&Mac->Lock, Irql);
 
     (VOID) XENBUS_STORE(Remove,
                         &Mac->StoreInterface,
                         NULL,
                         FrontendGetPrefix(Frontend),
-                        "mac/multicast");
+                        "mac");
 
     for (Index = 0; Index < Count; Index++) {
-        CHAR    Node[sizeof ("mac/multicast/XX")];
+        CHAR    Node[sizeof ("mac/XX")];
 
         status = RtlStringCbPrintfA(Node,
                                     sizeof (Node),
-                                    "mac/multicast/%u",
+                                    "mac/%u",
                                     Index);
         ASSERT(NT_SUCCESS(status));
 
@@ -338,15 +314,6 @@ MacDumpMulticastList(
                             Address[Index].Byte[3],
                             Address[Index].Byte[4],
                             Address[Index].Byte[5]);
-
-        Trace("%s: %02x:%02x:%02x:%02x:%02x:%02x\n",
-              FrontendGetPrefix(Frontend),
-              Address[Index].Byte[0],
-              Address[Index].Byte[1],
-              Address[Index].Byte[2],
-              Address[Index].Byte[3],
-              Address[Index].Byte[4],
-              Address[Index].Byte[5]);
     }
 
     if (Address != NULL)
@@ -454,7 +421,7 @@ MacConnect(
     Mac->Connected = TRUE;
     KeReleaseSpinLockFromDpcLevel(&Mac->Lock);
 
-    (VOID) MacDumpMulticastList(Mac);
+    (VOID) MacDumpAddressTable(Mac);
 
     return STATUS_SUCCESS;
 
@@ -767,7 +734,7 @@ MacAddMulticastAddress(
     Mac->MulticastCount++;
     KeReleaseSpinLock(&Mac->Lock, Irql);
 
-    (VOID) MacDumpMulticastList(Mac);
+    (VOID) MacDumpAddressTable(Mac);
 
     Trace("%s: %02X:%02X:%02X:%02X:%02X:%02X\n",
           FrontendGetPrefix(Frontend),
@@ -827,7 +794,7 @@ found:
 
     KeReleaseSpinLock(&Mac->Lock, Irql);
 
-    (VOID) MacDumpMulticastList(Mac);
+    (VOID) MacDumpAddressTable(Mac);
 
     Trace("%s: %02X:%02X:%02X:%02X:%02X:%02X\n",
           FrontendGetPrefix(Frontend),