diff --git a/src/udprelay.c b/src/udprelay.c index 9f2a26cb..7d249926 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -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