6 #include <netinet/in.h>
10 #include <sys/socket.h>
11 #include <arpa/inet.h>
13 #include <linux/can.h>
14 #include <linux/can/raw.h>
21 #define GW_SRC_PORT_BIT 2
22 #define GW_DEST_PORT_BIT 4
23 #define GW_FILTER_BIT 8
25 unsigned int opt_flag = 0;
28 struct can_filter flt;
29 struct sockaddr_in udp_dest;
33 * @return true if frame should be dropped
35 bool filter_check( struct can_frame* cf )
37 if( !(opt_flag & GW_FILTER_BIT) )
40 return ( (cf->can_id & flt.can_mask) == (flt.can_id & flt.can_mask) );
46 read( sock_udp, &cf, sizeof(cf) );
48 if( !filter_check( &cf ) )
50 printf( "filter: drop\n" );
54 write( sock_can, &cf, sizeof(cf) );
56 printf( "sending to can\n" );
63 read( sock_can, &cf, sizeof(cf) );
65 if( !filter_check( &cf ) )
67 printf( "filter: drop\n" );
71 sendto( sock_udp, &cf, sizeof(cf), 0, (struct sockaddr*) &udp_dest, sizeof(udp_dest) );
73 printf( "sending to eth\n" );
76 void signal_exit( int sig )
80 printf( "exiting\n" );
85 int main( int argc, char* argv[] )
87 struct sockaddr_in udp_addr;
88 struct sockaddr_can can_addr;
93 int src_port = 0, dest_port = 0;
98 while( (opt = getopt( argc, argv, "s:d:f:i:" )) != -1 )
103 src_port = atoi( optarg );
104 opt_flag |= GW_SRC_PORT_BIT;
107 dest_port = atoi( optarg );
108 opt_flag |= GW_DEST_PORT_BIT;
111 if( sscanf( optarg, "%x:%x", &flt.can_id,
112 &flt.can_mask ) != 2 )
114 fprintf( stderr, "error:\
115 bad filter format\n");
118 opt_flag |= GW_FILTER_BIT;
121 ifr.ifr_ifindex = if_nametoindex( optarg );
122 if( ifr.ifr_ifindex == 0 )
124 fprintf( stderr, "error: if_nametoindex\n" );
127 opt_flag |= GW_IF_BIT;
132 if( !((opt_flag & GW_SRC_PORT_BIT) && (opt_flag & GW_DEST_PORT_BIT)
133 && (opt_flag & GW_DEST_PORT_BIT)) )
135 fprintf( stdout, "bad usage, example -i vcan0 -s 10501 -d 10502 -f 007:00000007\n" );
139 signal( SIGINT, signal_exit );
141 /* prepare udp destination */
142 udp_dest.sin_family = AF_INET;
143 udp_dest.sin_addr.s_addr = inet_addr("127.0.0.1");
144 udp_dest.sin_port = htons(dest_port);
147 sock_udp = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );
150 fprintf( stderr, "error: socket(), udp\n" );
154 udp_addr.sin_family = AF_INET;
155 udp_addr.sin_port = htons(src_port);
156 udp_addr.sin_addr.s_addr = INADDR_ANY;
158 if( bind( sock_udp, (struct sockaddr*) &udp_addr, sizeof(udp_addr) ) < 0 )
160 fprintf( stderr, "error: bind(), udp\n" );
166 sock_can = socket( PF_CAN, SOCK_RAW, CAN_RAW );
169 fprintf( stderr, "error: socket(), can\n");
174 can_addr.can_family = AF_CAN;
175 can_addr.can_ifindex = ifr.ifr_ifindex;
177 if( bind( sock_can, (struct sockaddr*) &can_addr, sizeof(can_addr) ) < 0 )
179 fprintf( stderr, "error: bind(), can" );
184 pfd[GW_POLL_ETH].fd = sock_udp;
185 pfd[GW_POLL_ETH].events = POLLIN | POLLPRI;
186 pfd[GW_POLL_ETH].revents = 0;
188 pfd[GW_POLL_CAN].fd = sock_can;
189 pfd[GW_POLL_CAN].events = POLLIN | POLLPRI;
190 pfd[GW_POLL_CAN].revents = 0;
194 printf( "polling\n" );
195 polret = poll( pfd, 2, -1 );
198 fprintf( stderr, "error: poll returned 0\n" );
202 if( pfd[GW_POLL_ETH].revents != 0 )
206 if( pfd[GW_POLL_CAN].revents != 0 )
211 pfd[GW_POLL_ETH].revents = 0;
212 pfd[GW_POLL_CAN].revents = 0;