mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-29 04:03:45 +00:00
Refine TFO on Darwin
This commit is contained in:
+5
-8
@@ -371,10 +371,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_io_start(EV_A_ & remote->send_ctx->io);
|
||||
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
|
||||
} else {
|
||||
#if defined(MSG_FASTOPEN)
|
||||
int s = sendto(remote->fd, remote->buf->data, remote->buf->len, MSG_FASTOPEN,
|
||||
(struct sockaddr *)&(remote->addr), remote->addr_len);
|
||||
#else
|
||||
#if !defined(MSG_FASTOPEN)
|
||||
#if defined(CONNECT_DATA_IDEMPOTENT)
|
||||
((struct sockaddr_in *)&(remote->addr))->sin_len = sizeof(struct sockaddr_in);
|
||||
sa_endpoints_t endpoints;
|
||||
@@ -396,6 +393,9 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
#endif
|
||||
if (s == 0)
|
||||
s = send(remote->fd, remote->buf->data, remote->buf->len, 0);
|
||||
#else
|
||||
int s = sendto(remote->fd, remote->buf->data, remote->buf->len, MSG_FASTOPEN,
|
||||
(struct sockaddr *)&(remote->addr), remote->addr_len);
|
||||
#endif
|
||||
if (s == -1) {
|
||||
if (errno == CONNECT_IN_PROGRESS) {
|
||||
@@ -405,7 +405,6 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_io_start(EV_A_ & remote->send_ctx->io);
|
||||
return;
|
||||
} else {
|
||||
ERROR("sendto");
|
||||
if (errno == ENOTCONN) {
|
||||
LOGE("fast open is not supported on this platform");
|
||||
// just turn it off
|
||||
@@ -415,7 +414,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
close_and_free_server(EV_A_ server);
|
||||
return;
|
||||
}
|
||||
} else if (s <= (int)(remote->buf->len)) {
|
||||
} else {
|
||||
remote->buf->len -= s;
|
||||
remote->buf->idx = s;
|
||||
|
||||
@@ -423,8 +422,6 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
ev_io_start(EV_A_ & remote->send_ctx->io);
|
||||
ev_timer_start(EV_A_ & remote->send_ctx->watcher);
|
||||
return;
|
||||
} else {
|
||||
FATAL("buffer corruption for fast open");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
+10
-12
@@ -507,17 +507,15 @@ connect_to_remote(EV_P_ struct addrinfo *res,
|
||||
remote_t *remote = new_remote(sockfd);
|
||||
|
||||
if (fast_open) {
|
||||
|
||||
#if !defined(MSG_FASTOPEN)
|
||||
|
||||
#if defined(TCP_FASTOPEN_CONNECT)
|
||||
int optval = 1;
|
||||
if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT,
|
||||
(void *)&optval, sizeof(optval)) < 0)
|
||||
FATAL("failed to set TCP_FASTOPEN_CONNECT");
|
||||
int s = connect(sockfd, res->ai_addr, res->ai_addrlen);
|
||||
if (s == 0)
|
||||
s = send(sockfd, server->buf->data, server->buf->len, 0);
|
||||
#elif defined(MSG_FASTOPEN)
|
||||
ssize_t s = sendto(sockfd, server->buf->data, server->buf->len,
|
||||
MSG_FASTOPEN, res->ai_addr, res->ai_addrlen);
|
||||
#elif defined(CONNECT_DATA_IDEMPOTENT)
|
||||
((struct sockaddr_in *)(res->ai_addr))->sin_len = sizeof(struct sockaddr_in);
|
||||
sa_endpoints_t endpoints;
|
||||
@@ -525,16 +523,16 @@ connect_to_remote(EV_P_ struct addrinfo *res,
|
||||
endpoints.sae_dstaddr = res->ai_addr;
|
||||
endpoints.sae_dstaddrlen = res->ai_addrlen;
|
||||
|
||||
struct iovec iov;
|
||||
iov.iov_base = server->buf->data;
|
||||
iov.iov_len = server->buf->len;
|
||||
size_t len;
|
||||
int s = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY, CONNECT_DATA_IDEMPOTENT,
|
||||
&iov, 1, &len, NULL);
|
||||
if (s == 0)
|
||||
s = len;
|
||||
NULL, 0, NULL, NULL);
|
||||
#else
|
||||
FATAL("fast open is not enabled in this build");
|
||||
#endif
|
||||
if (s == 0)
|
||||
s = send(sockfd, server->buf->data, server->buf->len, 0);
|
||||
#else
|
||||
ssize_t s = sendto(sockfd, server->buf->data, server->buf->len,
|
||||
MSG_FASTOPEN, res->ai_addr, res->ai_addrlen);
|
||||
#endif
|
||||
if (s == -1) {
|
||||
if (errno == CONNECT_IN_PROGRESS) {
|
||||
|
||||
Reference in New Issue
Block a user