Skip to content

Commit 3807b57

Browse files
committed
refine fast open
1 parent 7a1f76b commit 3807b57

File tree

2 files changed

+29
-32
lines changed

2 files changed

+29
-32
lines changed

src/local.c

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
203203
}
204204
}
205205

206-
while (r > 0)
206+
while (1)
207207
{
208208
// local socks5 server
209209
if (server->stage == 5)
@@ -215,27 +215,9 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
215215
return;
216216
}
217217

218-
// Copy to remote->buf
219-
if (buf != remote->buf) {
220-
memcpy(remote->buf, buf, r);
221-
}
222-
223218
// insert shadowsocks header
224219
if (!remote->direct)
225220
{
226-
if (!remote->send_ctx->connected)
227-
{
228-
char *tmp = malloc(max(BUF_SIZE, r + server->addr_len));
229-
230-
memcpy(tmp, server->addr_to_send, server->addr_len);
231-
memcpy(tmp + server->addr_len, remote->buf, r);
232-
r += server->addr_len;
233-
234-
// deallocate
235-
free(remote->buf);
236-
remote->buf = tmp;
237-
}
238-
239221
remote->buf = ss_encrypt(BUF_SIZE, remote->buf, &r, server->e_ctx);
240222

241223
if (remote->buf == NULL)
@@ -342,7 +324,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
342324
}
343325

344326
// all processed
345-
r = 0;
327+
return;
346328
}
347329
else if (server->stage == 0)
348330
{
@@ -352,8 +334,6 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
352334
char *send_buf = (char *)&response;
353335
send(server->fd, send_buf, sizeof(response), 0);
354336
server->stage = 1;
355-
r -= 3;
356-
buf += 3;
357337
return;
358338
}
359339
else if (server->stage == 1)
@@ -452,12 +432,10 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
452432
return;
453433
}
454434

455-
server->addr_to_send = ss_addr_to_send;
456-
server->addr_len = addr_len;
457435
server->stage = 5;
458436

459-
r -= (4 + addr_len);
460-
buf += (4 + addr_len);
437+
r -= (3 + addr_len);
438+
buf += (3 + addr_len);
461439

462440
if (verbose)
463441
{
@@ -486,6 +464,23 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
486464
return;
487465
}
488466

467+
if (!remote->direct)
468+
{
469+
memcpy(remote->buf, ss_addr_to_send, addr_len);
470+
if (r > 0)
471+
{
472+
memcpy(remote->buf + addr_len, buf, r);
473+
}
474+
r += addr_len;
475+
}
476+
else
477+
{
478+
if (r > 0)
479+
{
480+
memcpy(remote->buf, buf, r);
481+
}
482+
}
483+
489484
server->remote = remote;
490485
remote->server = server;
491486
}
@@ -675,6 +670,14 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents)
675670
ev_timer_stop(EV_A_ &remote_send_ctx->watcher);
676671
ev_timer_start(EV_A_ &remote->recv_ctx->watcher);
677672
ev_io_start(EV_A_ &remote->recv_ctx->io);
673+
674+
// no need to send any data
675+
if (remote->buf_len == 0)
676+
{
677+
ev_io_stop(EV_A_ &remote_send_ctx->io);
678+
ev_io_start(EV_A_ &server->recv_ctx->io);
679+
return;
680+
}
678681
}
679682
else
680683
{
@@ -838,10 +841,6 @@ static void free_server(struct server *server)
838841
{
839842
free(server->buf);
840843
}
841-
if (server->addr_to_send != NULL)
842-
{
843-
free(server->addr_to_send);
844-
}
845844
free(server->recv_ctx);
846845
free(server->send_ctx);
847846
free(server);

src/local.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ struct server
5454
ssize_t buf_len;
5555
ssize_t buf_idx;
5656
char *buf; // server send from, remote recv into
57-
int addr_len;
58-
char *addr_to_send;
5957
char stage;
6058
struct enc_ctx *e_ctx;
6159
struct enc_ctx *d_ctx;

0 commit comments

Comments
 (0)