Quantcast
Channel: Active questions tagged linux-kernel - Stack Overflow
Viewing all articles
Browse latest Browse all 12323

Linux socket hardware timestamping

$
0
0

I'm working on a project researching about network synchronisation. Since I want to achieve the best performance I'm trying to compare software timestamping results with hardware timestamping ones.

I have followed this previously commented issue: Linux kernel UDP reception timestamp but after several tests I got some problems when trying to get hardware reception timestamps.

My scenario is composed of 2 devices, a PC and a Gateworks Ventana board, both devices are supposed to be waiting for packets to be broadcasted in their network and timestamping their reception times, I have tried this code (some parts have been omitted):

int rc=1;int flags;flags   = SOF_TIMESTAMPING_RX_HARDWARE        | SOF_TIMESTAMPING_RAW_HARDWARE;rc = setsockopt(sock, SOL_SOCKET,SO_TIMESTAMPING, &flags, sizeof(flags));rc = bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr));struct msghdr msg;struct iovec iov;char pktbuf[2048];char ctrl[CMSG_SPACE(sizeof(struct timespec))];struct cmsghdr *cmsg = (struct cmsghdr *) &ctrl;msg.msg_control = (char *) ctrl;msg.msg_controllen = sizeof(ctrl);msg.msg_name = &serv_addr;msg.msg_namelen = sizeof(serv_addr);msg.msg_iov = &iov;msg.msg_iovlen = 1;iov.iov_base = pktbuf;iov.iov_len = sizeof(pktbuf);//struct timeval time_kernel, time_user;//int timediff = 0;FILE *f = fopen("server.csv", "w");if (f == NULL) {    error("Error opening file!\n");    exit(1);}fprintf(f, "Time\n");struct timespec ts;int level, type;int i;for (i = 0; i < 10; i++) {    rc = recvmsg(sock, &msg, 0);    for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg))    {        level = cmsg->cmsg_level;        type  = cmsg->cmsg_type;        if (SOL_SOCKET == level && SO_TIMESTAMPING == type) {            //ts = (struct timespec *) CMSG_DATA(cmsg);            memcpy(&ts, CMSG_DATA(cmsg), sizeof(ts));            printf("HW TIMESTAMP %ld.%09ld\n", (long)ts.tv_sec, (long)ts.tv_nsec);           }    }}printf("COMPLETED\n");fclose(f);close(sock);return 0;}

In both devices the output I get after receiving a packet:

HW TIMESTAMP 0.000000000

On the other hand if with the same code my flags are:

flags   = SOF_TIMESTAMPING_RX_HARDWARE        | SOF_TIMESTAMPING_RX_SOFTWARE        | SOF_TIMESTAMPING_SOFTWARE;

I get proper timestamps:

HW TIMESTAMP 1551721801.970270543

However, they seem to be software-timestamping ones. What would be the correct solution / method to handle hardware timestamping for packets received?


Viewing all articles
Browse latest Browse all 12323

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>