From e980265bdea23223d4dab3b05a0a6bb5d51551e0 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sun, 12 Jul 2015 22:06:37 +0800 Subject: [PATCH] allow different destination addresses in UDP relay --- src/udprelay.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/udprelay.c b/src/udprelay.c index 2d3d3df7..e0713a87 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -181,7 +181,7 @@ static char *hash_key(const int af, const struct sockaddr_storage *addr) return (char *)enc_md5((const uint8_t *)key, key_len, NULL); } -#if defined(UDPRELAY_REDIR) +#if defined(UDPRELAY_REDIR) || defined(UDPRELAY_REMOTE) static int construct_udprealy_header(const struct sockaddr_storage *in_addr, char *addr_header) { @@ -635,12 +635,13 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) LOGI("[udp] remote receive a packet"); } - struct sockaddr src_addr; + struct sockaddr_storage src_addr; socklen_t src_addr_len = sizeof(src_addr); + memset(&src_addr, 0, src_addr_len); char *buf = malloc(BUF_SIZE); // recv - ssize_t buf_len = recvfrom(remote_ctx->fd, buf, BUF_SIZE, 0, &src_addr, &src_addr_len); + ssize_t buf_len = recvfrom(remote_ctx->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&src_addr, &src_addr_len); if (buf_len == -1) { // error on recv @@ -696,12 +697,19 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) #ifdef UDPRELAY_REMOTE - unsigned int addr_header_len = remote_ctx->addr_header_len; + char addr_header_buf[256]; + char *addr_header = remote_ctx->addr_header; + int addr_header_len = remote_ctx->addr_header_len; + + if (remote_ctx->af == AF_INET || remote_ctx->af == AF_INET6) { + addr_header_len = construct_udprealy_header(&src_addr, addr_header_buf); + addr_header = addr_header_buf; + } // Construct packet buf = realloc(buf, buf_len + addr_header_len); memmove(buf + addr_header_len, buf, buf_len); - memcpy(buf, remote_ctx->addr_header, addr_header_len); + memcpy(buf, addr_header, addr_header_len); buf_len += addr_header_len; buf = ss_encrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);