mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-30 13:13:44 +00:00
WiP: finish the udp part
This commit is contained in:
+27
-2
@@ -1,4 +1,4 @@
|
||||
# Makefile.in generated by automake 1.11.3 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.11.6 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
@@ -16,6 +16,23 @@
|
||||
@SET_MAKE@
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
esac; \
|
||||
done;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
@@ -122,6 +139,11 @@ SOURCES = $(ss_local_SOURCES) $(ss_redir_SOURCES) $(ss_server_SOURCES) \
|
||||
DIST_SOURCES = $(am__ss_local_SOURCES_DIST) \
|
||||
$(am__ss_redir_SOURCES_DIST) $(ss_server_SOURCES) \
|
||||
$(am__ss_tunnel_SOURCES_DIST)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
@@ -310,8 +332,11 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(am__aclocal_m4_deps):
|
||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
|
||||
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed 's/$(EXEEXT)$$//' | \
|
||||
while read p p1; do if test -f $$p || test -f $$p1; \
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
int udprelay_init(const char *server_host, const char *server_port,
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
const char *remote_host, const char *remote_port,
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
const addr_t tunnel_addr,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef UDPRELAY_REMOTE
|
||||
asyncns_t *asyncns,
|
||||
|
||||
+12
-3
@@ -35,7 +35,16 @@ static char *to_string(const json_value *value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void parse_addr(const char *str, addr_t *addr) {
|
||||
void free_addr(addr_t *addr)
|
||||
{
|
||||
free(addr->host);
|
||||
free(addr->port);
|
||||
addr->host = NULL;
|
||||
addr->port = NULL;
|
||||
}
|
||||
|
||||
void parse_addr(const char *str, addr_t *addr)
|
||||
{
|
||||
int ret = -1, n = 0;
|
||||
char *pch;
|
||||
pch = strchr(str, ':');
|
||||
@@ -52,13 +61,13 @@ void parse_addr(const char *str, addr_t *addr) {
|
||||
}
|
||||
if (ret == -1)
|
||||
{
|
||||
addr->host = str;
|
||||
addr->host = strdup(str);
|
||||
addr->port = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
addr->host = ss_strndup(str, ret);
|
||||
addr->port = str + ret + 1;
|
||||
addr->port = strdup(str + ret + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -8,8 +8,8 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *host;
|
||||
const char *port;
|
||||
char *host;
|
||||
char *port;
|
||||
} addr_t;
|
||||
|
||||
typedef struct
|
||||
@@ -26,5 +26,6 @@ typedef struct
|
||||
|
||||
jconf_t *read_jconf(const char* file);
|
||||
void parse_addr(const char *str, addr_t *addr);
|
||||
void free_addr(addr_t *addr);
|
||||
|
||||
#endif // _JCONF_H
|
||||
|
||||
+8
-6
@@ -718,6 +718,7 @@ int main (int argc, char **argv)
|
||||
char *remote_port = NULL;
|
||||
|
||||
addr_t tunnel_addr = {.host = NULL, .port = NULL};
|
||||
char *tunnel_addr_str = NULL;
|
||||
|
||||
opterr = 0;
|
||||
|
||||
@@ -761,7 +762,7 @@ int main (int argc, char **argv)
|
||||
udprelay = 1;
|
||||
break;
|
||||
case 'L':
|
||||
tunnel_addr.host = optarg;
|
||||
tunnel_addr_str = optarg;
|
||||
break;
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
@@ -794,7 +795,7 @@ int main (int argc, char **argv)
|
||||
if (timeout == NULL) timeout = conf->timeout;
|
||||
}
|
||||
|
||||
if (remote_num == 0 || remote_port == NULL ||
|
||||
if (remote_num == 0 || remote_port == NULL || tunnel_addr_str == NULL ||
|
||||
local_port == NULL || password == NULL)
|
||||
{
|
||||
usage();
|
||||
@@ -811,9 +812,9 @@ int main (int argc, char **argv)
|
||||
demonize(pid_path);
|
||||
}
|
||||
|
||||
if (tunnel_addr.host != NULL) {
|
||||
parse_addr(tunnel_addr.host, &tunnel_addr);
|
||||
}
|
||||
// parse tunnel addr
|
||||
parse_addr(tunnel_addr_str, &tunnel_addr);
|
||||
free(tunnel_addr_str);
|
||||
|
||||
#ifdef __MINGW32__
|
||||
winsock_init();
|
||||
@@ -869,7 +870,8 @@ int main (int argc, char **argv)
|
||||
if (udprelay)
|
||||
{
|
||||
LOGD("udprelay enabled.");
|
||||
udprelay_init(local_addr, local_port, remote_addr[0].host, remote_addr[0].port, m, listen_ctx.timeout, iface);
|
||||
udprelay_init(local_addr, local_port, remote_addr[0].host, remote_addr[0].port,
|
||||
tunnel_addr, m, listen_ctx.timeout, iface);
|
||||
}
|
||||
|
||||
ev_run (loop, 0);
|
||||
|
||||
@@ -538,8 +538,10 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
#endif
|
||||
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
#ifndef UDPRELAY_TUNNEL
|
||||
uint8_t frag = *(uint8_t*)(buf + 2);
|
||||
offset += 3;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -581,6 +583,21 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
char addr_header[256] = {0};
|
||||
char* host = server_ctx->tunnel_addr.host;
|
||||
char* port = server_ctx->tunnel_addr.port;
|
||||
int host_len = strlen(host);
|
||||
uint16_t port_num = (uint16_t)atoi(port);
|
||||
uint16_t port_net_num = htons(port_num);
|
||||
int addr_header_len = 1 + host_len + 2;
|
||||
|
||||
// initialize the addr header
|
||||
addr_header[0] = 3;
|
||||
memcpy(addr_header + 1, host, host_len);
|
||||
memcpy(addr_header + 1 + host_len, &port_net_num, 2);
|
||||
|
||||
#else
|
||||
char host[256] = {0};
|
||||
char port[64] = {0};
|
||||
|
||||
@@ -592,6 +609,8 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
char *addr_header = buf + offset;
|
||||
#endif
|
||||
|
||||
char *key = hash_key(addr_header, addr_header_len, &src_addr);
|
||||
struct cache *conn_cache = server_ctx->conn_cache;
|
||||
|
||||
@@ -615,11 +634,13 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
|
||||
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
|
||||
#ifndef UDPRELAY_TUNNEL
|
||||
if (frag)
|
||||
{
|
||||
LOGE("drop a message since frag is not 0, but %d", frag);
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (remote_ctx == NULL)
|
||||
{
|
||||
@@ -750,6 +771,9 @@ void free_cb(void *element)
|
||||
int udprelay_init(const char *server_host, const char *server_port,
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
const char *remote_host, const char *remote_port,
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
const addr_t tunnel_addr,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef UDPRELAY_REMOTE
|
||||
asyncns_t *asyncns,
|
||||
@@ -783,6 +807,9 @@ int udprelay_init(const char *server_host, const char *server_port,
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
server_ctx->remote_host = remote_host;
|
||||
server_ctx->remote_port = remote_port;
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
server_ctx->tunnel_addr = tunnel_addr;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef UDPRELAY_REMOTE
|
||||
server_ctx->asyncns = asyncns;
|
||||
|
||||
@@ -32,6 +32,9 @@ struct server_ctx
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
const char *remote_host;
|
||||
const char *remote_port;
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
addr_t tunnel_addr;
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user