]> git.sesse.net Git - greproxy/blob - greproxy.cpp
Merge branch 'master' of /srv/git.sesse.net/www/greproxy
[greproxy] / greproxy.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 "rsencoder.h"
11 #include "pacer.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 addr_a = get_addr(argv[1]);
27         in6_addr addr_b = get_addr(argv[2]);
28         in6_addr myaddr = get_addr(argv[3]);
29         GREProtocol gre_a(myaddr, addr_a);
30         GREProtocol gre_b(myaddr, addr_b);
31         Pacer pacer_a(&gre_a, 40000, 6);
32         Pacer pacer_b(&gre_b, 40000, 6);
33         RSEncoder rs_a(&pacer_a);
34         RSEncoder rs_b(&pacer_b);
35         Reorderer reorder_a(&rs_a);
36         Reorderer reorder_b(&rs_b);
37
38         fd_set fds;
39         FD_ZERO(&fds);
40         for ( ;; ) {
41                 timeval tv = { 1, 0 };
42                 FD_SET(gre_a.fd(), &fds);
43                 FD_SET(gre_b.fd(), &fds);
44                 pacer_a.possibly_adjust_tv(&tv);
45                 pacer_b.possibly_adjust_tv(&tv);
46                 reorder_a.possibly_adjust_tv(&tv);
47                 reorder_b.possibly_adjust_tv(&tv);
48                 int ret = select(1024, &fds, NULL, NULL, &tv);
49                 if (ret == -1) {
50                         perror("select");
51                         continue;
52                 }
53
54                 if (FD_ISSET(gre_a.fd(), &fds)) {
55                         gre_a.read_packet(&reorder_b);
56                 }
57                 if (FD_ISSET(gre_b.fd(), &fds)) {
58                         gre_b.read_packet(&reorder_a);
59                 }
60                 pacer_a.possibly_flush_packets();
61                 pacer_b.possibly_flush_packets();
62         }
63 }