projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improve proxy server support
[tinc]
/
src
/
protocol_misc.c
diff --git
a/src/protocol_misc.c
b/src/protocol_misc.c
index
d4a45e8
..
0263d00
100644
(file)
--- a/
src/protocol_misc.c
+++ b/
src/protocol_misc.c
@@
-1,7
+1,7
@@
/*
protocol_misc.c -- handle the meta-protocol, miscellaneous functions
Copyright (C) 1999-2005 Ivo Timmermans,
/*
protocol_misc.c -- handle the meta-protocol, miscellaneous functions
Copyright (C) 1999-2005 Ivo Timmermans,
- 2000-20
13
Guus Sliepen <guus@tinc-vpn.org>
+ 2000-20
22
Guus Sliepen <guus@tinc-vpn.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@
-20,19
+20,15
@@
#include "system.h"
#include "system.h"
-#include "
conf
.h"
+#include "
address_cache
.h"
#include "connection.h"
#include "connection.h"
+#include "crypto.h"
#include "logger.h"
#include "meta.h"
#include "net.h"
#include "netutl.h"
#include "protocol.h"
#include "utils.h"
#include "logger.h"
#include "meta.h"
#include "net.h"
#include "netutl.h"
#include "protocol.h"
#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 maxoutbufsize = 0;
int mtu_info_interval = 5;
@@
-43,6
+39,8
@@
bool send_termreq(connection_t *c) {
}
bool termreq_h(connection_t *c, const char *request) {
}
bool termreq_h(connection_t *c, const char *request) {
+ (void)c;
+ (void)request;
return false;
}
return false;
}
@@
-54,6
+52,7
@@
bool send_ping(connection_t *c) {
}
bool ping_h(connection_t *c, const char *request) {
}
bool ping_h(connection_t *c, const char *request) {
+ (void)request;
return send_pong(c);
}
return send_pong(c);
}
@@
-62,23
+61,27
@@
bool send_pong(connection_t *c) {
}
bool pong_h(connection_t *c, const char *request) {
}
bool pong_h(connection_t *c, const char *request) {
+ (void)request;
c->status.pinged = false;
/* Successful connection, reset timeout if this is an outgoing connection. */
c->status.pinged = false;
/* Successful connection, reset timeout if this is an outgoing connection. */
- if(c->outgoing) {
+ if(c->outgoing
&& c->outgoing->timeout
) {
c->outgoing->timeout = 0;
c->outgoing->timeout = 0;
- c->outgoing->cfg = NULL;
+ reset_address_cache(c->outgoing->node->address_cache, &c->address);
+ }
- if(c->outgoing->ai) {
- freeaddrinfo(c->outgoing->ai);
- }
+ return true;
+}
- c->outgoing->ai = NULL;
- c->outgoing->aip = NULL;
+static bool random_early_drop(connection_t *c) {
+ if(c->outbuf.len > (size_t)maxoutbufsize / 2) {
+ if((c->outbuf.len - (size_t)maxoutbufsize / 2) > prng((size_t)maxoutbufsize / 2)) {
+ return true;
+ }
}
}
- return
tru
e;
+ return
fals
e;
}
/* Sending and receiving packets via TCP */
}
/* Sending and receiving packets via TCP */
@@
-87,7
+90,7
@@
bool send_tcppacket(connection_t *c, const vpn_packet_t *packet) {
/* 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 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
) {
+ if(
random_early_drop(c)
) {
return true;
}
return true;
}
@@
-95,13
+98,13
@@
bool send_tcppacket(connection_t *c, const vpn_packet_t *packet) {
return false;
}
return false;
}
- return send_meta(c,
(char *)
DATA(packet), packet->len);
+ return send_meta(c, DATA(packet), packet->len);
}
bool tcppacket_h(connection_t *c, const char *request) {
short int len;
}
bool tcppacket_h(connection_t *c, const char *request) {
short int len;
- if(sscanf(request, "%*d %hd", &len) != 1) {
+ if(sscanf(request, "%*d %hd", &len) != 1
|| len < 0
) {
logger(DEBUG_ALWAYS, LOG_ERR, "Got bad %s from %s (%s)", "PACKET", c->name,
c->hostname);
return false;
logger(DEBUG_ALWAYS, LOG_ERR, "Got bad %s from %s (%s)", "PACKET", c->name,
c->hostname);
return false;
@@
-114,15
+117,15
@@
bool tcppacket_h(connection_t *c, const char *request) {
return true;
}
return true;
}
-bool send_sptps_tcppacket(connection_t *c, const
char *packet, in
t len) {
+bool send_sptps_tcppacket(connection_t *c, const
void *packet, size_
t 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 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
) {
+ if(
random_early_drop(c)
) {
return true;
}
return true;
}
- if(!send_request(c, "%d %
d", SPTPS_PACKET,
len)) {
+ if(!send_request(c, "%d %
lu", SPTPS_PACKET, (unsigned long)
len)) {
return false;
}
return false;
}
@@
-133,7
+136,7
@@
bool send_sptps_tcppacket(connection_t *c, const char *packet, int len) {
bool sptps_tcppacket_h(connection_t *c, const char *request) {
short int len;
bool sptps_tcppacket_h(connection_t *c, const char *request) {
short int len;
- if(sscanf(request, "%*d %hd", &len) != 1) {
+ if(sscanf(request, "%*d %hd", &len) != 1
|| len < 0
) {
logger(DEBUG_ALWAYS, LOG_ERR, "Got bad %s from %s (%s)", "SPTPS_PACKET", c->name,
c->hostname);
return false;
logger(DEBUG_ALWAYS, LOG_ERR, "Got bad %s from %s (%s)", "SPTPS_PACKET", c->name,
c->hostname);
return false;