genode_c_api: errors on socket/nic_client init

Prevent uncaught exceptiosn in (NIC-client) initialization but report
as errors from genode_socket_init() / genode_nic_client_create().
This commit is contained in:
Christian Helmuth
2025-04-01 12:35:00 +02:00
committed by Norman Feske
parent 14cfc765c6
commit 1f181f6ce3
8 changed files with 31 additions and 12 deletions

View File

@ -88,7 +88,7 @@ struct Main
}; };
void genode_socket_init(struct genode_env *_env, bool genode_socket_init(struct genode_env *_env,
struct genode_socket_io_progress *io_progress, struct genode_socket_io_progress *io_progress,
char const *label) char const *label)
{ {
@ -108,4 +108,6 @@ void genode_socket_init(struct genode_env *_env,
/* wait to finish initialization before returning to callee */ /* wait to finish initialization before returning to callee */
lx_emul_execute_kernel_until(lx_user_startup_complete, nullptr); lx_emul_execute_kernel_until(lx_user_startup_complete, nullptr);
return lx_nic_client_initialized();
} }

View File

@ -188,6 +188,10 @@ static int rx_task_function(void *arg)
} }
static bool initialized;
bool lx_nic_client_initialized() { return initialized; }
static int __init virtio_net_driver_init(void) static int __init virtio_net_driver_init(void)
{ {
struct net_device *dev; struct net_device *dev;
@ -232,6 +236,7 @@ static int __init virtio_net_driver_init(void)
nic_rx_task_struct_ptr = find_task_by_pid_ns(pid, NULL); nic_rx_task_struct_ptr = find_task_by_pid_ns(pid, NULL);
initialized = true;
return 0; return 0;
out_nic: out_nic:

View File

@ -23,6 +23,7 @@ extern "C" {
struct task_struct *lx_nic_client_rx_task(void); struct task_struct *lx_nic_client_rx_task(void);
bool lx_nic_client_link_state(void); bool lx_nic_client_link_state(void);
bool lx_nic_client_update_link_state(void); bool lx_nic_client_update_link_state(void);
bool lx_nic_client_initialized(void);
/* socket.cc */ /* socket.cc */
void socket_schedule_peer(void); void socket_schedule_peer(void);

View File

@ -215,7 +215,10 @@ struct genode_netif_handle *lwip_genode_netif_init(char const *label)
return NULL; return NULL;
} }
handle->nic_handle = genode_nic_client_create(label); handle->nic_handle = genode_nic_client_create(label);
if (handle->nic_handle == NULL)
return NULL;
handle->netif = net; handle->netif = net;
handle->address_valid = false; handle->address_valid = false;
handle->address_configured = false; handle->address_configured = false;

View File

@ -38,6 +38,8 @@ struct Statics
genode_socket_io_progress *io_progress; genode_socket_io_progress *io_progress;
Genode::Heap *heap; Genode::Heap *heap;
Genode::Env *env; Genode::Env *env;
bool initialized() const { return netif_ptr && io_progress && heap && env; }
}; };
@ -343,7 +345,7 @@ void genode_socket_wait_for_progress()
} }
void genode_socket_init(struct genode_env *_env, bool genode_socket_init(struct genode_env *_env,
struct genode_socket_io_progress *io_progress, struct genode_socket_io_progress *io_progress,
char const *label) char const *label)
{ {
@ -353,6 +355,8 @@ void genode_socket_init(struct genode_env *_env,
statics().io_progress = io_progress; statics().io_progress = io_progress;
static Socket::Main main { env, label }; static Socket::Main main { env, label };
return statics().initialized();
} }

View File

@ -155,7 +155,7 @@ struct genode_socket_io_progress
}; };
void genode_socket_init(struct genode_env *env, bool genode_socket_init(struct genode_env *env,
struct genode_socket_io_progress *, struct genode_socket_io_progress *,
char const *label); char const *label);

View File

@ -249,11 +249,13 @@ struct genode_nic_client *genode_nic_client_create(char const *label)
return nullptr; return nullptr;
} }
return new (*statics().alloc_ptr) try {
Registered<genode_nic_client>(statics().nic_clients, *statics().env_ptr, return new (*statics().alloc_ptr)
*statics().alloc_ptr, Registered<genode_nic_client>(statics().nic_clients, *statics().env_ptr,
statics().sigh, statics().link_sigh, *statics().alloc_ptr,
Session_label(label)); statics().sigh, statics().link_sigh,
Session_label(label));
} catch (...) { return nullptr; }
} }

View File

@ -1998,10 +1998,12 @@ struct Ip_factory : Vfs::File_system_factory
using Label = Genode::String<Genode::Session_label::capacity()>; using Label = Genode::String<Genode::Session_label::capacity()>;
genode_socket_init(genode_env_ptr(env.env()), &io_progress, if (genode_socket_init(genode_env_ptr(env.env()), &io_progress,
config.attribute_value("label", Label("")).string()); config.attribute_value("label", Label("")).string()))
return new (env.alloc()) Vfs::Ip_file_system(env, config);
return new (env.alloc()) Vfs::Ip_file_system(env, config); struct Socket_init_failed { };
throw Socket_init_failed();
} }
}; };