mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-29 15:44:02 +00:00
lxip: support configuration of libc plugin
Added support for the 'ip_addr', 'gateway', and 'netmask' configuration parameter. Issue #984
This commit is contained in:
parent
12f560dc0e
commit
880930cb4f
@ -31,7 +31,15 @@ namespace Lxip {
|
||||
|
||||
class Socketcall;
|
||||
|
||||
Socketcall & init();
|
||||
/**
|
||||
* Init backend
|
||||
*
|
||||
* \param address_config for dynamic configuration use "dhcp", for static
|
||||
* configuration use "<ip>::<gw-ip>:<netmask>:::off"
|
||||
*
|
||||
* \return Reference to Socketcall object
|
||||
*/
|
||||
Socketcall & init(char *address_config);
|
||||
|
||||
typedef Genode::uint8_t uint8_t;
|
||||
typedef Genode::uint16_t uint16_t;
|
||||
|
@ -14,11 +14,65 @@
|
||||
*/
|
||||
|
||||
#include <base/printf.h>
|
||||
#include <base/snprintf.h>
|
||||
#include <os/config.h>
|
||||
#include <util/string.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
int lxip_init(void);
|
||||
|
||||
int lxip_init(char *address_config);
|
||||
|
||||
#endif
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user