]> git.sesse.net Git - greproxy/blob - greproxy.cpp
Add FEC.
[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
12 using namespace std;
13
14 in6_addr get_addr(const char *str) {
15         in6_addr ret;
16         if (inet_pton(AF_INET6, str, &ret) != 1) {
17                 fprintf(stderr, "Could not parse %s\n", str);
18                 exit(1);
19         }
20         return ret;
21 }
22
23 int main(int argc, char **argv)
24 {
25         in6_addr addr_a = get_addr(argv[1]);
26         in6_addr addr_b = get_addr(argv[2]);
27         in6_addr myaddr = get_addr(argv[3]);
28         GREProtocol gre_a(myaddr, addr_a);
29         GREProtocol gre_b(myaddr, addr_b);
30         RSEncoder rs_a(&gre_a);
31         RSEncoder rs_b(&gre_b);
32         Reorderer reorder_a(&rs_a);
33         Reorderer reorder_b(&rs_b);
34
35         fd_set fds;
36         FD_ZERO(&fds);
37         for ( ;; ) {
38                 FD_SET(gre_a.fd(), &fds);
39                 FD_SET(gre_b.fd(), &fds);
40                 int ret = select(1024, &fds, NULL, NULL, NULL);
41                 if (ret == -1) {
42                         perror("select");
43                         continue;
44                 }
45
46                 if (FD_ISSET(gre_a.fd(), &fds)) {
47                         gre_a.read_packet(&reorder_b);
48                 }
49                 if (FD_ISSET(gre_b.fd(), &fds)) {
50                         gre_b.read_packet(&reorder_a);
51                 }
52         }
53 }