Skip to content

Commit

Permalink
wip: lwip: add tcp_poll_callback() to vfs
Browse files Browse the repository at this point in the history
  • Loading branch information
sidhussmann committed May 21, 2020
1 parent b03d559 commit 6c924f5
Showing 1 changed file with 29 additions and 3 deletions.
32 changes: 29 additions & 3 deletions repos/libports/src/lib/vfs/lwip/vfs.cc
Expand Up @@ -108,6 +108,7 @@ extern "C" {
static err_t tcp_delayed_recv_callback(void *arg, struct tcp_pcb *tpcb,
struct pbuf *p, err_t err);
static err_t tcp_sent_callback(void *arg, struct tcp_pcb *tpcb, u16_t len);
static err_t tcp_poll_callback(void *arg, struct tcp_pcb *tpcb);
static void tcp_err_callback(void *arg, err_t err);
}

Expand Down Expand Up @@ -1147,6 +1148,7 @@ class Lwip::Tcp_socket_dir final :

tcp_recv(_pcb, tcp_recv_callback);
tcp_sent(_pcb, tcp_sent_callback);
tcp_poll(_pcb, tcp_poll_callback, 10);
tcp_err(_pcb, tcp_err_callback);
}

Expand Down Expand Up @@ -1582,6 +1584,7 @@ err_t tcp_connect_callback(void *arg, struct tcp_pcb *pcb, err_t)
}

Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
Genode::warning(__func__, " local_port=", pcb->local_port, " remote_port=", pcb->remote_port, " state=", (int)pcb->state);
socket_dir->state = Lwip::Tcp_socket_dir::READY;

socket_dir->process_io();
Expand All @@ -1599,6 +1602,7 @@ err_t tcp_accept_callback(void *arg, struct tcp_pcb *newpcb, err_t err)
}

Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
Genode::warning(__func__, " local_port=", newpcb->local_port, " remote_port=", newpcb->remote_port, " state=", (int)newpcb->state);
err_t e = socket_dir->accept(newpcb, err);
return e;
};
Expand All @@ -1613,6 +1617,7 @@ err_t tcp_recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t)
}

Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
Genode::warning(__func__, " local_port=", pcb->local_port, " remote_port=", pcb->remote_port, " state=", (int)pcb->state);
if (p == NULL) {
socket_dir->shutdown();
} else {
Expand All @@ -1635,6 +1640,7 @@ err_t tcp_delayed_recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *buf

Lwip::Tcp_socket_dir::Pcb_pending *pending =
static_cast<Lwip::Tcp_socket_dir::Pcb_pending *>(arg);
Genode::warning(__func__, " local_port=", pcb->local_port, " remote_port=", pcb->remote_port, " state=", (int)pcb->state);

if (pending->buf && buf) {
pbuf_cat(pending->buf, buf);
Expand All @@ -1658,18 +1664,38 @@ err_t tcp_sent_callback(void *arg, struct tcp_pcb *pcb, u16_t)
return ERR_ABRT;
}

/* TODO why don't we look at len? */

Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
Genode::warning(__func__, " local_port=", pcb->local_port, " remote_port=", pcb->remote_port, " state=", (int)pcb->state);
socket_dir->process_io();
return ERR_OK;
}


static
void tcp_err_callback(void *arg, err_t)
err_t tcp_poll_callback(void *arg, struct tcp_pcb *tpcb)
{
if (!arg) return;
Genode::error("tcp_poll_callback");
if (!arg) {
tcp_abort(tpcb);
return ERR_ABRT;
}
Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
Genode::error(__func__, " socket=", socket_dir->_num, " state=", (int)socket_dir->state);
Genode::error(__func__, " local_port=", tpcb->local_port, " remote_port=", tpcb->remote_port, " state=", (int)tpcb->state);

return ERR_OK;
}

static
void tcp_err_callback(void *arg, err_t err)
{
if (!arg) {
Genode::error("tcp_err_callback arg=null");
return;
}
Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
Genode::error(__func__, " socket=", socket_dir->name(), " state=", (int)socket_dir->state, " err_t=", (int)err);
socket_dir->error();
/* the error is ERR_ABRT or ERR_RST, both end the session */
}
Expand Down

0 comments on commit 6c924f5

Please sign in to comment.