All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oliver Hartkopp <socketcan@hartkopp.net>
To: Wolfgang Grandegger <wg@grandegger.com>,
	Martin Kozusky <mkozusky@kkmicro.cz>
Cc: linux-can@vger.kernel.org
Subject: Re: Flexcan - timestamp from message buffer to userspace
Date: Mon, 21 Oct 2013 18:29:20 +0200	[thread overview]
Message-ID: <52655660.30100@hartkopp.net> (raw)
In-Reply-To: <df0fb8a7e99577852c73a96a605465c5@grandegger.com>

On 21.10.2013 13:23, Wolfgang Grandegger wrote:
> On Mon, 21 Oct 2013 11:51:20 +0200, Martin Kozusky <mkozusky@kkmicro.cz>


> 
>> When I do
> 
>>   ioctl(sock, SIOCSHWTSTAMP, &hwtstamp) it returns ENOTSUP :( do I have 
> 
>> to define this ioctl somehow in the flexcan driver or somewhere else?
> 
> 
> 
> Yes, it looks like. Doing an "identifier search" for SIOCSHWTSTAMP in
> 
> "http://lxr.free-electrons.com/source/" should list various drivers
> 
> implementing that request.
> 

Hi Martin,

if you want to configure the selection of available timestamps, there needs
to be implemented something in the driver itself.

E.g. if a network driver supports filtering for special packet types to send
the timestamps only for these packets, it need to present it's capabilities
and also needs to implement the existing configuration API.

E.g. if you say:
# ethtool -T can0
Time stamping parameters for can0:
Capabilities:
	software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
	software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
PTP Hardware Clock: none
Hardware Transmit Timestamp Modes: none
Hardware Receive Filter Modes: none

This is the output from my SJA1000 based EMS PCMCIA card.
But for the software device vcan0 it's the same.

From what i get from this interface is only software timestamps.

I played with candump yesterday:

diff --git a/candump.c b/candump.c
index c865bd7..44a59b2 100644
--- a/candump.c
+++ b/candump.c
@@ -60,6 +60,7 @@
 
 #include <linux/can.h>
 #include <linux/can/raw.h>
+#include <linux/net_tstamp.h>
 
 #include "terminal.h"
 #include "lib.h"
@@ -537,6 +538,7 @@ int main(int argc, char **argv)
 
 		if (timestamp || log || logfrmt) {
 
+#if 1
 			const int timestamp_on = 1;
 
 			if (setsockopt(s[i], SOL_SOCKET, SO_TIMESTAMP,
@@ -544,6 +546,17 @@ int main(int argc, char **argv)
 				perror("setsockopt SO_TIMESTAMP");
 				return 1;
 			}
+#endif
+#if 1
+//			const int timestamping_flags = ( SOF_TIMESTAMPING_RX_SOFTWARE |  SOF_TIMESTAMPING_RX_HARDWARE |  SOF_TIMESTAMPING_SOFTWARE);
+			const int timestamping_flags = ( SOF_TIMESTAMPING_RX_SOFTWARE |  SOF_TIMESTAMPING_SOFTWARE);
+
+			if (setsockopt(s[i], SOL_SOCKET, SO_TIMESTAMPING,
+				       &timestamping_flags, sizeof(timestamping_flags)) < 0) {
+				perror("setsockopt SO_TIMESTAMPING");
+				return 1;
+			}
+#endif
 		}
 
 		if (dropmonitor) {
@@ -664,10 +677,36 @@ int main(int argc, char **argv)
 				for (cmsg = CMSG_FIRSTHDR(&msg);
 				     cmsg && (cmsg->cmsg_level == SOL_SOCKET);
 				     cmsg = CMSG_NXTHDR(&msg,cmsg)) {
-					if (cmsg->cmsg_type == SO_TIMESTAMP)
+					if (cmsg->cmsg_type == SO_TIMESTAMP) {
+						printf("SO_TIMESTAMP\n");
 						tv = *(struct timeval *)CMSG_DATA(cmsg);
-					else if (cmsg->cmsg_type == SO_RXQ_OVFL)
+					} else if (cmsg->cmsg_type == SO_TIMESTAMPNS) {
+						printf("SO_TIMESTAMPNS\n");
+						tv = *(struct timeval *)CMSG_DATA(cmsg);
+					} else if (cmsg->cmsg_type == SO_TIMESTAMPING) {
+
+						struct timespec *stamp = (struct timespec *)CMSG_DATA(cmsg);
+
+						printf("SO_TIMESTAMPING\n");
+						tv = *(struct timeval *)CMSG_DATA(cmsg);
+
+						printf("SW %lu.%09lu ",
+						       (long)stamp->tv_sec,
+						       (long)stamp->tv_nsec);
+						stamp++;
+						printf("HW transformed %lu.%09lu ",
+						       (long)stamp->tv_sec,
+						       (long)stamp->tv_nsec);
+						stamp++;
+						printf("HW raw %lu.%09lu",
+						       (long)stamp->tv_sec,
+						       (long)stamp->tv_nsec);
+						printf("\n");
+
+					} else if (cmsg->cmsg_type == SO_RXQ_OVFL) {
+						printf("SO_RXQ_OVFL\n");
 						dropcnt[i] = *(__u32 *)CMSG_DATA(cmsg);
+					} else printf("cmsg->cmsg_type = %d\n", cmsg->cmsg_type);
 				}
 
 				/* check for (unlikely) dropped frames on this specific socket */



   

The problem is, when i set both SO_TIMESTAMP AND SO_TIMESTAMPING i get trash
in the SO_TIMESTAMPING values.

When I set either SO_TIMESTAMP OR SO_TIMESTAMPING i can see a good and valid
software timestamp. (compared with an unmodified candump).

Any idea about that?

Best regards,
Oliver


  reply	other threads:[~2013-10-21 16:29 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-18  9:56 Flexcan - timestamp from message buffer to userspace Martin Kozusky
2013-10-18 10:55 ` Martin Kozusky
2013-10-18 14:42   ` Oliver Hartkopp
2013-10-21  6:54     ` Martin Kozusky
2013-10-21  8:00       ` Wolfgang Grandegger
2013-10-21  8:11         ` Wolfgang Grandegger
2013-10-21  8:54           ` Martin Kozusky
2013-10-21  9:51             ` Martin Kozusky
2013-10-21 11:23               ` Wolfgang Grandegger
2013-10-21 16:29                 ` Oliver Hartkopp [this message]
2013-10-22 12:22                   ` Martin Kozusky
2013-10-22 19:36                     ` Oliver Hartkopp

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52655660.30100@hartkopp.net \
    --to=socketcan@hartkopp.net \
    --cc=linux-can@vger.kernel.org \
    --cc=mkozusky@kkmicro.cz \
    --cc=wg@grandegger.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.