2 #include <netinet/in.h>
5 #include <sys/select.h>
6 #include <sys/socket.h>
8 #include "greprotocol.h"
10 #include "rsencoder.h"
15 in6_addr get_addr(const char *str) {
17 if (inet_pton(AF_INET6, str, &ret) != 1) {
18 fprintf(stderr, "Could not parse %s\n", str);
24 int main(int argc, char **argv)
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);
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);
54 if (FD_ISSET(gre_a.fd(), &fds)) {
55 gre_a.read_packet(&reorder_b);
57 if (FD_ISSET(gre_b.fd(), &fds)) {
58 gre_b.read_packet(&reorder_a);
60 pacer_a.possibly_flush_packets();
61 pacer_b.possibly_flush_packets();