我一直在尝试实现 gPTP 事件消息(SYNC 和/或 FOLLOW_UP)消息的入口时间戳。基本上,有两个时间敏感网络(TSN)。设备侧和网络侧,在5GS中实现。因此 gPTP 数据包从 NWTT-->DSTT 流出。该算法应该是所有事件消息都由 NWTT 加上时间戳并发送到 DSTT。然后根据该值可以计算链路延迟。
这是我的代码,在创建套接字并接收缓冲区中的数据包并将它们复制到 PTP 结构头后,我有点卡住了。任何帮助或指导表示赞赏。
需要将硬件时间戳添加到 gPTP 事件消息中。
int main() {
int sock;
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_1588));
if (sock == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
unsigned char *buffer = (unsigned char *) malloc(65537);
memset(buffer, 0, 65537);
struct sockaddr sockaddr;
int sockaddr_len = sizeof(sockaddr);
int buffer_len;
buffer_len = recvfrom(sock, buffer, 65537, 0, &sockaddr, (socklen_t *) &sockaddr_len);
if (buffer_len == -1) {
perror("recvfrom");
exit(EXIT_FAILURE);
}
struct timespec ts;
clock_gettime(CLOCK_REALTIME, (struct timespec *) &ts);
struct ptpv2_header *ptpv2Header = (struct ptpv2_header *) buffer;
// TODO
return EXIT_SUCCESS;
}
sock = 套接字(AF_PACKET, SOCK_RAW, htons(ETH_P_1588)); 此行中最后一个参数不正确。这里使用的协议在 sys/socket.h 中定义。 由于 ptp 数据包也是 ip 数据包。这是行不通的。您尝试在程序中使用原始套接字。以下行可以修复它:
sock = 套接字(AF_PACKET, SOCK_RAW, 0 );