WiP: finish the udp part

This commit is contained in:
Max Lv
2014-02-21 11:59:32 +09:00
parent 6107427bf0
commit 84e04eefaa
13 changed files with 331 additions and 178 deletions
+27 -2
View File
@@ -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; \
+3
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+27
View File
@@ -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;
+3
View File
@@ -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
};