Created
January 30, 2024 09:16
-
-
Save diondokter/32e8866dde5809df83cbdad7ef535edf to your computer and use it in GitHub Desktop.
Timestamp check
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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, | |
×tampCapabilities); | |
if (result != NO_ERROR) | |
{ | |
printf("Error retrieving hardware timestamp capabilities: %d\n", result); | |
goto Exit; | |
} | |
if (IsPTPv2HardwareTimestampingSupportedForIPv4(×tampCapabilities) && | |
IsPTPv2HardwareTimestampingSupportedForIPv6(×tampCapabilities)) | |
{ | |
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