}
static NTSTATUS
-FrontendGetLuid(
+FrontendGetInterfaceIndex(
IN PXENVIF_FRONTEND Frontend,
IN PMIB_IF_TABLE2 Table,
- OUT PNET_LUID Luid
+ OUT PNET_IFINDEX InterfaceIndex
)
{
ETHERNET_ADDRESS PermanentPhysicalAddress;
for (Index = 0; Index < Table->NumEntries; Index++) {
Row = &Table->Table[Index];
+ if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
+ !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
+ continue;
+
+ if (Row->OperStatus != IfOperStatusUp)
+ continue;
+
+ if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
+ continue;
+
if (memcmp(Row->PermanentPhysicalAddress,
&PermanentPhysicalAddress,
- sizeof (ETHERNET_ADDRESS)) == 0)
- goto found;
+ sizeof (ETHERNET_ADDRESS)) != 0)
+ continue;
+
+ goto found;
}
return STATUS_UNSUCCESSFUL;
found:
- *Luid = Row->InterfaceLuid;
+ *InterfaceIndex = Row->InterfaceIndex;
+
+ Trace("[%u]: %ws (%ws)",
+ Row->InterfaceIndex,
+ Row->Alias,
+ Row->Description);
return STATUS_SUCCESS;
}
PSOCKADDR_INET Table;
NTSTATUS status;
+ Trace("====>\n");
+
for (Index = 0; Index < *AddressCount; Index++) {
if ((*AddressTable)[Index].si_family != Address->si_family)
continue;
*AddressTable = Table;
done:
+ Trace("<====\n");
+
return STATUS_SUCCESS;
fail1:
FrontendProcessAddressTable(
IN PXENVIF_FRONTEND Frontend,
IN PMIB_UNICASTIPADDRESS_TABLE Table,
- IN PNET_LUID Luid,
+ IN NET_IFINDEX InterfaceIndex,
OUT PSOCKADDR_INET *AddressTable,
OUT PULONG AddressCount
)
for (Index = 0; Index < Table->NumEntries; Index++) {
PMIB_UNICASTIPADDRESS_ROW Row = &Table->Table[Index];
- if (Row->InterfaceLuid.Info.IfType != Luid->Info.IfType)
- continue;
-
- if (Row->InterfaceLuid.Info.NetLuidIndex != Luid->Info.NetLuidIndex)
+ if (Row->InterfaceIndex != InterfaceIndex)
continue;
if (Row->Address.si_family != AF_INET &&
ULONG IpVersion6Count;
NTSTATUS status;
+ Trace("====>\n");
+
status = XENBUS_STORE(TransactionStart,
&Frontend->StoreInterface,
&Transaction);
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;
}
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;
}
Transaction,
TRUE);
+ Trace("<====\n");
+
return status;
fail4:
for (;;) {
PMIB_IF_TABLE2 IfTable;
- NET_LUID Luid;
+ NET_IFINDEX InterfaceIndex;
PMIB_UNICASTIPADDRESS_TABLE UnicastIpAddressTable;
KIRQL Irql;
PSOCKADDR_INET AddressTable;
ULONG AddressCount;
+ Trace("waiting...\n");
+
(VOID) KeWaitForSingleObject(Event,
Executive,
KernelMode,
NULL);
KeClearEvent(Event);
+ Trace("awake\n");
+
if (ThreadIsAlerted(Self))
break;
if (!NT_SUCCESS(status))
goto loop;
- status = FrontendGetLuid(Frontend,
- IfTable,
- &Luid);
+ status = FrontendGetInterfaceIndex(Frontend,
+ IfTable,
+ &InterfaceIndex);
if (!NT_SUCCESS(status))
goto loop;
status = FrontendProcessAddressTable(Frontend,
UnicastIpAddressTable,
- &Luid,
+ InterfaceIndex,
&AddressTable,
&AddressCount);
if (!NT_SUCCESS(status))