From d5518aa93829ff2f0675f548334513d0e7716cb2 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Fri, 24 Nov 2017 16:50:35 +0100 Subject: [PATCH] lib/vfs/lxip: support configuration of MTU The MTU can be set via the "mtu" attribute like follows. --- repos/dde_linux/run/vfs_cfg.run | 2 +- repos/dde_linux/src/lib/lxip/driver.c | 10 +++- repos/dde_linux/src/lib/lxip/lx.h | 1 + repos/dde_linux/src/lib/lxip/lxc_emul.c | 16 +++++++ repos/dde_linux/src/lib/vfs/lxip/vfs.cc | 22 +++++---- repos/libports/run/netty.inc | 61 ++++++++++++++++++++++--- 6 files changed, 94 insertions(+), 18 deletions(-) diff --git a/repos/dde_linux/run/vfs_cfg.run b/repos/dde_linux/run/vfs_cfg.run index 86e01ff33..460299320 100644 --- a/repos/dde_linux/run/vfs_cfg.run +++ b/repos/dde_linux/run/vfs_cfg.run @@ -54,7 +54,7 @@ append config { - + diff --git a/repos/dde_linux/src/lib/lxip/driver.c b/repos/dde_linux/src/lib/lxip/driver.c index 14e67db9a..91f6109bc 100644 --- a/repos/dde_linux/src/lib/lxip/driver.c +++ b/repos/dde_linux/src/lib/lxip/driver.c @@ -31,7 +31,7 @@ static int driver_net_open(struct net_device *dev) } -int driver_net_xmit(struct sk_buff *skb, struct net_device *dev) +static int driver_net_xmit(struct sk_buff *skb, struct net_device *dev) { struct net_device_stats *stats = (struct net_device_stats*) netdev_priv(dev); int len = skb->len; @@ -56,10 +56,18 @@ int driver_net_xmit(struct sk_buff *skb, struct net_device *dev) } +static int driver_change_mtu(struct net_device *dev, int new_mtu) +{ + /* possible point to reflect successful MTU setting */ + return eth_change_mtu(dev, new_mtu); +} + + static const struct net_device_ops driver_net_ops = { .ndo_open = driver_net_open, .ndo_start_xmit = driver_net_xmit, + .ndo_change_mtu = driver_change_mtu, }; diff --git a/repos/dde_linux/src/lib/lxip/lx.h b/repos/dde_linux/src/lib/lxip/lx.h index 4a1952680..79fd21de5 100644 --- a/repos/dde_linux/src/lib/lxip/lx.h +++ b/repos/dde_linux/src/lib/lxip/lx.h @@ -47,6 +47,7 @@ extern "C" void lxip_configure_static(char const *addr, char const *gateway, char const *nameserver); extern "C" void lxip_configure_dhcp(); +extern "C" void lxip_configure_mtu(unsigned mtu); extern "C" bool lxip_do_dhcp(); diff --git a/repos/dde_linux/src/lib/lxip/lxc_emul.c b/repos/dde_linux/src/lib/lxip/lxc_emul.c index e860c6325..7a6a1ea39 100644 --- a/repos/dde_linux/src/lib/lxip/lxc_emul.c +++ b/repos/dde_linux/src/lib/lxip/lxc_emul.c @@ -528,6 +528,22 @@ static void lxip_configure(char const *address_config) static bool dhcp_configured = false; static bool dhcp_pending = false; +void lxip_configure_mtu(unsigned mtu) +{ + /* zero mtu means reset to default */ + unsigned new_mtu = mtu ? mtu : ETH_DATA_LEN; + + struct net *net; + struct net_device *dev; + + for_each_net(net) { + for_each_netdev(net, dev) { + dev_set_mtu(dev, new_mtu); + } + } +} + + void lxip_configure_static(char const *addr, char const *netmask, char const *gateway, char const *nameserver) { diff --git a/repos/dde_linux/src/lib/vfs/lxip/vfs.cc b/repos/dde_linux/src/lib/vfs/lxip/vfs.cc index 6e29901be..6ec4ab0d6 100644 --- a/repos/dde_linux/src/lib/vfs/lxip/vfs.cc +++ b/repos/dde_linux/src/lib/vfs/lxip/vfs.cc @@ -1393,15 +1393,19 @@ class Vfs::Lxip_file_system : public Vfs::File_system, { typedef String<16> Addr; - try { + unsigned const mtu = config.attribute_value("mtu", 0U); + if (mtu) { + log("Setting MTU to ", mtu); + lxip_configure_mtu(mtu); + } else { + lxip_configure_mtu(0); + } - if (config.attribute_value("dhcp", false)) { - log("Using DHCP for interface configuration."); - lxip_configure_dhcp(); - return; - } - - } catch (...) { } + if (config.attribute_value("dhcp", false)) { + log("Using DHCP for interface configuration."); + lxip_configure_dhcp(); + return; + } try { @@ -1426,7 +1430,7 @@ class Vfs::Lxip_file_system : public Vfs::File_system, lxip_configure_static(ip_addr.string(), netmask.string(), gateway.string(), nameserver.string()); - } catch (...) { } + } catch (...) { } } diff --git a/repos/libports/run/netty.inc b/repos/libports/run/netty.inc index 35ec3654b..3a0f4b0a6 100644 --- a/repos/libports/run/netty.inc +++ b/repos/libports/run/netty.inc @@ -1,11 +1,15 @@ assert_spec x86 +proc use_dynamic_rom { } { return true } + set build_components { core init - drivers/timer drivers/nic server/ram_fs server/vfs + drivers/timer drivers/nic server/vfs lib/vfs/lxip } +lappend_if [use_dynamic_rom] build_components server/dynamic_rom + source ${genode_dir}/repos/base/run/platform_drv.inc append_platform_drv_build_components @@ -39,12 +43,51 @@ append config { - + } +append_if [use_dynamic_rom] config { + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + +append config { - + } + +if {[use_dynamic_rom]} { append config { + + + + + } +} else { append config { @@ -53,16 +96,20 @@ append config { - + } +} + +append config { } append boot_modules { - core init timer } [nic_drv_binary] { ram_fs vfs - ld.lib.so libc.lib.so libm.lib.so posix.lib.so - vfs_lxip.lib.so lxip.lib.so + core init timer } [nic_drv_binary] { vfs + ld.lib.so libc.lib.so vfs_lxip.lib.so lxip.lib.so } +lappend_if [use_dynamic_rom] boot_modules dynamic_rom + append_platform_drv_boot_modules append qemu_args " -nographic -net nic,model=e1000 -net tap,ifname=tap0,downscript=no,script=no "