Browse Source

Refine event handling

pull/886/head
Max Lv 8 years ago
parent
commit
7029cfca3a
5 changed files with 35 additions and 60 deletions
  1. 14
      src/local.c
  2. 13
      src/redir.c
  3. 32
      src/server.c
  4. 24
      src/tls.c
  5. 12
      src/tunnel.c

14
src/local.c

@ -300,16 +300,10 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
return;
}
if (r == 0) {
if (verbose)
LOGI("connected immediately");
remote_send_cb(EV_A_ & remote->send_ctx->io, 0);
} else {
// wait on remote connected event
ev_io_stop(EV_A_ & server_recv_ctx->io);
ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
// wait on remote connected event
ev_io_stop(EV_A_ & server_recv_ctx->io);
ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
} else {
#ifdef TCP_FASTOPEN
#ifdef __APPLE__

13
src/redir.c

@ -728,16 +728,9 @@ accept_cb(EV_P_ ev_io *w, int revents)
return;
}
if (r == 0) {
if (verbose)
LOGI("connected immediately");
remote_send_cb(EV_A_ & remote->send_ctx->io, 0);
} else {
// listen to remote connected event
ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
// listen to remote connected event
ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
ev_io_start(EV_A_ & server->recv_ctx->io);
}

32
src/server.c

@ -95,8 +95,7 @@ static void server_timeout_cb(EV_P_ ev_timer *watcher, int revents);
static remote_t *new_remote(int fd);
static server_t *new_server(int fd, listen_ctx_t *listener);
static remote_t *connect_to_remote(struct addrinfo *res,
server_t *server,
int *connected);
server_t *server);
static void free_remote(remote_t *remote);
static void close_and_free_remote(EV_P_ remote_t *remote);
@ -464,8 +463,7 @@ create_and_bind(const char *host, const char *port, int mptcp)
static remote_t *
connect_to_remote(struct addrinfo *res,
server_t *server,
int *connected)
server_t *server)
{
int sockfd;
#ifdef SET_INTERFACE
@ -559,8 +557,6 @@ connect_to_remote(struct addrinfo *res,
close(sockfd);
return NULL;
}
*connected = r == 0;
}
return remote;
@ -880,8 +876,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
}
if (!need_query) {
int connected = 0;
remote_t *remote = connect_to_remote(&info, server, &connected);
remote_t *remote = connect_to_remote(&info, server);
if (remote == NULL) {
LOGE("connect error");
@ -902,13 +897,9 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
server->stage = 4;
if (connected) {
remote_send_cb(EV_A_ & remote->send_ctx->io, 0);
} else {
// waiting on remote connected event
ev_io_stop(EV_A_ & server_recv_ctx->io);
ev_io_start(EV_A_ & remote->send_ctx->io);
}
// waiting on remote connected event
ev_io_stop(EV_A_ & server_recv_ctx->io);
ev_io_start(EV_A_ & remote->send_ctx->io);
}
} else {
query_t *query = (query_t *)ss_malloc(sizeof(query_t));
@ -1051,8 +1042,7 @@ server_resolve_cb(struct sockaddr *addr, void *data)
info.ai_addrlen = sizeof(struct sockaddr_in6);
}
int connected = 0;
remote_t *remote = connect_to_remote(&info, server, &connected);
remote_t *remote = connect_to_remote(&info, server);
if (remote == NULL) {
LOGE("connect error");
@ -1071,12 +1061,8 @@ server_resolve_cb(struct sockaddr *addr, void *data)
server->buf->idx = 0;
}
if (connected) {
remote_send_cb(EV_A_ & remote->send_ctx->io, 0);
} else {
// listen to remote connected event
ev_io_start(EV_A_ & remote->send_ctx->io);
}
// listen to remote connected event
ev_io_start(EV_A_ & remote->send_ctx->io);
}
}
}

24
src/tls.c

@ -56,6 +56,8 @@
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
#endif
extern int verbose;
static int parse_tls_header(const char *, size_t, char **);
static int parse_extensions(const char *, size_t, char **);
static int parse_server_name_extension(const char *, size_t, char **);
@ -102,21 +104,24 @@ parse_tls_header(const char *data, size_t data_len, char **hostname)
* See RFC5246 Appendix E.2
*/
if (data[0] & 0x80 && data[2] == 1) {
LOGI("Received SSL 2.0 Client Hello which can not support SNI.");
if (verbose)
LOGI("Received SSL 2.0 Client Hello which can not support SNI.");
return -2;
}
tls_content_type = data[0];
if (tls_content_type != TLS_HANDSHAKE_CONTENT_TYPE) {
LOGI("Request did not begin with TLS handshake.");
if (verbose)
LOGI("Request did not begin with TLS handshake.");
return -5;
}
tls_version_major = data[1];
tls_version_minor = data[2];
if (tls_version_major < 3) {
LOGI("Received SSL %d.%d handshake which can not support SNI.",
tls_version_major, tls_version_minor);
if (verbose)
LOGI("Received SSL %d.%d handshake which can not support SNI.",
tls_version_major, tls_version_minor);
return -2;
}
@ -137,7 +142,8 @@ parse_tls_header(const char *data, size_t data_len, char **hostname)
return -5;
}
if (data[pos] != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) {
LOGI("Not a client hello");
if (verbose)
LOGI("Not a client hello");
return -5;
}
@ -170,7 +176,8 @@ parse_tls_header(const char *data, size_t data_len, char **hostname)
pos += 1 + len;
if (pos == data_len && tls_version_major == 3 && tls_version_minor == 0) {
LOGI("Received SSL 3.0 handshake without extensions");
if (verbose)
LOGI("Received SSL 3.0 handshake without extensions");
return -2;
}
@ -242,8 +249,9 @@ parse_server_name_extension(const char *data, size_t data_len,
return len;
default:
LOGI("Unknown server name extension name type: %d",
data[pos]);
if (verbose)
LOGI("Unknown server name extension name type: %d",
data[pos]);
}
pos += 3 + len;
}

12
src/tunnel.c

@ -699,15 +699,9 @@ accept_cb(EV_P_ ev_io *w, int revents)
return;
}
if (r == 0) {
if (verbose)
LOGI("connected immediately");
remote_send_cb(EV_A_ & remote->send_ctx->io, 0);
} else {
// listen to remote connected event
ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
// listen to remote connected event
ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
void

Loading…
Cancel
Save