summaryrefslogtreecommitdiff
path: root/contrib/apps/netio/netio.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/apps/netio/netio.c')
-rw-r--r--contrib/apps/netio/netio.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/contrib/apps/netio/netio.c b/contrib/apps/netio/netio.c
new file mode 100644
index 00000000000..7d12ac87843
--- /dev/null
+++ b/contrib/apps/netio/netio.c
@@ -0,0 +1,55 @@
+#include "netio.h"
+
+#include "lwip/opt.h"
+#include "lwip/tcp.h"
+
+/* See http://www.nwlab.net/art/netio/netio.html to get the netio tool */
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+static err_t
+netio_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+ LWIP_UNUSED_ARG(arg);
+
+ if (err == ERR_OK && p != NULL) {
+ tcp_recved(pcb, p->tot_len);
+ pbuf_free(p);
+ } else {
+ pbuf_free(p);
+ }
+
+ if (err == ERR_OK && p == NULL) {
+ tcp_arg(pcb, NULL);
+ tcp_sent(pcb, NULL);
+ tcp_recv(pcb, NULL);
+ tcp_close(pcb);
+ }
+
+ return ERR_OK;
+}
+
+static err_t
+netio_accept(void *arg, struct tcp_pcb *pcb, err_t err)
+{
+ LWIP_UNUSED_ARG(arg);
+ LWIP_UNUSED_ARG(err);
+
+ if (pcb != NULL) {
+ tcp_arg(pcb, NULL);
+ tcp_sent(pcb, NULL);
+ tcp_recv(pcb, netio_recv);
+ }
+ return ERR_OK;
+}
+
+void
+netio_init(void)
+{
+ struct tcp_pcb *pcb;
+
+ pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
+ tcp_bind(pcb, IP_ANY_TYPE, 18767);
+ pcb = tcp_listen(pcb);
+ tcp_accept(pcb, netio_accept);
+}
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */