/* License: GPLv2 */
/*******************************************************************************/
+#define _GNU_SOURCE
#include <ctype.h>
#include <errno.h>
#include <error.h>
tstamp->tv_sec, tstamp->tv_nsec/1000);
}
+int timespec_subtract (struct timespec *result, struct timespec *x, struct timespec *yy);
+
void msg_info_print(FILE *f, struct msg_info *mi)
{
- struct timespec diff;
+ struct timespec diff, routing_delay, tx_time;
void *local = talloc_new (NULL);
static long num = 0;
char sent[64], received[64];
mi->tx_time_us);
break;
case 3:
- fprintf(f, "%ld: %s %s -> %s (%s) -> %s (%s) %s = %s (%s), %s (%s) %d\n",
+ tx_time.tv_sec = 0;
+ tx_time.tv_nsec = mi->tx_time_us*1000;
+ timespec_subtract(&routing_delay, &mi->ts_rx_final_kern, &mi->ts_rx_onwire_kern);
+ timespec_subtract(&routing_delay, &routing_delay, &tx_time);
+
+ fprintf(f, "%ld: %s %s -> %s (%s) -> %s (%s) %s = %s (%s), %s (%s) %d %s\n",
num, S(mi->ts_sent), sent,
S(mi->ts_rx_onwire_kern), S(mi->ts_rx_onwire),
S(mi->ts_rx_final_kern), S(mi->ts_rx_final), received,
DIFF(mi->ts_sent, mi->ts_rx_onwire),
DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern),
DIFF(mi->ts_rx_onwire, mi->ts_rx_final),
- mi->tx_time_us);
+ mi->tx_time_us,
+ S(routing_delay));
break;
}
#undef S
return ifr.ifr_ifindex;
}
-static inline get_tstamp(struct timespec *ts)
+static inline void get_tstamp(struct timespec *ts)
{
clock_gettime(CLOCK_REALTIME, ts);
}
int trace_fd = -1;
int marker_fd = -1;
-int init_ftrace()
+void init_ftrace()
{
#ifdef FTRACE
char *debugfs;
return ret;
}
-static inline send_and_check(int s)
+static inline void send_and_check(int s)
{
int ret;
ret = send_frame(s);
cmsg && (cmsg->cmsg_level == SOL_SOCKET);
cmsg = CMSG_NXTHDR(&msg,cmsg)) {
if (cmsg->cmsg_type == SO_TIMESTAMPNS)
- *ts_kern = *(struct timespec *)CMSG_DATA(cmsg);
- else if (cmsg->cmsg_type == SO_RXQ_OVFL)
- dropcnt += *(__u32 *)CMSG_DATA(cmsg);
+ memcpy(ts_kern, CMSG_DATA(cmsg), sizeof(struct timespec));
+ else if (cmsg->cmsg_type == SO_RXQ_OVFL) {
+ uint32_t ovfl;
+ memcpy(&ovfl, CMSG_DATA(cmsg), sizeof(ovfl));
+ dropcnt += ovfl;
+ }
}
}
void process_on_wire_rx(int s)
{
- struct timespec ts_kern, ts_user, ts_diff;
+ struct timespec ts_kern, ts_user;
struct can_frame frame;
struct msg_info *mi;
receive(s, &frame, &ts_kern, &ts_user);
void process_final_rx(int s)
{
- struct timespec ts_kern, ts_user, ts_diff;
+ struct timespec ts_kern, ts_user;
struct can_frame frame;
struct msg_info *mi;
int ret;
struct pollfd pfd[3];
struct timespec timeout;
struct sockaddr_can addr;
- sigset_t set;
int consecutive_timeouts = 0;
MEMSET_ZERO(pfd);
}
}
if (pfd[i].revents & ~POLLIN)
- error(1, 0, "Unexpected pfd[%d].revents: 0x%04x\n", pfd[i].revents);
+ error(1, 0, "Unexpected pfd[%d].revents: 0x%04x\n", i, pfd[i].revents);
}
}
int main(int argc, const char *argv[])
{
pthread_t thread;
- sigset_t set;
int ret, i;
parse_options(argc, argv);