Аппаратная метка времени сокета Linux - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над проектом, посвященным синхронизации сети.Поскольку я хочу достичь максимальной производительности, я пытаюсь сравнить результаты программной отметки времени с аппаратными отметками времени.

Я следовал за этой ранее прокомментированной проблемой: Отметка времени приема UDP ядра Linux , но после несколькихтесты У меня возникли некоторые проблемы при попытке получить аппаратные метки времени приема.

Мой сценарий состоит из 2 устройств, ПК и платы Gateworks Ventana, оба устройства должны ожидать передачи пакетов в своей сети.и отметив время их приема, я попробовал этот код (некоторые части были пропущены):

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;
}

В обоих устройствах вывод, который я получаю после получения пакета:

HW TIMESTAMP 0.000000000

Вкл.с другой стороны, если с тем же кодом мои флаги:

flags   = SOF_TIMESTAMPING_RX_HARDWARE
        | SOF_TIMESTAMPING_RX_SOFTWARE
        | SOF_TIMESTAMPING_SOFTWARE;

Я получаю правильные метки времени:

HW TIMESTAMP 1551721801.970270543

Однако они кажутся программными метками времени.Каково было бы правильное решение / метод для обработки аппаратной метки времени для полученных пакетов?

...