Mutlithreaded netty server.

This commit is contained in:
Michael Mueller
2024-10-24 14:30:38 +02:00
parent 92f5d52134
commit c87c607003
6 changed files with 74 additions and 57 deletions

View File

@@ -6,6 +6,7 @@ import_from_depot [depot_user]/src/[base_src] \
[depot_user]/src/dynamic_rom \ [depot_user]/src/dynamic_rom \
[depot_user]/src/init \ [depot_user]/src/init \
[depot_user]/src/libc \ [depot_user]/src/libc \
[depot_user]/src/stdcxx \
[depot_user]/src/nic_router \ [depot_user]/src/nic_router \
[depot_user]/src/vfs_audit \ [depot_user]/src/vfs_audit \
[depot_user]/src/vfs_lxip \ [depot_user]/src/vfs_lxip \
@@ -50,12 +51,12 @@ append config {
<service name="Nic"/> <service name="Nic"/>
<service name="Uplink"/> <service name="Uplink"/>
</provides> </provides>
<config verbose_domain_state="yes"> <config verbose_domain_state="no">
<policy label_prefix="socket_fs" domain="downlink"/> <policy label_prefix="socket_fs" domain="downlink"/>
<policy label_prefix="drivers" domain="uplink"/> <policy label_prefix="drivers" domain="uplink"/>
<domain name="uplink" interface="10.0.2.55/24" gateway="10.0.2.1" verbose_packets="true"> <domain name="uplink" interface="10.0.2.55/24" gateway="10.0.2.1" verbose_packets="no">
<nat domain="downlink" <nat domain="downlink"
tcp-ports="16384" tcp-ports="16384"
@@ -70,7 +71,7 @@ append config {
</domain> </domain>
<domain name="downlink" interface="10.0.3.1/24" verbose_packets="true"> <domain name="downlink" interface="10.0.3.1/24" verbose_packets="no">
<dhcp-server ip_first="10.0.3.55" ip_last="10.0.3.55"> <dhcp-server ip_first="10.0.3.55" ip_last="10.0.3.55">
<dns-server ip="8.8.8.8"/> <dns-server ip="8.8.8.8"/>
@@ -96,7 +97,7 @@ append_if [use_dynamic_rom] config {
<config ld_verbose="yes"> <config ld_verbose="yes">
<vfs> <vfs>
<dir name="socket"> <dir name="socket">
<lxip ip_addr="10.0.2.55" netmask="255.255.255.0" gateway="10.0.2.1" nameserver="8.8.8.8"/> <lxip ip_addr="192.168.0.2" netmask="255.255.255.0" gateway="192.168.0.1" nameserver="8.8.8.8"/>
</dir> </dir>
</vfs> </vfs>
<default-policy root="/socket" writeable="yes" /> <default-policy root="/socket" writeable="yes" />
@@ -156,4 +157,4 @@ append qemu_args " -nographic "
append_qemu_nic_args "host=10.0.2.1,dhcpstart=10.0.2.55,hostfwd=tcp::10080-:80,hostfwd=tcp::18080-:8080,hostfwd=udp::10007-:7,hostfwd=udp::17070-:7070" append_qemu_nic_args "host=10.0.2.1,dhcpstart=10.0.2.55,hostfwd=tcp::10080-:80,hostfwd=tcp::18080-:8080,hostfwd=udp::10007-:7,hostfwd=udp::17070-:7070"
# vi: set ft=tcl : # vi: set ft=tcl

View File

@@ -3,9 +3,9 @@ import_from_depot [depot_user]/src/[base_src] \
[depot_user]/pkg/[drivers_nic_pkg] \ [depot_user]/pkg/[drivers_nic_pkg] \
[depot_user]/src/init \ [depot_user]/src/init \
[depot_user]/src/libc \ [depot_user]/src/libc \
[depot_user]/src/stdcxx \
[depot_user]/src/nic_router \ [depot_user]/src/nic_router \
[depot_user]/src/vfs_audit \ [depot_user]/src/vfs_audit \
[depot_user]/src/vfs_lwip \
[depot_user]/src/vfs [depot_user]/src/vfs
append config { append config {
@@ -27,10 +27,11 @@ append config {
<any-service> <parent/> <any-child/> </any-service> <any-service> <parent/> <any-child/> </any-service>
</default-route> </default-route>
<default caps="100"/> <affinity-space width="64" height="1"/>
<default caps="8192"/>
<start name="timer"> <start name="timer">
<resource name="RAM" quantum="1M"/> <resource name="RAM" quantum="16M"/>
<provides> <service name="Timer"/> </provides> <provides> <service name="Timer"/> </provides>
</start> </start>
@@ -51,12 +52,12 @@ append config {
<service name="Nic"/> <service name="Nic"/>
<service name="Uplink"/> <service name="Uplink"/>
</provides> </provides>
<config verbose_domain_state="yes"> <config verbose_domain_state="false">
<policy label_prefix="socket_fs" domain="downlink"/> <policy label_prefix="socket_fs" domain="downlink"/>
<policy label_prefix="drivers" domain="uplink"/> <policy label_prefix="drivers" domain="uplink"/>
<domain name="uplink" interface="10.0.2.55/24" gateway="10.0.2.1"> <domain name="uplink" interface="192.168.0.2/24" gateway="192.168.0.2">
<nat domain="downlink" <nat domain="downlink"
tcp-ports="16384" tcp-ports="16384"
@@ -98,13 +99,10 @@ append config {
</route> </route>
<config ld_verbose="yes"> <config ld_verbose="yes">
<vfs> <vfs>
<dir name="lwip"> <dir name="socket">
<lwip ip_addr="10.0.3.55" netmask="255.255.255.0" gateway="10.0.3.1" nameserver="8.8.8.8"/> <lwip ip_addr="10.0.3.55" netmask="255.255.255.0" gateway="10.0.3.1" nameserver="8.8.8.8"/>
<!-- <lwip dhcp="yes"/> --> <!-- <lwip dhcp="yes"/> -->
</dir> </dir>
<dir name="socket">
<audit path="/lwip"/>
</dir>
</vfs> </vfs>
<default-policy root="/socket" writeable="yes" /> <default-policy root="/socket" writeable="yes" />
</config> </config>
@@ -112,6 +110,6 @@ append config {
} }
append qemu_args " -nographic " append qemu_args " -nographic "
append_qemu_nic_args append_qemu_nic_args "host=10.0.2.1,dhcpstart=10.0.2.55,hostfwd=tcp::10080-:80,hostfwd=tcp::18080-:8080,hostfwd=udp::10007-:7,hostfwd=udp::17070-:7070"
# vi: set ft=tcl : # vi: set ft=tcl :

View File

@@ -1,8 +1,9 @@
source ${genode_dir}/repos/libports/run/netty_lwip.inc source ${genode_dir}/repos/libports/run/netty_lwip.inc
build { test/netty/tcp } build { lib/vfs_lwip test/netty/tcp }
append config { append config {
<!---
<start name="netty-server-80"> <start name="netty-server-80">
<binary name="test-netty_tcp"/> <binary name="test-netty_tcp"/>
<resource name="RAM" quantum="16M"/> <resource name="RAM" quantum="16M"/>
@@ -15,10 +16,12 @@ append config {
<libc stdout="/dev/log" stderr="/dev/log" socket="/socket"/> <libc stdout="/dev/log" stderr="/dev/log" socket="/socket"/>
</config> </config>
</start> </start>
-->
<start name="netty-server-8080"> <start name="netty-server-8080">
<binary name="test-netty_tcp"/> <binary name="test-netty_tcp"/>
<resource name="RAM" quantum="16M"/> <resource name="RAM" quantum="32G"/>
<config ld_verbose="yes" mode="server" port="8080" nonblock="false"> <affinity xpos="1" ypos="0" width="63" height="1"/>
<config ld_verbose="yes" mode="server" port="8080" read_write="yes" nonblock="false">
<vfs> <vfs>
<dir name="dev"> <log/> </dir> <dir name="dev"> <log/> </dir>
<dir name="socket"> <fs/> </dir> <dir name="socket"> <fs/> </dir>
@@ -58,7 +61,7 @@ append config {
} }
install_config $config install_config $config
build_boot_image { test-netty_tcp } build_boot_image { vfs_lwip.lib.so test-netty_tcp }
run_genode_until forever run_genode_until forever
# vi: set ft=tcl : # vi: set ft=tcl :

View File

@@ -3,6 +3,7 @@ source ${genode_dir}/repos/libports/run/netty.inc
build { test/netty/tcp } build { test/netty/tcp }
append config { append config {
<!--
<start name="netty-server-80"> <start name="netty-server-80">
<binary name="test-netty_tcp"/> <binary name="test-netty_tcp"/>
<resource name="RAM" quantum="8M"/> <resource name="RAM" quantum="8M"/>
@@ -15,10 +16,11 @@ append config {
<libc stdout="/dev/log" stderr="/dev/log" socket="/socket"/> <libc stdout="/dev/log" stderr="/dev/log" socket="/socket"/>
</config> </config>
</start> </start>
-->
<start name="netty-server-8080"> <start name="netty-server-8080">
<binary name="test-netty_tcp"/> <binary name="test-netty_tcp"/>
<resource name="RAM" quantum="8M"/> <resource name="RAM" quantum="512M"/>
<config ld_verbose="yes" mode="server" port="8080" nonblock="false"> <config ld_verbose="yes" mode="server" port="8080" nonblock="no" read_write="yes">
<vfs> <vfs>
<dir name="dev"> <log/> </dir> <dir name="dev"> <log/> </dir>
<dir name="socket"> <fs/> </dir> <dir name="socket"> <fs/> </dir>

View File

@@ -13,7 +13,7 @@
/* Local includes */ /* Local includes */
#include <netty.h> #include <netty.h>
#include <thread>
namespace Netty { struct Tcp; } namespace Netty { struct Tcp; }
@@ -59,56 +59,69 @@ void Netty::Tcp::server(int const sd, bool const nonblock, bool const read_write
Genode::log("okay, accept will not block"); Genode::log("okay, accept will not block");
} }
Genode::log("test in ", nonblock ? "non-blocking" : "blocking", " mode"); //Genode::log("test in ", nonblock ? "non-blocking" : "blocking", " mode");
int const cd = accept(sd, pcaddr, &scaddr); int const cd = accept(sd, pcaddr, &scaddr);
Genode::log("cd=", cd); //Genode::log("cd=", cd);
if (cd == -1) DIE("accept"); if (cd == -1) DIE("accept");
getnames(cd); //getnames(cd);
size_t count = 0;
static char data[64*1024];
if (nonblock) nonblocking(cd); if (nonblock) nonblocking(cd);
while (true) { auto con_handler = std::thread{[cd, read_write, nonblock]()
int ret = read_write {
? read(cd, data, sizeof(data)) size_t count = 0;
: recv(cd, data, sizeof(data), 0); static char data[64*1024];
while (true)
{
//GENODE_LOG_TSC_NAMED(10, "netty_read");
int ret = read_write
? read(cd, data, sizeof(data))
: recv(cd, data, sizeof(data), 0);
if (ret == 0) { if (ret == 0)
Genode::log("experienced EOF"); {
break; // Genode::log("experienced EOF");
} break;
}
if (ret > 0) { if (ret > 0)
/* echo received data */ {
ret = read_write //GENODE_LOG_TSC_NAMED(10, "netty_write");
? write(cd, data, ret) /* echo received data */
: send(cd, data, ret, 0); ret = read_write
if (ret == -1) DIE(read_write ? "write" : "send"); ? write(cd, data, ret)
: send(cd, data, ret, 0);
if (ret == -1)
DIE(read_write ? "write" : "send");
count += ret; count += ret;
continue; continue;
} }
if (!nonblock || errno != EAGAIN) if (!nonblock || errno != EAGAIN)
DIE(read_write ? "read" : "recv"); DIE(read_write ? "read" : "recv");
Genode::log("block in select because of EAGAIN"); Genode::log("block in select because of EAGAIN");
fd_set read_fds; FD_ZERO(&read_fds); FD_SET(cd, &read_fds); fd_set read_fds;
ret = select(cd + 1, &read_fds, nullptr, nullptr, nullptr); FD_ZERO(&read_fds);
if (ret == -1) DIE("select"); FD_SET(cd, &read_fds);
} ret = select(cd + 1, &read_fds, nullptr, nullptr, nullptr);
if (ret == -1)
DIE("select");
Genode::log("echoed ", count, " bytes"); ret = shutdown(cd, SHUT_RDWR);
if (ret == -1) DIE("shutdown");
ret = shutdown(cd, SHUT_RDWR); ret = close(cd);
if (ret == -1) DIE("shutdown"); if (ret == -1) DIE("close");
}
}};
con_handler.detach();
ret = close(cd); //Genode::log("echoed ", count, " bytes");
if (ret == -1) DIE("close");
} }
} }

View File

@@ -1,6 +1,6 @@
TARGET = test-netty_tcp TARGET = test-netty_tcp
SRC_CC = main.cc netty.cc SRC_CC = main.cc netty.cc
LIBS = base libc LIBS = base libc stdcxx
INC_DIR += $(PRG_DIR)/.. INC_DIR += $(PRG_DIR)/..