From a1453d83ffbe87276e8686708efe3fae950fe547 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Tue, 7 Feb 2017 20:52:34 +0100 Subject: [PATCH] lxip: network reconfiguration support --- repos/dde_linux/include/lxip/lxip.h | 12 +++++++++--- repos/dde_linux/src/lib/libc_lxip/plugin.cc | 18 ++++++++---------- repos/dde_linux/src/lib/lxip/lx.h | 7 ++++++- repos/dde_linux/src/lib/lxip/lxc_emul.c | 14 +++++--------- repos/dde_linux/src/lib/lxip/socket_handler.cc | 16 ++++++++++++++-- 5 files changed, 42 insertions(+), 25 deletions(-) diff --git a/repos/dde_linux/include/lxip/lxip.h b/repos/dde_linux/include/lxip/lxip.h index 75da3ac51b..3eb9b2c064 100644 --- a/repos/dde_linux/include/lxip/lxip.h +++ b/repos/dde_linux/include/lxip/lxip.h @@ -34,12 +34,18 @@ namespace Lxip { /** * Init backend * - * \param address_config for dynamic configuration use "dhcp", for static - * configuration use "::::::off" + * \param ip_addr_str IP address + * \param netmask_str Netmask + * \param gateway_str Gateway + * \param nameserver_str Nameserver * * \return Reference to Socketcall object */ - Socketcall & init(Genode::Env &env, char const *address_config); + Socketcall & init(Genode::Env &env, + char const *ip_addr_str, + char const *netmask_str, + char const *gateway_str, + char const *nameserver_str); typedef Genode::uint8_t uint8_t; typedef Genode::uint16_t uint16_t; diff --git a/repos/dde_linux/src/lib/libc_lxip/plugin.cc b/repos/dde_linux/src/lib/libc_lxip/plugin.cc index cf5d7fc2a2..fb6c2f9d33 100644 --- a/repos/dde_linux/src/lib/libc_lxip/plugin.cc +++ b/repos/dde_linux/src/lib/libc_lxip/plugin.cc @@ -83,8 +83,13 @@ struct Plugin : Libc::Plugin Genode::Heap heap; Lxip::Socketcall &socketcall; - Socketcall(Genode::Env &env, char const *address_config) - : heap(env.ram(), env.rm()), socketcall(Lxip::init(env, address_config)) + Socketcall(Genode::Env &env, + char const *ip_addr_str, + char const *netmask_str, + char const *gateway_str) + : heap(env.ram(), env.rm()), + socketcall(Lxip::init(env, ip_addr_str, netmask_str, + gateway_str, gateway_str)) { } }; @@ -174,7 +179,6 @@ void Plugin::init(Genode::Env &env) char netmask_str[16] = {0}; char gateway_str[16] = {0}; char address_buf[128]; - char const *address_config; Genode::Attached_rom_dataspace config { env, "config"} ; @@ -214,18 +218,12 @@ void Plugin::init(Genode::Env &env) "ip_addr=", Genode::Cstring(ip_addr_str), " " "netmask=", Genode::Cstring(netmask_str), " " "gateway=", Genode::Cstring(gateway_str)); - - Genode::snprintf(address_buf, sizeof(address_buf), "%s::%s:%s:::off", - ip_addr_str, gateway_str, netmask_str); - address_config = address_buf; } catch (...) { Genode::log("Using DHCP for interface configuration."); - address_config = "dhcp"; } - Genode::log("Plugin::init() address config=", address_config); - socketconstruct.construct(env, address_config); + socketconstruct.construct(env, ip_addr_str, netmask_str, gateway_str); }; /* TODO shameful copied from lwip... generalize this */ diff --git a/repos/dde_linux/src/lib/lxip/lx.h b/repos/dde_linux/src/lib/lxip/lx.h index 144712f8ba..b6de858732 100644 --- a/repos/dde_linux/src/lib/lxip/lx.h +++ b/repos/dde_linux/src/lib/lxip/lx.h @@ -40,7 +40,12 @@ namespace Lx { void lxcc_emul_init(Lx_kit::Env &env); } -extern "C" int lxip_init(char const *address_config); +extern "C" void lxip_init(); +extern "C" void lxip_configure_static(char const *addr, + char const *netmask, + char const *gateway, + char const *nameserver); +extern "C" void lxip_configure_dhcp(); #endif /* _LX_H_ */ diff --git a/repos/dde_linux/src/lib/lxip/lxc_emul.c b/repos/dde_linux/src/lib/lxip/lxc_emul.c index 3e1effdc7b..ee1d417186 100644 --- a/repos/dde_linux/src/lib/lxip/lxc_emul.c +++ b/repos/dde_linux/src/lib/lxip/lxc_emul.c @@ -480,14 +480,11 @@ void late_tcp_congestion_default(void); /** * Initialize sub-systems */ -int lxip_init(char const *address_config) +void lxip_init() { /* init data */ INIT_LIST_HEAD(&init_net.dev_base_head); - /* call __setup stuff */ - __ip_auto_config_setup((char *)address_config); - core_sock_init(); core_netlink_proto_init(); @@ -506,14 +503,13 @@ int lxip_init(char const *address_config) /* late */ late_tcp_congestion_default(); - - /* dhcp or static configuration */ - late_ip_auto_config(); - - return 0; } +/* + * Network configuration + */ + static void lxip_configure(char const *address_config) { __ip_auto_config_setup((char *)address_config); diff --git a/repos/dde_linux/src/lib/lxip/socket_handler.cc b/repos/dde_linux/src/lib/lxip/socket_handler.cc index 15712a603b..5b40205966 100644 --- a/repos/dde_linux/src/lib/lxip/socket_handler.cc +++ b/repos/dde_linux/src/lib/lxip/socket_handler.cc @@ -617,7 +617,11 @@ class Net::Socketcall : public Lxip::Socketcall, static void ticker() { } -Lxip::Socketcall & Lxip::init(Genode::Env &env, char const *address_config) +Lxip::Socketcall & Lxip::init(Genode::Env &env, + char const *ip_addr_str, + char const *netmask_str, + char const *gateway_str, + char const *nameserver_str) { Lx_kit::Env &lx_env = Lx_kit::construct_env(env); @@ -628,7 +632,15 @@ Lxip::Socketcall & Lxip::init(Genode::Env &env, char const *address_config) Lx::nic_client_init(env, socketcall, lx_env.heap(), ticker); Lx::lxcc_emul_init(lx_env); - lxip_init(address_config); + lxip_init(); + + if ((!ip_addr_str || (ip_addr_str[0] == 0)) || + (!netmask_str || (netmask_str[0] == 0)) || + (!gateway_str || (gateway_str[0] == 0)) || + (!nameserver_str || (nameserver_str[0] == 0))) + lxip_configure_dhcp(); + else + lxip_configure_static(ip_addr_str, netmask_str, gateway_str, nameserver_str); return socketcall; }