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