Browse Source

Refine TFO on Darwin

pull/1813/merge
Max Lv 7 years ago
parent
commit
9ac81759df
2 changed files with 15 additions and 20 deletions
  1. 13
      src/local.c
  2. 22
      src/server.c

13
src/local.c

@ -371,10 +371,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
ev_io_start(EV_A_ & remote->send_ctx->io); ev_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher); ev_timer_start(EV_A_ & remote->send_ctx->watcher);
} else { } 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) #if defined(CONNECT_DATA_IDEMPOTENT)
((struct sockaddr_in *)&(remote->addr))->sin_len = sizeof(struct sockaddr_in); ((struct sockaddr_in *)&(remote->addr))->sin_len = sizeof(struct sockaddr_in);
sa_endpoints_t endpoints; sa_endpoints_t endpoints;
@ -396,6 +393,9 @@ server_recv_cb(EV_P_ ev_io *w, int revents)
#endif #endif
if (s == 0) if (s == 0)
s = send(remote->fd, remote->buf->data, remote->buf->len, 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 #endif
if (s == -1) { if (s == -1) {
if (errno == CONNECT_IN_PROGRESS) { 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); ev_io_start(EV_A_ & remote->send_ctx->io);
return; return;
} else { } else {
ERROR("sendto");
if (errno == ENOTCONN) { if (errno == ENOTCONN) {
LOGE("fast open is not supported on this platform"); LOGE("fast open is not supported on this platform");
// just turn it off // 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); close_and_free_server(EV_A_ server);
return; return;
} }
} else if (s <= (int)(remote->buf->len)) {
} else {
remote->buf->len -= s; remote->buf->len -= s;
remote->buf->idx = 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_io_start(EV_A_ & remote->send_ctx->io);
ev_timer_start(EV_A_ & remote->send_ctx->watcher); ev_timer_start(EV_A_ & remote->send_ctx->watcher);
return; return;
} else {
FATAL("buffer corruption for fast open");
} }
} }
} else { } else {

22
src/server.c

@ -507,17 +507,15 @@ connect_to_remote(EV_P_ struct addrinfo *res,
remote_t *remote = new_remote(sockfd); remote_t *remote = new_remote(sockfd);
if (fast_open) { if (fast_open) {
#if !defined(MSG_FASTOPEN)
#if defined(TCP_FASTOPEN_CONNECT) #if defined(TCP_FASTOPEN_CONNECT)
int optval = 1; int optval = 1;
if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT,
(void *)&optval, sizeof(optval)) < 0) (void *)&optval, sizeof(optval)) < 0)
FATAL("failed to set TCP_FASTOPEN_CONNECT"); FATAL("failed to set TCP_FASTOPEN_CONNECT");
int s = connect(sockfd, res->ai_addr, res->ai_addrlen); 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) #elif defined(CONNECT_DATA_IDEMPOTENT)
((struct sockaddr_in *)(res->ai_addr))->sin_len = sizeof(struct sockaddr_in); ((struct sockaddr_in *)(res->ai_addr))->sin_len = sizeof(struct sockaddr_in);
sa_endpoints_t endpoints; sa_endpoints_t endpoints;
@ -525,16 +523,16 @@ connect_to_remote(EV_P_ struct addrinfo *res,
endpoints.sae_dstaddr = res->ai_addr; endpoints.sae_dstaddr = res->ai_addr;
endpoints.sae_dstaddrlen = res->ai_addrlen; 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, 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 #else
FATAL("fast open is not enabled in this build"); 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 #endif
if (s == -1) { if (s == -1) {
if (errno == CONNECT_IN_PROGRESS) { if (errno == CONNECT_IN_PROGRESS) {

Loading…
Cancel
Save