summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
bf55733)
Currently we call the poll callback if there is any free space in the send
buffer, every time we call utcp_timeout(). However, if the application
does not send anything inside the callback, then it most likely won't send
anything the next time if the free space in the send buffer did not change.
So only call the callback when more space has been made available in the
send buffer.
if(!is_reliable(c)) {
c->snd.una = c->snd.nxt = c->snd.last;
buffer_discard(&c->sndbuf, c->sndbuf.used);
if(!is_reliable(c)) {
c->snd.una = c->snd.nxt = c->snd.last;
buffer_discard(&c->sndbuf, c->sndbuf.used);
}
if(is_reliable(c) && !timespec_isset(&c->rtrx_timeout)) {
}
if(is_reliable(c) && !timespec_isset(&c->rtrx_timeout)) {
if(data_acked) {
buffer_discard(&c->sndbuf, data_acked);
if(data_acked) {
buffer_discard(&c->sndbuf, data_acked);
}
// Also advance snd.nxt if possible
}
// Also advance snd.nxt if possible
- if((c->state == ESTABLISHED || c->state == CLOSE_WAIT)) {
- uint32_t len = buffer_free(&c->sndbuf);
+ if((c->state == ESTABLISHED || c->state == CLOSE_WAIT) && c->do_poll) {
+ c->do_poll = false;
+ uint32_t len = buffer_free(&c->sndbuf);
if(len) {
c->poll(c, len);
if(len) {
c->poll(c, len);
if(c->sndbuf.maxsize != size) {
c->sndbuf.maxsize = -1;
}
if(c->sndbuf.maxsize != size) {
c->sndbuf.maxsize = -1;
}
+
+ c->do_poll = buffer_free(&c->sndbuf);
}
size_t utcp_get_rcvbuf(struct utcp_connection *c) {
}
size_t utcp_get_rcvbuf(struct utcp_connection *c) {
void utcp_set_poll_cb(struct utcp_connection *c, utcp_poll_t poll) {
if(c) {
c->poll = poll;
void utcp_set_poll_cb(struct utcp_connection *c, utcp_poll_t poll) {
if(c) {
c->poll = poll;
+ c->do_poll = buffer_free(&c->sndbuf);
uint32_t flags;
bool reapable;
uint32_t flags;
bool reapable;
struct buffer sndbuf;
struct buffer rcvbuf;
struct sack sacks[NSACKS];
struct buffer sndbuf;
struct buffer rcvbuf;
struct sack sacks[NSACKS];