From e2c24d6ac8fc558f1122d90129dd62630f994d18 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Mon, 20 Mar 2017 22:59:14 +0800 Subject: [PATCH] Refine TFO in ss-redir --- src/redir.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/redir.c b/src/redir.c index 163a8c9b..13cdaa1c 100644 --- a/src/redir.c +++ b/src/redir.c @@ -230,8 +230,6 @@ server_recv_cb(EV_P_ ev_io *w, int revents) dns_ntop(AF_INET, &(sa->sin_addr), ipstr, INET_ADDRSTRLEN); port = ntohs(sa->sin_port); } else { - // TODO: The code below need to be test in IPv6 envirment, which I - // don't have. struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&(server->destaddr); dns_ntop(AF_INET6, &(sa->sin6_addr), ipstr, INET6_ADDRSTRLEN); port = ntohs(sa->sin6_port); @@ -465,8 +463,10 @@ remote_send_cb(EV_P_ ev_io *w, int revents) } if (r == 0) { remote_send_ctx->connected = 1; + ev_io_stop(EV_A_ & remote_send_ctx->io); ev_io_stop(EV_A_ & server->recv_ctx->io); + ev_io_start(EV_A_ & remote->recv_ctx->io); ev_timer_start(EV_A_ & remote->recv_ctx->watcher); // send destaddr @@ -530,8 +530,6 @@ remote_send_cb(EV_P_ ev_io *w, int revents) bprepend(remote->buf, abuf, BUF_SIZE); bfree(abuf); - - ev_io_start(EV_A_ & remote->recv_ctx->io); } else { ERROR("getpeername"); // not connected @@ -553,13 +551,16 @@ remote_send_cb(EV_P_ ev_io *w, int revents) s = sendto(remote->fd, remote->buf->data + remote->buf->idx, remote->buf->len, MSG_FASTOPEN, remote->addr, get_sockaddr_len(remote->addr)); + if (s == -1 && (errno == EOPNOTSUPP || errno == EPROTONOSUPPORT || errno == ENOPROTOOPT)) { fast_open = 0; LOGE("fast open is not supported on this platform"); - s = connect(remote->fd, remote->addr, - get_sockaddr_len(remote->addr)); + close_and_free_remote(EV_A_ remote); + close_and_free_server(EV_A_ server); + return; } + remote->addr = NULL; if (s == -1) {