From 880930cb4fff03a2100bc636bc11a3e8941da1db Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Tue, 7 Jan 2014 15:22:24 +0100 Subject: [PATCH] lxip: support configuration of libc plugin Added support for the 'ip_addr', 'gateway', and 'netmask' configuration parameter. Issue #984 --- dde_linux/include/lxip/lxip.h | 10 +++- dde_linux/src/lib/libc_lxip/init.cc | 60 ++++++++++++++++++++++-- dde_linux/src/lib/libc_lxip/plugin.cc | 8 ++-- dde_linux/src/lib/lxip/include/init.h | 3 +- dde_linux/src/lib/lxip/init.c | 7 ++- dde_linux/src/lib/lxip/socket_handler.cc | 4 +- 6 files changed, 77 insertions(+), 15 deletions(-) diff --git a/dde_linux/include/lxip/lxip.h b/dde_linux/include/lxip/lxip.h index 3c5ae1f58..c94bacdb9 100644 --- a/dde_linux/include/lxip/lxip.h +++ b/dde_linux/include/lxip/lxip.h @@ -31,7 +31,15 @@ namespace Lxip { class Socketcall; - Socketcall & init(); + /** + * Init backend + * + * \param address_config for dynamic configuration use "dhcp", for static + * configuration use "::::::off" + * + * \return Reference to Socketcall object + */ + Socketcall & init(char *address_config); typedef Genode::uint8_t uint8_t; typedef Genode::uint16_t uint16_t; diff --git a/dde_linux/src/lib/libc_lxip/init.cc b/dde_linux/src/lib/libc_lxip/init.cc index 9cd46c43f..3b3bcb387 100644 --- a/dde_linux/src/lib/libc_lxip/init.cc +++ b/dde_linux/src/lib/libc_lxip/init.cc @@ -14,11 +14,65 @@ */ #include +#include +#include +#include -extern void create_lxip_plugin(); +extern void create_lxip_plugin(char *address_config); void __attribute__((constructor)) init_libc_lxip(void) { - PDBG("init_libc_lxip()\n"); - create_lxip_plugin(); + char ip_addr_str[16] = {0}; + char netmask_str[16] = {0}; + char gateway_str[16] = {0}; + char address_buf[128]; + char *address_config; + + try { + Genode::Xml_node libc_node = Genode::config()->xml_node().sub_node("libc"); + + try { + libc_node.attribute("ip_addr").value(ip_addr_str, sizeof(ip_addr_str)); + } catch(...) { } + + try { + libc_node.attribute("netmask").value(netmask_str, sizeof(netmask_str)); + } catch(...) { } + + try { + libc_node.attribute("gateway").value(gateway_str, sizeof(gateway_str)); + } catch(...) { } + + /* either none or all 3 interface attributes must exist */ + if ((Genode::strlen(ip_addr_str) != 0) || + (Genode::strlen(netmask_str) != 0) || + (Genode::strlen(gateway_str) != 0)) { + if (Genode::strlen(ip_addr_str) == 0) { + PERR("Missing \"ip_addr\" attribute. Ignoring network interface config."); + throw Genode::Xml_node::Nonexistent_attribute(); + } else if (Genode::strlen(netmask_str) == 0) { + PERR("Missing \"netmask\" attribute. Ignoring network interface config."); + throw Genode::Xml_node::Nonexistent_attribute(); + } else if (Genode::strlen(gateway_str) == 0) { + PERR("Missing \"gateway\" attribute. Ignoring network interface config."); + throw Genode::Xml_node::Nonexistent_attribute(); + } + } else + throw -1; + + PDBG("static network interface: ip_addr=%s netmask=%s gateway=%s ", + ip_addr_str, netmask_str, 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 (...) { + PINF("Using DHCP for interface configuration."); + address_config = "dhcp"; + } + + PDBG("init_libc_lxip() address config=%s\n", address_config); + + create_lxip_plugin(address_config); } diff --git a/dde_linux/src/lib/libc_lxip/plugin.cc b/dde_linux/src/lib/libc_lxip/plugin.cc index 8b399a49b..674104d0d 100644 --- a/dde_linux/src/lib/libc_lxip/plugin.cc +++ b/dde_linux/src/lib/libc_lxip/plugin.cc @@ -81,7 +81,7 @@ struct Plugin : Libc::Plugin /** * Constructor */ - Plugin(); + Plugin(char *address_config); bool supports_select(int nfds, fd_set *readfds, @@ -138,7 +138,7 @@ struct Plugin : Libc::Plugin }; -Plugin::Plugin() : socketcall(Lxip::init()) +Plugin::Plugin(char *address_config) : socketcall(Lxip::init(address_config)) { PDBG("using the lxip libc plugin"); } @@ -649,7 +649,7 @@ int Plugin::translate_ops_linux(int optname) } /* unnamed namespace */ -void create_lxip_plugin() +void create_lxip_plugin(char *address_config) { - static Plugin lxip_plugin; + static Plugin lxip_plugin(address_config); } diff --git a/dde_linux/src/lib/lxip/include/init.h b/dde_linux/src/lib/lxip/include/init.h index ec148aac0..b23cc1b3b 100644 --- a/dde_linux/src/lib/lxip/include/init.h +++ b/dde_linux/src/lib/lxip/include/init.h @@ -16,6 +16,7 @@ #ifdef __cplusplus extern "C" #endif -int lxip_init(void); + +int lxip_init(char *address_config); #endif diff --git a/dde_linux/src/lib/lxip/init.c b/dde_linux/src/lib/lxip/init.c index 465ac1082..7ac86a494 100644 --- a/dde_linux/src/lib/lxip/init.c +++ b/dde_linux/src/lib/lxip/init.c @@ -39,17 +39,16 @@ unsigned long nr_free_buffer_pages(void) /** * Initialize sub-systems */ -int lxip_init() +int lxip_init(char *address_config) { /* init data */ INIT_LIST_HEAD(&init_net.dev_base_head); - /*start jiffies */ dde_kit_timer_init(0, 0); /* call __setup stuff */ - __ip_auto_config_setup("dhcp"); + __ip_auto_config_setup(address_config); core_sock_init(); core_netlink_proto_init(); @@ -70,7 +69,7 @@ int lxip_init() /* late */ late_tcp_congestion_default(); - /* dhcp */ + /* dhcp or static configuration */ late_ip_auto_config(); return 1; diff --git a/dde_linux/src/lib/lxip/socket_handler.cc b/dde_linux/src/lib/lxip/socket_handler.cc index f543122ad..77f86ba73 100644 --- a/dde_linux/src/lib/lxip/socket_handler.cc +++ b/dde_linux/src/lib/lxip/socket_handler.cc @@ -621,9 +621,9 @@ class Net::Socketcall : public Genode::Signal_dispatcher_base, }; -Lxip::Socketcall & Lxip::init() +Lxip::Socketcall & Lxip::init(char *address_config) { - static int init = lxip_init(); + static int init = lxip_init(address_config); static Net::Socketcall socketcall; return socketcall;