]> git.sesse.net Git - greproxy/blob - tungre.cpp
Merge branch 'master' of /srv/git.sesse.net/www/greproxy
[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 #include "timeutil.h"
14
15 using namespace std;
16
17 in6_addr get_addr(const char *str) {
18         in6_addr ret;
19         if (inet_pton(AF_INET6, str, &ret) != 1) {
20                 fprintf(stderr, "Could not parse %s\n", str);
21                 exit(1);
22         }
23         return ret;
24 }
25
26 int main(int argc, char **argv)
27 {
28         in6_addr myaddr = get_addr(argv[1]);
29         in6_addr remoteaddr = get_addr(argv[2]);
30         GREProtocol gre(myaddr, remoteaddr);
31         Pacer gre_pacer(&gre, 40000, 6);
32         TUNProtocol tun("tungre");
33
34         Pacer tun_pacer(&tun, 40000, 6);
35         Reorderer tun_reorderer(&tun_pacer);
36         RSDecoder tun_decoder(&tun_reorderer);
37
38         int last_rcvd = 0, last_reorders = 0;
39         int last_fec_recovered = 0, last_lost = 0;
40         int last_output = 0, last_ts_discontinuities = 0;
41         int last_sent = 0;
42         timeval last_print;
43         gettimeofday(&last_print, NULL);
44
45         fd_set fds;
46         FD_ZERO(&fds);
47         for ( ;; ) {
48                 timeval tv = { 1, 0 };
49                 FD_SET(gre.fd(), &fds);
50                 FD_SET(tun.fd(), &fds);
51                 tun_reorderer.possibly_adjust_tv(&tv);
52                 tun_pacer.possibly_adjust_tv(&tv);
53                 int ret = select(1024, &fds, NULL, NULL, &tv);
54                 if (ret == -1) {
55                         perror("select");
56                         continue;
57                 }
58
59                 if (FD_ISSET(gre.fd(), &fds)) {
60                         gre.read_packet(&tun_decoder);
61                 }
62                 if (FD_ISSET(tun.fd(), &fds)) {
63                         tun.read_packet(&gre_pacer);
64                 }
65                 tun_pacer.possibly_flush_packets();
66
67                 timeval now;
68                 gettimeofday(&now, NULL);
69
70                 if (tdiff(last_print, now) > 10.0) {
71                         int rcvd = gre.get_received_packets();
72                         int fec_recovered = tun_decoder.get_recovered_packets();
73                         int reorders = tun_reorderer.get_reorders();
74                         int lost = tun_reorderer.get_lost_packets();
75                         int output = tun.get_sent_packets();
76                         int ts_discontinuities = tun_reorderer.get_ts_discontinuities();
77                         int sent = gre.get_sent_packets();
78                         fprintf(stderr, "%5dp rcvd, %3dp FEC recovered, %4d reorders, %3dp lost, %5dp output, %3d TS discontinuities.  %5dp sent\n",
79                                 rcvd - last_rcvd, fec_recovered - last_fec_recovered,
80                                 reorders - last_reorders, lost - last_lost,
81                                 output - last_output,
82                                 ts_discontinuities - last_ts_discontinuities,
83                                 sent - last_sent);
84                         last_rcvd = rcvd;
85                         last_fec_recovered = fec_recovered;
86                         last_reorders = reorders;
87                         last_lost = lost;
88                         last_output = output;
89                         last_ts_discontinuities = ts_discontinuities;
90                         last_sent = sent;
91                         last_print = now;
92                 }
93         }
94 }