tinc-gui: Reformat codebase according to PEP8
[tinc] / src / protocol_misc.c
index d76ab09..95bd322 100644 (file)
 #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;
 
 /* Status and error notification routines */
@@ -152,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) {
@@ -261,8 +296,15 @@ bool send_mtu_info(node_t *from, node_t *to, int mtu) {
        if(!to->status.reachable)
                return true;
 
-       if(from == myself && to->connection)
-               return true;
+       if(from == myself) {
+               if(to->connection)
+                       return true;
+
+               struct timeval elapsed;
+               timersub(&now, &to->mtu_info_sent, &elapsed);
+               if(elapsed.tv_sec < mtu_info_interval)
+                       return true;
+       }
 
        if((to->nexthop->options >> 24) < 6)
                return true;
@@ -284,6 +326,9 @@ bool send_mtu_info(node_t *from, node_t *to, int mtu) {
                mtu = MIN(mtu, via->nexthop->minmtu);
        }
 
+       if(from == myself)
+               to->mtu_info_sent = now;
+
        /* If none of the conditions above match in the steady state, it means we're using TCP,
           so the MTU is irrelevant. That said, it is still important to honor the MTU that was passed in,
           because other parts of the relay path might be able to use UDP, which means they care about the MTU. */