7 #include <sys/socket.h>
8 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include <linux/can.h>
16 * [ ] consider can timestamp
25 pthread_barrier_t barrier;
26 struct timespec* tx_time, * rx_time;
28 void* udp_recv( void* arg )
30 struct sockaddr_in sa_udp;
35 sa_udp.sin_family = AF_INET;
36 sa_udp.sin_port = htons( 10502 );
37 inet_aton( "127.0.0.1", &sa_udp.sin_addr );
39 udp_sock = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );
42 fprintf( stderr, "error: udp socket creation failed\n" );
46 if( bind(udp_sock, (struct sockaddr*)&sa_udp, sizeof(sa_udp)) != 0 )
48 fprintf( stderr, "error: udp socket binding failed\n" );
52 pthread_barrier_wait( &barrier );
55 for( i=0; i<d.n; i++ )
57 recvfrom( udp_sock, &cf, sizeof(cf), 0, NULL, 0 );
58 clock_gettime( CLOCK_REALTIME, &rx_time[cf.data[0]] );
59 printf( "recv: (id=%d)%u\n", cf.can_id, cf.data[0] );
66 int timespec_subtract( struct timespec *result, struct timespec *x, struct timespec *yy )
68 struct timespec ylocal = *yy, *y = &ylocal;
69 /* Perform the carry for the later subtraction by updating Y. */
70 if( x->tv_nsec < y->tv_nsec )
72 int nsec = (y->tv_nsec - x->tv_nsec) / 1000000000 + 1;
73 y->tv_nsec -= 1000000000 * nsec;
76 if (x->tv_nsec - y->tv_nsec > 1000000000) {
77 int nsec = (x->tv_nsec - y->tv_nsec) / 1000000000;
78 y->tv_nsec += 1000000000 * nsec;
82 /* Compute the time remaining to wait.
83 * `tv_nsec' is certainly positive. */
84 result->tv_sec = x->tv_sec - y->tv_sec;
85 result->tv_nsec = x->tv_nsec - y->tv_nsec;
86 /* Return 1 if result is negative. */
87 return x->tv_sec < y->tv_sec;
90 int main( int argc, char* argv[] )
93 struct sockaddr_can sa_can;
104 opt = getopt( argc, argv, "n:" );
110 d.n = atoi( optarg );
118 tx_time = malloc( d.n*sizeof(struct timespec) );
119 rx_time = malloc( d.n*sizeof(struct timespec) );
121 pthread_barrier_init( &barrier, NULL, 2 );
122 pthread_create( &thr, NULL, udp_recv, NULL );
124 sa_can.can_family = AF_CAN;
125 sa_can.can_ifindex = if_nametoindex( "vcan0" );
127 can_sock = socket( PF_CAN, SOCK_RAW, CAN_RAW );
130 fprintf( stderr, "error: can socket creation failed\n" );
134 if( bind(can_sock, (struct sockaddr*)&sa_can, sizeof(sa_can)) != 0 )
136 fprintf( stderr, "error: can socket binding failed\n" );
140 pthread_barrier_wait( &barrier );
143 for( i=0; i<d.n; i++ )
145 //memset( &cf, 0, sizeof(cf) );
149 int ret = sendto( can_sock, &cf, sizeof(cf), 0, (struct sockaddr*)&sa_can, sizeof(sa_can) );
150 clock_gettime( CLOCK_REALTIME, &tx_time[cf.data[0]] );
151 printf( "sending(%d)\n", ret );
154 close( can_sock ); /* shutdown? */
155 pthread_join( thr, NULL );
158 for( i=0; i<d.n; i++ )
160 if( timespec_subtract( &res, &rx_time[i], &tx_time[i] ) == 0 )
162 time = res.tv_sec*1000000000.0f + (float)res.tv_nsec;
164 printf( "transfer time:%fns\n", time );
167 printf( "transfer time: irrelevant\n" );
171 printf( "average: %fns\n", mean );
175 // clock_gettime( CLOCK_REALTIME, &tx_time );