diff options
| -rw-r--r-- | tcp_conn.h | 6 | ||||
| -rw-r--r-- | tcp_splice.c | 18 |
2 files changed, 11 insertions, 13 deletions
@@ -206,8 +206,7 @@ struct tcp_tap_transfer_ext { * @f: Generic flow information * @s: File descriptor for sockets * @pipe: File descriptors for pipes - * @read: Bytes read (not fully written to other side in one shot) - * @written: Bytes written (not fully written from one other side read) + * @pending: Bytes currently in each pipe * @events: Events observed/actions performed on connection * @flags: Connection flags (attributes, not events) */ @@ -218,8 +217,7 @@ struct tcp_splice_conn { int s[SIDES]; int pipe[SIDES][2]; - uint32_t read[SIDES]; - uint32_t written[SIDES]; + uint32_t pending[SIDES]; uint8_t events; #define SPLICE_CLOSED 0 diff --git a/tcp_splice.c b/tcp_splice.c index ae92bbd..af50e71 100644 --- a/tcp_splice.c +++ b/tcp_splice.c @@ -292,7 +292,7 @@ bool tcp_splice_flow_defer(struct tcp_splice_conn *conn) conn->s[sidei] = -1; } - conn->read[sidei] = conn->written[sidei] = 0; + conn->pending[sidei] = 0; } conn->events = SPLICE_CLOSED; @@ -494,7 +494,7 @@ static int tcp_splice_forward(struct ctx *c, int eof = 0; while (1) { - ssize_t readlen, written, pending; + ssize_t readlen, written; int more = 0; retry: @@ -543,7 +543,7 @@ retry: flow_trace(conn, "%zi from write-side call (passed %zi)", written, c->tcp.pipe_size); - /* Most common case: skip updating counters. */ + /* Most common case: skip updating count of pending bytes */ if (readlen > 0 && readlen == written) { if (readlen >= (long)c->tcp.pipe_size * 10 / 100) continue; @@ -567,11 +567,11 @@ retry: continue; } - conn->read[fromsidei] += readlen > 0 ? readlen : 0; - conn->written[fromsidei] += written > 0 ? written : 0; + conn->pending[fromsidei] += readlen > 0 ? readlen : 0; + conn->pending[fromsidei] -= written > 0 ? written : 0; if (written < 0) { - if (conn->read[fromsidei] == conn->written[fromsidei]) + if (!conn->pending[fromsidei]) break; conn_event(conn, OUT_WAIT(!fromsidei)); @@ -581,15 +581,15 @@ retry: if (never_read && written == (long)(c->tcp.pipe_size)) goto retry; - pending = conn->read[fromsidei] - conn->written[fromsidei]; - if (!never_read && written > 0 && written < pending) + if (!never_read && written > 0 && + written < conn->pending[fromsidei]) goto retry; if (eof) break; } - if (conn->read[fromsidei] == conn->written[fromsidei] && eof) { + if (!conn->pending[fromsidei] && eof) { unsigned sidei; flow_foreach_sidei(sidei) { |
