]> git.sesse.net Git - greproxy/blob - tungre.cpp
Add FEC.
[greproxy] / tungre.cpp
1 #include <arpa/inet.h>
2 #include <netinet/in.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sys/select.h>
6 #include <sys/socket.h>
7
8 #include "greprotocol.h"
9 #include "reorderer.h"
10 #include "tunprotocol.h"
11 #include "rsdecoder.h"
12
13 using namespace std;
14
15 in6_addr get_addr(const char *str) {
16         in6_addr ret;
17         if (inet_pton(AF_INET6, str, &ret) != 1) {
18                 fprintf(stderr, "Could not parse %s\n", str);
19                 exit(1);
20         }
21         return ret;
22 }
23
24 int main(int argc, char **argv)
25 {
26         in6_addr myaddr = get_addr(argv[1]);
27         in6_addr remoteaddr = get_addr(argv[2]);
28         GREProtocol gre(myaddr, remoteaddr);
29         TUNProtocol tun("tungre");
30
31         Reorderer tun_reorderer(&tun);
32         RSDecoder tun_decoder(&tun_reorderer);
33
34         fd_set fds;
35         FD_ZERO(&fds);
36         for ( ;; ) {
37                 FD_SET(gre.fd(), &fds);
38                 FD_SET(tun.fd(), &fds);
39                 int ret = select(1024, &fds, NULL, NULL, NULL);
40                 if (ret == -1) {
41                         perror("select");
42                         continue;
43                 }
44
45                 if (FD_ISSET(gre.fd(), &fds)) {
46                         gre.read_packet(&tun_decoder);
47                 }
48                 if (FD_ISSET(tun.fd(), &fds)) {
49                         tun.read_packet(&gre);
50                 }
51         }
52 }