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);
|
itimer_pause(&tcb->itimer, NULL, NULL);
|
||||||
uint32_t self = ipv4_getnetdevip(tcb->key.peer);
|
uint32_t self = ipv4_getnetdevip(tcb->key.peer);
|
||||||
tcpheader_t *header = tcb->retransmitbuffer;
|
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);
|
tcb->retransmitpacketlen = ringbuffer_read(&tcb->transmitbuffer, header + 1, tcb->sndmss) + sizeof(tcpheader_t);
|
||||||
__assert(tcb->retransmitpacketlen > sizeof(tcpheader_t));
|
__assert(tcb->retransmitpacketlen > sizeof(tcpheader_t));
|
||||||
tcp_createheader(header, tcb, tcb->retransmitpacketlen, NULL, 0, CONTROL_ACK | CONTROL_PSH, 0);
|
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();
|
tcb->lastsend = timekeeper_timefromboot();
|
||||||
itimer_set(&tcb->itimer, RTO_START_SEC * 1000000, 0);
|
itimer_set(&tcb->itimer, RTO_START_SEC * 1000000, 0);
|
||||||
itimer_resume(&tcb->itimer);
|
itimer_resume(&tcb->itimer);
|
||||||
|
if (was_full)
|
||||||
|
poll_event(&tcb->pollheader, POLLOUT);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user