Browse Source

resolve dest addr remotely in ss-tunnel

pull/69/head
Max Lv 11 years ago
parent
commit
a3172adafd
2 changed files with 14 additions and 43 deletions
  1. 55
      src/tunnel.c
  2. 2
      src/tunnel.h

55
src/tunnel.c

@ -387,36 +387,17 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents)
// send destaddr
char *ss_addr_to_send = malloc(BUF_SIZE);
ssize_t addr_len = 0;
struct sockaddr *sa = &server->destaddr;
ss_addr_to_send[addr_len++] = 1;
if (sa->sa_family == AF_INET)
{
// handle IPv4
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
size_t in_addr_len = sizeof(struct in_addr);
memcpy(ss_addr_to_send + addr_len, &sin->sin_addr, in_addr_len);
addr_len += in_addr_len;
memcpy(ss_addr_to_send + addr_len, &sin->sin_port, 2);
addr_len += 2;
}
else if (sa->sa_family == AF_INET6)
{
// handle IPv6
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
size_t in6_addr_len = sizeof(struct in6_addr);
memcpy(ss_addr_to_send + addr_len, &sin6->sin6_addr, in6_addr_len);
addr_len += in6_addr_len;
memcpy(ss_addr_to_send + addr_len, &sin6->sin6_port, 2);
addr_len += 2;
}
else
{
LOGE("unsupported addr type");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
}
ss_addr_t *sa = &server->destaddr;
int host_len = strlen(sa->host);
uint16_t port = htons(atoi(sa->port));
// treat as domain
ss_addr_to_send[addr_len++] = 3;
ss_addr_to_send[addr_len++] = host_len;
memcpy(ss_addr_to_send + addr_len, sa->host, host_len);
addr_len += host_len;
memcpy(ss_addr_to_send + addr_len, &port, 2);
addr_len += 2;
ss_addr_to_send = ss_encrypt(BUF_SIZE, ss_addr_to_send, &addr_len, server->e_ctx);
if (ss_addr_to_send == NULL)
@ -641,7 +622,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents)
setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif
struct addrinfo hints, *res, *dest;
struct addrinfo hints, *res;
int sockfd;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
@ -658,20 +639,11 @@ static void accept_cb (EV_P_ ev_io *w, int revents)
return;
}
err = getaddrinfo(listener->tunnel_addr.host, listener->tunnel_addr.port, &hints, &dest);
if (err)
{
freeaddrinfo(res);
ERROR("getaddrinfo");
return;
}
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd < 0)
{
ERROR("socket");
freeaddrinfo(res);
freeaddrinfo(dest);
return;
}
@ -688,12 +660,11 @@ static void accept_cb (EV_P_ ev_io *w, int revents)
struct server *server = new_server(serverfd, listener->method);
struct remote *remote = new_remote(sockfd, listener->timeout);
server->destaddr = *dest->ai_addr;
server->destaddr = listener->tunnel_addr;
server->remote = remote;
remote->server = server;
connect(sockfd, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
freeaddrinfo(dest);
// listen to remote connected event
ev_io_start(EV_A_ &remote->send_ctx->io);
ev_timer_start(EV_A_ &remote->send_ctx->watcher);

2
src/tunnel.h

@ -38,7 +38,7 @@ struct server
struct server_ctx *recv_ctx;
struct server_ctx *send_ctx;
struct remote *remote;
struct sockaddr destaddr;
ss_addr_t destaddr;
};
struct remote_ctx

Loading…
Cancel
Save