X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol_misc.c;h=95bd322e72487e3ea506f670d64d22f7f11d0a05;hp=6fedc0823b86785224b64a845484ff5c5b4f2ee5;hb=706d855e507980de3845556989d7de7a3b9c76e8;hpb=76a9be5bce43a1a7363c670882f5315c824c903c diff --git a/src/protocol_misc.c b/src/protocol_misc.c index 6fedc082..95bd322e 100644 --- a/src/protocol_misc.c +++ b/src/protocol_misc.c @@ -30,6 +30,10 @@ #include "utils.h" #include "xalloc.h" +#ifndef MIN +#define MIN(x, y) (((x)<(y))?(x):(y)) +#endif + int maxoutbufsize = 0; int mtu_info_interval = 5; int udp_info_interval = 5; @@ -153,6 +157,36 @@ bool tcppacket_h(connection_t *c, const char *request) { return true; } +bool send_sptps_tcppacket(connection_t *c, const char* packet, int len) { + /* If there already is a lot of data in the outbuf buffer, discard this packet. + We use a very simple Random Early Drop algorithm. */ + + if(2.0 * c->outbuf.len / (float)maxoutbufsize - 1 > (float)rand()/(float)RAND_MAX) + return true; + + if(!send_request(c, "%d %d", SPTPS_PACKET, len)) + return false; + + send_meta_raw(c, packet, len); + return true; +} + +bool sptps_tcppacket_h(connection_t *c, const char* request) { + short int len; + + if(sscanf(request, "%*d %hd", &len) != 1) { + logger(DEBUG_ALWAYS, LOG_ERR, "Got bad %s from %s (%s)", "SPTPS_PACKET", c->name, + c->hostname); + return false; + } + + /* Set sptpslen to len, this will tell receive_meta() that a SPTPS packet is coming. */ + + c->sptpslen = len; + + return true; +} + /* Transmitting UDP information */ bool send_udp_info(node_t *from, node_t *to) {