diff --git a/repos/dde_linux/src/lib/vfs/lxip/vfs.cc b/repos/dde_linux/src/lib/vfs/lxip/vfs.cc
index 9c821588ad..3cd0e71ba4 100644
--- a/repos/dde_linux/src/lib/vfs/lxip/vfs.cc
+++ b/repos/dde_linux/src/lib/vfs/lxip/vfs.cc
@@ -1,22 +1,26 @@
/*
- * \brief lxip-based socket file system
+ * \brief Socket-based file system
* \author Christian Helmuth
* \author Josef Soentgen
* \author Emery Hemingway
+ * \author Sebastian Sumpf
* \date 2016-02-01
*
* 2023-11-08: adjust to socket C-API
+ * 2025-02-09: generalized for lxip & lwip
*/
/*
- * Copyright (C) 2015-2018 Genode Labs GmbH
+ * Copyright (C) 2015-2025 Genode Labs GmbH
*
* This file is distributed under the terms of the GNU General Public License
- * version 2.
+ * version 2 or later.
*/
/* Genode includes */
#include
+#include
+#include
#include
#include
#include
@@ -26,11 +30,7 @@
#include
#include
-/* format-string includes */
-#include
-
-#include
-#include
+#include "vfs_ip.h"
namespace {
@@ -149,8 +149,9 @@ namespace Vfs {
class Lxip_socket_dir;
struct Lxip_socket_handle;
- class Lxip_link_state_file;
- class Lxip_address_file;
+ struct Lxip_address_info;
+ class Lxip_link_state_file;
+ class Lxip_address_file;
struct Lxip_vfs_handle;
class Lxip_vfs_file_handle;
@@ -1435,21 +1436,35 @@ class Lxip::Protocol_dir_impl : public Protocol_dir
};
+struct Vfs::Lxip_address_info
+{
+ genode_socket_info _info { };
+
+ void update() { genode_socket_config_info(&_info); }
+};
+
+
class Vfs::Lxip_address_file final : public Vfs::File
{
private:
- unsigned int &_numeric_address;
+ unsigned &_numeric_address;
+ Lxip_address_info &_info;
public:
- Lxip_address_file(char const *name, unsigned int &numeric_address)
- : Vfs::File(name), _numeric_address(numeric_address) { }
+ Lxip_address_file(char const *name,
+ unsigned &numeric_address,
+ Lxip_address_info &info)
+ : Vfs::File(name),
+ _numeric_address(numeric_address), _info(info) { }
long read(Lxip_vfs_file_handle &,
Byte_range_ptr const &dst,
file_size /* ignored */) override
{
+ _info.update();
+
enum {
MAX_ADDRESS_STRING_SIZE = sizeof("000.000.000.000\n")
};
@@ -1472,17 +1487,23 @@ class Vfs::Lxip_link_state_file final : public Vfs::File
{
private:
- bool &_numeric_link_state;
+ bool &_numeric_link_state;
+ Lxip_address_info &_info;
public:
- Lxip_link_state_file(char const *name, bool &numeric_link_state)
- : Vfs::File(name), _numeric_link_state(numeric_link_state) { }
+ Lxip_link_state_file(char const *name,
+ bool &numeric_link_state,
+ Lxip_address_info &info)
+ : Vfs::File(name),
+ _numeric_link_state(numeric_link_state), _info(info) { }
long read(Lxip_vfs_file_handle &,
Byte_range_ptr const &dst,
file_size /* ignored */) override
{
+ _info.update();
+
enum {
MAX_LINK_STATE_STRING_SIZE = sizeof("down\n")
};
@@ -1501,21 +1522,13 @@ class Vfs::Lxip_link_state_file final : public Vfs::File
};
-extern "C" unsigned int ic_myaddr;
-extern "C" unsigned int ic_netmask;
-extern "C" unsigned int ic_gateway;
-extern "C" unsigned int ic_nameservers[1];
-
-//XXX: handle in lxip
-bool ic_link_state = true;
-
-
/*******************************
** Filesystem implementation **
*******************************/
class Vfs::Lxip_file_system : public Vfs::File_system,
public Vfs::Directory,
+ private Vfs::Lxip_address_info,
private Vfs::Remote_io
{
private:
@@ -1525,18 +1538,18 @@ class Vfs::Lxip_file_system : public Vfs::File_system,
Vfs::Env::User &_vfs_user;
Remote_io::Peer _peer;
- struct genode_socket_wakeup _wakeup_remote { };
+ genode_socket_wakeup _wakeup_remote { };
Lxip::Protocol_dir_impl _tcp_dir {
_alloc, *this, "tcp", Lxip::Protocol_dir::TYPE_STREAM };
Lxip::Protocol_dir_impl _udp_dir {
_alloc, *this, "udp", Lxip::Protocol_dir::TYPE_DGRAM };
- Lxip_address_file _address { "address", ic_myaddr };
- Lxip_address_file _netmask { "netmask", ic_netmask };
- Lxip_address_file _gateway { "gateway", ic_gateway };
- Lxip_address_file _nameserver { "nameserver", ic_nameservers[0] };
- Lxip_link_state_file _link_state { "link_state", ic_link_state };
+ Lxip_address_file _address { "address", _info.ip_addr, *this };
+ Lxip_address_file _netmask { "netmask", _info.netmask, *this };
+ Lxip_address_file _gateway { "gateway", _info.gateway, *this };
+ Lxip_address_file _nameserver { "nameserver", _info.nameserver, *this };
+ Lxip_link_state_file _link_state { "link_state", _info.link_state, *this };
Vfs::Node *_lookup(char const *path)
{
@@ -1624,8 +1637,7 @@ class Vfs::Lxip_file_system : public Vfs::File_system,
~Lxip_file_system() { }
- char const *name() { return "lxip"; }
- char const *type() override { return "lxip"; }
+ char const *type() override { return Vfs::ip_stack().string(); }
/***************************
** File_system interface **