Tx timestamp for packet mmap.

From: Paul Chavent <hidden>
Date: 2012-12-07 15:30:49

Hi.

I would like to be able to get tx timestamps of packets sent by the packet mmap interface...

Actually, I try to get them with the sample code below.

The problem is that it doesn't work without the joined patch.

I wonder if my current implementation is good. And if not, how should i get the timestamps ?

Wouldn't be a good idea to put timestamps in the ring buffer frame before give back the frame to the user ?

Thanks for your help and advices.

Paul.

8<-------------------------------


  struct timespec ts = {0,0};
  struct sockaddr from_addr;
  static uint8_t tmp_data[256];
  struct iovec msg_iov = {tmp_data, sizeof(tmp_data)};
  static uint8_t cmsg_buff[256];
  struct msghdr msghdr = {&from_addr, sizeof(from_addr),
                          &msg_iov, 1,
                          cmsg_buff, sizeof(cmsg_buff),
                          0};
  ssize_t err = recvmsg(itf->sock_fd, &msghdr, MSG_ERRQUEUE);
  if(err < 0)
    {
      perror("recvmsg failed");
      return -1;
    }

  struct cmsghdr *cmsg;
  for(cmsg = CMSG_FIRSTHDR(&msghdr); cmsg != NULL; cmsg = CMSG_NXTHDR(&msghdr, cmsg))
    {
      if(cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_TIMESTAMPING)
        {
          ts = *(struct timespec *)CMSG_DATA(cmsg);
#if !defined(NDEBUG)
          if(itf->debug)
            {
              fprintf(stderr, "SCM_TIMESTAMPING available\n");
            }
#else
          break;
#endif
        }
      else if (cmsg->cmsg_level == SOL_PACKET && cmsg->cmsg_type == PACKET_TX_TIMESTAMP)
        {
          ts = *(struct timespec *)CMSG_DATA(cmsg);
#if !defined(NDEBUG)
          if(itf->debug)
            {
              fprintf(stderr, "PACKET_TX_TIMESTAMP available\n");
            }
#else
          break;
#endif
        }
    }

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help