mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
tcp: signal POLLOUT when transmitting
Current tcp senders can wait forever for buffer space as POLLOUT is not signaled when transmitting data. Signal POLLOUT when transmitting out of a full tx buffer.
This commit is contained in:
@@ -660,6 +660,7 @@ static int tcp_transmitnextsegment(tcb_t *tcb) {
|
||||
itimer_pause(&tcb->itimer, NULL, NULL);
|
||||
uint32_t self = ipv4_getnetdevip(tcb->key.peer);
|
||||
tcpheader_t *header = tcb->retransmitbuffer;
|
||||
bool was_full = RINGBUFFER_DATACOUNT(&tcb->transmitbuffer) == TCB_RINGBUFFER_SIZE;
|
||||
tcb->retransmitpacketlen = ringbuffer_read(&tcb->transmitbuffer, header + 1, tcb->sndmss) + sizeof(tcpheader_t);
|
||||
__assert(tcb->retransmitpacketlen > sizeof(tcpheader_t));
|
||||
tcp_createheader(header, tcb, tcb->retransmitpacketlen, NULL, 0, CONTROL_ACK | CONTROL_PSH, 0);
|
||||
@@ -670,6 +671,8 @@ static int tcp_transmitnextsegment(tcb_t *tcb) {
|
||||
tcb->lastsend = timekeeper_timefromboot();
|
||||
itimer_set(&tcb->itimer, RTO_START_SEC * 1000000, 0);
|
||||
itimer_resume(&tcb->itimer);
|
||||
if (was_full)
|
||||
poll_event(&tcb->pollheader, POLLOUT);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user