]> rtime.felk.cvut.cz Git - can-eth-gw.git/blob - user/canethgw.c
8048a1ff286a4cefdf375eec8d4ffad1aae1f195
[can-eth-gw.git] / user / canethgw.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/ioctl.h>
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <net/if.h>
10 #include <linux/can.h>
11 #include <linux/can/raw.h>
12 #include <poll.h>
13
14 #define GW_POLL_ETH 0
15 #define GW_POLL_CAN 1
16
17 int sock_udp;
18 int sock_can;           
19
20 void send_to_can()
21 {
22         struct can_frame cf;
23         read( sock_udp, &cf, sizeof(cf) );
24         write( sock_can, &cf, sizeof(cf) );
25         
26         printf( "sending to can\n" );
27 }
28
29 void send_to_eth()
30 {
31         struct can_frame cf;
32         struct sockaddr_in udp_dest;
33
34         udp_dest.sin_family = AF_INET;
35         udp_dest.sin_addr.s_addr = inet_addr("127.0.0.1");
36         udp_dest.sin_port = htons(10502);
37
38         read( sock_can, &cf, sizeof(cf) );
39         sendto( sock_udp, &cf, sizeof(cf), 0, (struct sockaddr*) &udp_dest, sizeof(udp_dest) );
40         //write( sock_eth, &cf, sizeof(cf) );
41
42         printf( "sending to eth\n" );
43 }
44
45 int main( int argc, char* argv[] )
46 {
47         struct sockaddr_in udp_addr;
48         struct sockaddr_can can_addr;
49         struct ifreq ifr;
50         struct pollfd pfd[2];
51
52         if( argc != 2 )
53         {
54                 printf( "usage example: %s can1\n", argv[0] );
55                 return -1;
56         }
57
58         /* udp socket */
59         sock_udp = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );
60         if( sock_udp < 0 )
61         {
62                 fprintf( stderr, "error: socket(), udp\n" );
63                 goto gw_error;
64         }
65
66         udp_addr.sin_family = AF_INET;
67         udp_addr.sin_port = htons(10501);
68         udp_addr.sin_addr.s_addr = INADDR_ANY;
69
70         if( bind( sock_udp, (struct sockaddr*) &udp_addr, sizeof(udp_addr) ) < 0 )
71         {
72                 fprintf( stderr, "error: bind(), udp\n" );
73                 close( sock_udp );
74                 goto gw_error;
75         }
76
77         /* can socket*/
78         sock_can = socket( PF_CAN, SOCK_RAW, CAN_RAW );
79         if( sock_can < 0 )
80         {
81                 fprintf( stderr, "error: socket(), can\n");
82                 close( sock_can );
83                 goto gw_error;
84         }
85
86         strcpy( ifr.ifr_name, argv[1] );
87         if( ioctl( sock_can, SIOCGIFINDEX, &ifr ) < 0 )
88         {
89                 fprintf( stderr, "error: ioctl(), get if index\n" );
90                 goto gw_error;
91         }
92
93         can_addr.can_family = AF_CAN;
94         can_addr.can_ifindex = ifr.ifr_ifindex;
95 //      setsockopt( sock_can, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0 ); /*?!?*/
96
97         if( bind( sock_can, (struct sockaddr*) &can_addr, sizeof(can_addr) ) < 0 )
98         {
99                 fprintf( stderr, "error: bind(), can" );
100                 goto gw_error;
101         }
102
103         /* poll */
104         pfd[GW_POLL_ETH].fd = sock_udp;
105         pfd[GW_POLL_ETH].events = POLLIN | POLLPRI;
106         pfd[GW_POLL_ETH].revents = 0;
107
108         pfd[GW_POLL_CAN].fd = sock_can;
109         pfd[GW_POLL_CAN].events = POLLIN | POLLPRI;
110         pfd[GW_POLL_CAN].revents = 0;
111
112 /*
113         unsigned char buf[1];
114         struct can_frame cf;
115         printf( "block\n" );
116         read( sock_can, &cf, sizeof(cf) ); again, return 0
117         printf( "can read\n" );
118 */
119
120         while(1)
121         {
122                 printf( "polling\n" );
123                 int polret = poll( pfd, 2, -1 );
124                 if( polret <= 0 )
125                 {
126                         fprintf( stderr, "error: poll returned 0\n" );
127                 }
128
129                 if( pfd[GW_POLL_ETH].revents != 0 )
130                 {
131                         send_to_can();
132                 }
133                 if( pfd[GW_POLL_CAN].revents != 0 )
134                 {
135                         send_to_eth();
136                 }
137
138                 pfd[GW_POLL_ETH].revents = 0;
139                 pfd[GW_POLL_CAN].revents = 0;
140         }
141
142         return 0;
143 gw_error:
144         return -1;
145 }
146