2 #include <netinet/in.h>
5 #include <sys/select.h>
6 #include <sys/socket.h>
8 #include "greprotocol.h"
10 #include "tunprotocol.h"
11 #include "rsdecoder.h"
17 in6_addr get_addr(const char *str) {
19 if (inet_pton(AF_INET6, str, &ret) != 1) {
20 fprintf(stderr, "Could not parse %s\n", str);
26 int main(int argc, char **argv)
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");
34 Pacer tun_pacer(&tun, 40000, 6);
35 Reorderer tun_reorderer(&tun_pacer);
36 RSDecoder tun_decoder(&tun_reorderer);
38 int last_rcvd = 0, last_reorders = 0;
39 int last_fec_recovered = 0, last_lost = 0;
43 gettimeofday(&last_print, NULL);
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);
59 if (FD_ISSET(gre.fd(), &fds)) {
60 gre.read_packet(&tun_decoder);
62 if (FD_ISSET(tun.fd(), &fds)) {
63 tun.read_packet(&gre_pacer);
65 tun_pacer.possibly_flush_packets();
68 gettimeofday(&now, NULL);
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 sent = gre.get_sent_packets();
77 fprintf(stderr, "%5dp rcvd, %3dp FEC recovered, %4d reorders, %3dp lost, %5dp output. %5dp sent\n",
78 rcvd - last_rcvd, fec_recovered - last_fec_recovered,
79 reorders - last_reorders, lost - last_lost,
80 output - last_output, sent - last_sent);
82 last_fec_recovered = fec_recovered;
83 last_reorders = reorders;