X-Git-Url: https://git.sesse.net/?p=greproxy;a=blobdiff_plain;f=greprotocol.cpp;h=6f3513039ed67e00706bd2458cab0970c0cb3764;hp=4a634156789f0aa3848d8ac1aaf5172a65d0bd4d;hb=HEAD;hpb=8e81c01b2de70c5e7e1a73d25ebbece0a95bd2c8 diff --git a/greprotocol.cpp b/greprotocol.cpp index 4a63415..6f35130 100644 --- a/greprotocol.cpp +++ b/greprotocol.cpp @@ -1,9 +1,11 @@ +#include +#include +#include #include #include #include #include "greprotocol.h" -#include "reorderer.h" using namespace std; @@ -22,7 +24,6 @@ struct gre_header { GREProtocol::GREProtocol(const in6_addr &src, const in6_addr &dst) - : seq(0) { memset(&dstaddr, 0, sizeof(dstaddr)); dstaddr.sin6_family = AF_INET6; @@ -42,9 +43,15 @@ GREProtocol::GREProtocol(const in6_addr &src, const in6_addr &dst) 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, int incoming_seq) +void GREProtocol::send_packet(uint16_t proto, const string &data, uint32_t incoming_seq) { char buf[4096]; gre_header *gre = (gre_header *)buf; @@ -55,7 +62,7 @@ void GREProtocol::send_packet(uint16_t proto, const string &data, int incoming_s gre->protocol_type = htons(proto); char *ptr = buf + sizeof(*gre); - int seq_be = htonl(seq++); // Ignore incoming_seq. + uint32_t seq_be = htonl(incoming_seq); memcpy(ptr, &seq_be, sizeof(seq_be)); ptr += sizeof(seq_be); @@ -65,6 +72,8 @@ void GREProtocol::send_packet(uint16_t proto, const string &data, int incoming_s perror("sendto"); return; } + + ++sent_packets; } int GREProtocol::fd() const @@ -72,7 +81,7 @@ int GREProtocol::fd() const return sock; } -void GREProtocol::read_packet(Protocol *sender) +void GREProtocol::read_packet(Sender *sender) { struct sockaddr_storage addr; socklen_t addrlen = sizeof(addr); @@ -107,6 +116,7 @@ void GREProtocol::read_packet(Protocol *sender) //printf("gre packet: proto=%x\n", ntohs(gre->protocol_type)); + ++received_packets; sender->send_packet(ntohs(gre->protocol_type), string(ptr, buf + ret), seq); }