windows-nt/Source/XPSP1/NT/net/tcpip/tpipv6/ipv6mon/map.c
2020-09-26 16:20:57 +08:00

334 lines
7.6 KiB
C

//=============================================================================
// Copyright (c) Microsoft Corporation
// Abstract:
// This module implements ifindex-name conversion functions.
//=============================================================================
#include "precomp.h"
#pragma hdrstop
#define MAX_FRIENDLY_NAME_LENGTH 2000
HANDLE g_hMprConfig = INVALID_HANDLE_VALUE;
DWORD
Connect()
{
return MprConfigServerConnect(NULL, &g_hMprConfig);
}
VOID
Disconnect()
{
MprConfigServerDisconnect(g_hMprConfig);
g_hMprConfig = INVALID_HANDLE_VALUE;
}
DWORD
MapAdapterNameToFriendlyName(
IN PWCHAR pwszMachine,
IN LPSTR AdapterName,
IN PIP_ADAPTER_ADDRESSES pAdapterInfo,
OUT PWCHAR *ppwszFriendlyName
)
/*++
Routine Description:
Maps an adapter GUID to an interface friendly name. This is IPv4/IPv6
agnostic.
Arguments:
AdapterName - Supplies an adapter GUID.
ppwszFriendlyName - Receives a pointer to a static buffer containing
the interface friendly name.
--*/
{
PIP_ADAPTER_ADDRESSES pIf;
for (pIf = pAdapterInfo; pIf; pIf = pIf->Next) {
if (!strcmp(AdapterName, pIf->AdapterName)) {
*ppwszFriendlyName = pIf->FriendlyName;
return NO_ERROR;
}
}
return ERROR_NOT_FOUND;
}
#define GUID_FORMAT_A "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"
VOID
ConvertGuidToStringA(
IN GUID *pGuid,
OUT PCHAR pszBuffer
)
{
sprintf(pszBuffer, GUID_FORMAT_A,
pGuid->Data1,
pGuid->Data2,
pGuid->Data3,
pGuid->Data4[0],
pGuid->Data4[1],
pGuid->Data4[2],
pGuid->Data4[3],
pGuid->Data4[4],
pGuid->Data4[5],
pGuid->Data4[6],
pGuid->Data4[7]);
}
DWORD
MapGuidToFriendlyName(
IN PWCHAR pwszMachine,
IN GUID *pGuid,
IN PIP_ADAPTER_ADDRESSES pAdapterInfo,
OUT PWCHAR *ppwszFriendlyName
)
{
CHAR szBuffer[80];
ConvertGuidToStringA(pGuid, szBuffer);
return MapAdapterNameToFriendlyName(pwszMachine, szBuffer,
pAdapterInfo, ppwszFriendlyName);
}
DWORD
MapFriendlyNameToAdapterName(
IN PWCHAR pwszMachine,
IN PWCHAR pwszFriendlyName,
IN PIP_ADAPTER_ADDRESSES pAdapterInfo,
OUT LPSTR *AdapterName
)
/*++
Routine Description:
Maps an interface friendly name to an adapter GUID. This is IPv4/IPv6
agnostic.
Arguments:
pwszFriendlyName - Supplies an interface friendly name.
pAdapterInfo - Supplies info obtained from GetAdaptersAddresses().
AdapterName - Receives a pointer to a static buffer containing
the adapter GUID.
--*/
{
PIP_ADAPTER_ADDRESSES pIf;
//
// First look for an exact match.
//
for (pIf = pAdapterInfo; pIf; pIf = pIf->Next) {
if (!_wcsicmp(pwszFriendlyName, pIf->FriendlyName)) {
*AdapterName = pIf->AdapterName;
return NO_ERROR;
}
}
//
// Then look for a partial match.
//
for (pIf = pAdapterInfo; pIf; pIf = pIf->Next) {
if (!_wcsnicmp(pwszFriendlyName, pIf->FriendlyName,
wcslen(pwszFriendlyName))) {
*AdapterName = pIf->AdapterName;
return NO_ERROR;
}
}
return ERROR_NOT_FOUND;
}
DWORD
MapAdapterNameToIfIndex(
IN LPSTR AdapterName,
IN PIP_ADAPTER_ADDRESSES pAdapterInfo,
IN DWORD dwFamily,
OUT DWORD *pdwIfIndex
)
/*++
Routine Description:
Maps an adapter GUID to an interface index. This is IPv4/IPv6
specific, since each has a separate ifindex.
Arguments:
AdapterName - Supplies an adapter GUID.
pAdapterInfo - Supplies info obtained from GetAdaptersAddresses().
dwFamily - Supplies the protocol for which an ifindex is needed.
pdwIfIndex - Receives the ifindex value.
--*/
{
PIP_ADAPTER_ADDRESSES pIf;
for (pIf=pAdapterInfo; pIf; pIf=pIf->Next) {
if (!strcmp(pIf->AdapterName, AdapterName)) {
break;
}
}
if (!pIf) {
*pdwIfIndex = 0;
return ERROR_NOT_FOUND;
}
*pdwIfIndex = (dwFamily == AF_INET6)? pIf->Ipv6IfIndex : pIf->IfIndex;
return NO_ERROR;
}
PIP_ADAPTER_ADDRESSES
MapIfIndexToAdapter(
IN DWORD dwFamily,
IN DWORD dwIfIndex,
IN PIP_ADAPTER_ADDRESSES pAdapterInfo
)
/*++
Routine Description:
Maps an interface index to an adapter entry. This is IPv4/IPv6
specific, since each has a separate ifindex.
Arguments:
dwFamily - Supplies the protocol.
dwIfIndex - Supplies the interface index to map.
pAdapterInfo - Supplies info obtained from GetAdaptersAddresses().
Returns:
Adapter entry if found, NULL if not.
--*/
{
PIP_ADAPTER_ADDRESSES pIf;
for (pIf=pAdapterInfo; pIf; pIf=pIf->Next) {
if ((dwFamily == AF_INET) && (pIf->IfIndex == dwIfIndex)) {
break;
}
if ((dwFamily == AF_INET6) && (pIf->Ipv6IfIndex == dwIfIndex)) {
break;
}
}
if (!pIf) {
return NULL;
}
return pIf;
}
LPSTR
MapIfIndexToAdapterName(
IN DWORD dwFamily,
IN DWORD dwIfIndex,
IN IP_ADAPTER_ADDRESSES *pAdapterInfo
)
/*++
Routine Description:
Maps an interface index to an adapter GUID. This is IPv4/IPv6
specific, since each has a separate ifindex.
Arguments:
dwFamily - Supplies the protocol.
dwIfIndex - Supplies the interface index to map.
pAdapterInfo - Supplies info obtained from GetAdaptersAddresses().
Returns:
Adapter name if found, NULL if not.
--*/
{
PIP_ADAPTER_ADDRESSES pIf;
pIf = MapIfIndexToAdapter(dwFamily, dwIfIndex, pAdapterInfo);
return (pIf)? pIf->AdapterName : NULL;
}
DWORD
MapFriendlyNameToIpv6IfIndex(
IN PWCHAR pwszFriendlyName,
IN PIP_ADAPTER_ADDRESSES pAdapterInfo,
OUT DWORD *pdwIfIndex
)
/*++
Routine Description:
Maps an interface friendly name to an interface index. This is IPv6
specific, since IPv4 and IPv6 have separate ifindexes.
Arguments:
pwszFriendlyName - Supplies the friendly name to map.
pAdapterInfo - Supplies info obtained from GetAdaptersAddresses().
pdwIfIndex - Receives the ifindex value.
--*/
{
DWORD dwErr, i;
LPSTR AdapterName;
PWCHAR pwszTemp;
//
// If string only contains digits, treat it as an IfIndex
//
if (wcsspn(pwszFriendlyName, L"1234567890") == wcslen(pwszFriendlyName)) {
*pdwIfIndex = wcstoul(pwszFriendlyName, NULL, 10);
return NO_ERROR;
}
dwErr = MapFriendlyNameToAdapterName(NULL, pwszFriendlyName, pAdapterInfo,
&AdapterName);
if (dwErr != NO_ERROR) {
return dwErr;
}
return MapAdapterNameToIfIndex(AdapterName, pAdapterInfo, AF_INET6, pdwIfIndex);
}
DWORD
MapIpv6IfIndexToFriendlyName(
IN DWORD dwIfIndex,
IN IP_ADAPTER_ADDRESSES *pAdapterInfo,
OUT PWCHAR *ppwszFriendlyName
)
/*++
Routine Description:
Maps an interface index to a friendly name. This is IPv6
specific, since IPv4 and IPv6 have separate ifindexes.
Arguments:
dwIfIndex - Supplies the ifindex value.
pAdapterInfo - Supplies info obtained from GetAdaptersAddresses().
ppwszFriendlyName - Receives a pointer to a static buffer containing
the interface friendly name.
--*/
{
IP_ADAPTER_ADDRESSES *If;
for (If=pAdapterInfo; If; If=If->Next) {
if (If->Ipv6IfIndex == dwIfIndex) {
*ppwszFriendlyName = If->FriendlyName;
return NO_ERROR;
}
}
return ERROR_NOT_FOUND;
}