Skip to content

Instantly share code, notes, and snippets.

@diondokter
Created January 30, 2024 09:16
Show Gist options
  • Save diondokter/32e8866dde5809df83cbdad7ef535edf to your computer and use it in GitHub Desktop.
Save diondokter/32e8866dde5809df83cbdad7ef535edf to your computer and use it in GitHub Desktop.
Timestamp check
// main.cpp in a Console App project.
#include <stdio.h>
#include <winsock2.h>
#include <iphlpapi.h>
#pragma comment(lib, "Iphlpapi")
BOOL
IsPTPv2HardwareTimestampingSupportedForIPv4(PINTERFACE_TIMESTAMP_CAPABILITIES timestampCapabilities)
{
// Supported if both receive and transmit side support is present
if (((timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv4EventMessageReceive) ||
(timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv4AllMessageReceive) ||
(timestampCapabilities->HardwareCapabilities.AllReceive))
&&
((timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv4EventMessageTransmit) ||
(timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv4AllMessageTransmit) ||
(timestampCapabilities->HardwareCapabilities.TaggedTransmit) ||
(timestampCapabilities->HardwareCapabilities.AllTransmit)))
{
return TRUE;
}
return FALSE;
}
BOOL
IsPTPv2HardwareTimestampingSupportedForIPv6(PINTERFACE_TIMESTAMP_CAPABILITIES timestampCapabilities)
{
// Supported if both receive and transmit side support is present
if (((timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv6EventMessageReceive) ||
(timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv6AllMessageReceive) ||
(timestampCapabilities->HardwareCapabilities.AllReceive))
&&
((timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv6EventMessageTransmit) ||
(timestampCapabilities->HardwareCapabilities.PtpV2OverUdpIPv6AllMessageTransmit) ||
(timestampCapabilities->HardwareCapabilities.TaggedTransmit) ||
(timestampCapabilities->HardwareCapabilities.AllTransmit)))
{
return TRUE;
}
return FALSE;
}
enum SupportedTimestampType
{
TimestampTypeNone = 0,
TimestampTypeSoftware = 1,
TimestampTypeHardware = 2
};
// This function checks and returns the supported timestamp capabilities for an interface for
// a PTPv2 application
SupportedTimestampType
CheckActiveTimestampCapabilitiesForPtpv2(NET_LUID interfaceLuid)
{
DWORD result = NO_ERROR;
INTERFACE_TIMESTAMP_CAPABILITIES timestampCapabilities;
SupportedTimestampType supportedType = TimestampTypeNone;
result = GetInterfaceActiveTimestampCapabilities(
&interfaceLuid,
&timestampCapabilities);
if (result != NO_ERROR)
{
printf("Error retrieving hardware timestamp capabilities: %d\n", result);
goto Exit;
}
if (IsPTPv2HardwareTimestampingSupportedForIPv4(&timestampCapabilities) &&
IsPTPv2HardwareTimestampingSupportedForIPv6(&timestampCapabilities))
{
supportedType = TimestampTypeHardware;
goto Exit;
}
else
{
if ((timestampCapabilities.SoftwareCapabilities.AllReceive) &&
((timestampCapabilities.SoftwareCapabilities.AllTransmit) ||
(timestampCapabilities.SoftwareCapabilities.TaggedTransmit)))
{
supportedType = TimestampTypeSoftware;
}
}
Exit:
return supportedType;
}
int main()
{
ULONG alloced_bytes = 4096 * 16;
IP_ADAPTER_ADDRESSES* addresses = (IP_ADAPTER_ADDRESSES * )malloc(alloced_bytes);
auto error = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, NULL, addresses, &alloced_bytes);
if (error != NO_ERROR) {
printf("Error 1: %i\n", error);
return error;
}
printf("bytes: %i\n", alloced_bytes);
printf("Adapter name: %s\n", addresses->AdapterName);
printf("FriendlyName: %s\n", addresses->FriendlyName);
printf("Description: %s\n", addresses->Description);
printf("IfIndex: %i\n", addresses->IfIndex);
auto cap = CheckActiveTimestampCapabilitiesForPtpv2(addresses->Luid);
switch (cap)
{
case TimestampTypeNone:
printf("TimestampTypeNone\n");
break;
case TimestampTypeSoftware:
printf("TimestampTypeSoftware\n");
break;
case TimestampTypeHardware:
printf("TimestampTypeHardware\n");
break;
default:
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment