From: Joerg Vehlow <joerg.veh...@aox.de>

---
 config.c       | 21 +++++++++++++++++----
 system-dummy.c |  4 ++++
 system-linux.c | 18 ++++++++++++++++++
 system.h       | 10 ++++++++++
 4 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/config.c b/config.c
index 9bbda39..93df20e 100644
--- a/config.c
+++ b/config.c
@@ -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
diff --git a/system-dummy.c b/system-dummy.c
index b13bc87..f47b1af 100644
--- a/system-dummy.c
+++ b/system-dummy.c
@@ -379,3 +379,7 @@ int system_vlandev_del(struct device *vlandev)
 {
        return 0;
 }
+
+void system_globals_apply_settings(const struct global_settings *settings)
+{
+}
diff --git a/system-linux.c b/system-linux.c
index 12a7e3f..66470b6 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -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);
+       }
+}
diff --git a/system.h b/system.h
index 0f08c26..ee3c03e 100644
--- a/system.h
+++ b/system.h
@@ -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
-- 
2.25.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to