[<prev] [next>] [day] [month] [year] [list]
Message-ID: <50C20B1D.5050808@onera.fr>
Date: Fri, 07 Dec 2012 16:28:29 +0100
From: Paul Chavent <Paul.Chavent@...ra.fr>
To: netdev@...r.kernel.org
Subject: Tx timestamp for packet mmap.
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
}
}
View attachment "0002-net-add-tx-timestamp-to-packet-mmap.patch" of type "text/x-patch" (764 bytes)
Powered by blists - more mailing lists