mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-25 10:13:44 +00:00
fix the udp connection cache
This commit is contained in:
+48
-5
@@ -148,9 +148,45 @@ static int parse_udprealy_header(const char* buf, const int buf_len, char *host,
|
||||
offset += 2;
|
||||
|
||||
return offset;
|
||||
|
||||
}
|
||||
|
||||
static char *get_ip_str(const struct sockaddr *sa)
|
||||
{
|
||||
static char s[256];
|
||||
memset(s, 0, 256);
|
||||
char addr[128] = {0};
|
||||
char port[16] = {0};
|
||||
uint16_t p;
|
||||
|
||||
switch(sa->sa_family) {
|
||||
case AF_INET:
|
||||
inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
|
||||
addr, 256);
|
||||
p = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
||||
sprintf(port, "%d", p);
|
||||
break;
|
||||
|
||||
case AF_INET6:
|
||||
inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
|
||||
addr, 256);
|
||||
p = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
||||
sprintf(port, "%d", p);
|
||||
break;
|
||||
|
||||
default:
|
||||
strncpy(s, "Unknown AF", 128);
|
||||
}
|
||||
|
||||
int addr_len = strlen(addr);
|
||||
int port_len = strlen(port);
|
||||
memcpy(s, addr, addr_len);
|
||||
memcpy(s + addr_len + 1, port, port_len);
|
||||
s[addr_len] = ':';
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
int create_remote_socket(int ipv6)
|
||||
{
|
||||
int remote_sock;
|
||||
@@ -632,18 +668,27 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
struct remote_ctx *remote_ctx = NULL;
|
||||
cache_lookup(conn_cache, key, (void*)&remote_ctx);
|
||||
|
||||
if (remote_ctx != NULL)
|
||||
{
|
||||
if (memcmp(&src_addr, &remote_ctx->src_addr, sizeof(src_addr))
|
||||
|| strcmp(addr_header, remote_ctx->addr_header) != 0)
|
||||
{
|
||||
remote_ctx = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (remote_ctx == NULL)
|
||||
{
|
||||
if (verbose)
|
||||
{
|
||||
LOGD("[udp] cache missed: %s:%s", host, port);
|
||||
LOGD("[udp] cache missed: %s:%s <-> %s", host, port, get_ip_str(&src_addr));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (verbose)
|
||||
{
|
||||
LOGD("[udp] cache hit: %s:%s", host, port);
|
||||
LOGD("[udp] cache hit: %s:%s <-> %s", host, port, get_ip_str(&src_addr));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -757,7 +802,6 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
int s = sendto(remote_ctx->fd, buf + addr_header_len,
|
||||
buf_len - addr_header_len, 0, &remote_ctx->dst_addr, sizeof(remote_ctx->dst_addr));
|
||||
|
||||
@@ -765,7 +809,6 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
{
|
||||
ERROR("udprelay_sendto_remote");
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user