]> git.sesse.net Git - greproxy/blob - tungre.cpp
Make Reorderer handle multi-timeouts.
[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 #include "pacer.h"
13
14 using namespace std;
15
16 in6_addr get_addr(const char *str) {
17         in6_addr ret;
18         if (inet_pton(AF_INET6, str, &ret) != 1) {
19                 fprintf(stderr, "Could not parse %s\n", str);
20                 exit(1);
21         }
22         return ret;
23 }
24
25 int main(int argc, char **argv)
26 {
27         in6_addr myaddr = get_addr(argv[1]);
28         in6_addr remoteaddr = get_addr(argv[2]);
29         GREProtocol gre(myaddr, remoteaddr);
30         Pacer gre_pacer(&gre, 40000, 6);
31         TUNProtocol tun("tungre");
32
33         Pacer tun_pacer(&tun, 40000, 6);
34         Reorderer tun_reorderer(&tun_pacer);
35         RSDecoder tun_decoder(&tun_reorderer);
36
37         fd_set fds;
38         FD_ZERO(&fds);
39         for ( ;; ) {
40                 FD_SET(gre.fd(), &fds);
41                 FD_SET(tun.fd(), &fds);
42                 int ret = select(1024, &fds, NULL, NULL, NULL);
43                 if (ret == -1) {
44                         perror("select");
45                         continue;
46                 }
47
48                 if (FD_ISSET(gre.fd(), &fds)) {
49                         gre.read_packet(&tun_decoder);
50                 }
51                 if (FD_ISSET(tun.fd(), &fds)) {
52                         tun.read_packet(&gre_pacer);
53                 }
54         }
55 }