+#include <arpa/inet.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "greprotocol.h"
-#include "reorderer.h"
using namespace std;
GREProtocol::GREProtocol(const in6_addr &src, const in6_addr &dst)
- : seq(0)
{
memset(&dstaddr, 0, sizeof(dstaddr));
dstaddr.sin6_family = AF_INET6;
perror("bind");
exit(1);
}
+
+ int buf = 10 << 20; // 20 MB.
+ if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &buf, sizeof(buf)) == -1) {
+ perror("setsockopt(SO_RCVBUF)");
+ exit(1);
+ }
}
-void GREProtocol::send_packet(uint16_t proto, const string &data)
+void GREProtocol::send_packet(uint16_t proto, const string &data, int incoming_seq)
{
char buf[4096];
gre_header *gre = (gre_header *)buf;
gre->protocol_type = htons(proto);
char *ptr = buf + sizeof(*gre);
- int seq_be = htonl(seq++);
+ int seq_be = htonl(incoming_seq);
memcpy(ptr, &seq_be, sizeof(seq_be));
ptr += sizeof(seq_be);
perror("sendto");
return;
}
+
+ ++sent_packets;
}
int GREProtocol::fd() const
return sock;
}
-void GREProtocol::read_packet(Reorderer *sender)
+void GREProtocol::read_packet(Sender *sender)
{
struct sockaddr_storage addr;
socklen_t addrlen = sizeof(addr);
//printf("gre packet: proto=%x\n", ntohs(gre->protocol_type));
- sender->handle_packet(ntohs(gre->protocol_type), string(ptr, buf + ret), seq);
+ ++received_packets;
+ sender->send_packet(ntohs(gre->protocol_type), string(ptr, buf + ret), seq);
}