X-Git-Url: https://git.sesse.net/?p=greproxy;a=blobdiff_plain;f=greprotocol.cpp;h=6f3513039ed67e00706bd2458cab0970c0cb3764;hp=0e6b945c371f377ea6506717a0fbd5e8c954f257;hb=HEAD;hpb=47f75fc7569e504a94a601cb3a81793400b134ac diff --git a/greprotocol.cpp b/greprotocol.cpp index 0e6b945..6f35130 100644 --- a/greprotocol.cpp +++ b/greprotocol.cpp @@ -24,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; @@ -44,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; @@ -57,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); @@ -67,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 @@ -74,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); @@ -109,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); }