@@ -27,6 +27,7 @@
#include "proto.h"
#include "wireless.h"
#include "config.h"
+#include "system.h"
bool config_init = false;
@@ -528,14 +529,26 @@ config_init_rules(void)
static void
config_init_globals(void)
{
- struct uci_section *globals = uci_lookup_section(
- uci_ctx, uci_network, "globals");
+ struct uci_section *globals = uci_lookup_section(uci_ctx, uci_network, "globals");
if (!globals)
return;
- const char *ula_prefix = uci_lookup_option_string(
- uci_ctx, globals, "ula_prefix");
+ const char *ula_prefix = uci_lookup_option_string(uci_ctx, globals, "ula_prefix");
interface_ip_set_ula_prefix(ula_prefix);
+
+ struct global_settings config = {};
+
+ const char *default_ttl = uci_lookup_option_string(uci_ctx, globals, "ip_default_ttl");
+ if (default_ttl) {
+ config.ttl = strtoul(default_ttl, NULL, 10);
+ if (config.ttl < 1 || config.ttl > 255) {
+ netifd_log_message(L_WARNING, "Invalid value '%d' for ip4_default_ttl (allowed 1-255)\n");
+ } else {
+ config.flags |= GLOBAL_OPT_TTL;
+ }
+ }
+
+ system_globals_apply_settings(&config);
}
static void
@@ -379,3 +379,7 @@ int system_vlandev_del(struct device *vlandev)
{
return 0;
}
+
+void system_globals_apply_settings(const struct global_settings *settings)
+{
+}
@@ -332,6 +332,13 @@ dev_sysfs_path(const char *ifname, const char *file)
return dev_buf;
}
+static void
+system_set_sysctl(const char *file, const char *val)
+{
+ snprintf(dev_buf, sizeof(dev_buf), "%s/sys/net/%s", proc_path, file);
+ write_file(dev_buf, val);
+}
+
static void
system_set_dev_sysctl(const char *prefix, const char *file, const char *ifname,
const char *val)
@@ -4101,3 +4108,14 @@ int system_add_ip_tunnel(const struct device *dev, struct blob_attr *attr)
return 0;
}
+
+void system_globals_apply_settings(const struct global_settings *settings)
+{
+ uint64_t flags = settings->flags;
+ char buf[12];
+
+ if (flags & GLOBAL_OPT_TTL) {
+ snprintf(buf, sizeof(buf), "%d", settings->ttl);
+ system_set_sysctl("ipv4/ip_default_ttl", buf);
+ }
+}
@@ -291,6 +291,15 @@ struct bonding_config {
int downdelay;
};
+enum {
+ GLOBAL_OPT_TTL = (1ULL << 0),
+};
+
+struct global_settings {
+ uint64_t flags;
+ int ttl;
+};
+
static inline int system_get_addr_family(unsigned int flags)
{
if ((flags & DEVADDR_FAMILY) == DEVADDR_INET6)
@@ -383,4 +392,5 @@ int system_link_netns_move(struct device *dev, const pid_t target_ns, const char
int system_netns_open(const pid_t target_ns);
int system_netns_set(int netns_fd);
+void system_globals_apply_settings(const struct global_settings *settings);
#endif
From: Joerg Vehlow <joerg.vehlow@aox.de> --- config.c | 21 +++++++++++++++++---- system-dummy.c | 4 ++++ system-linux.c | 18 ++++++++++++++++++ system.h | 10 ++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-)