From 3edeb2bdce41acb4ae09954adaf9dcfe9aa627cc Mon Sep 17 00:00:00 2001 From: Vinit Agnihotri Date: Tue, 5 Mar 2024 02:15:11 -0800 Subject: [PATCH] lib-interface: Add parsing for interface 'options' Signed-off-by: Vinit Agnihotri Reviewed-by: Martin Schwenke Reviewed-by: Andrew Bartlett --- source3/lib/interface.c | 34 +++++++++++++++++++++++++++++++--- source3/lib/interface.h | 3 +++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/source3/lib/interface.c b/source3/lib/interface.c index c586e97e741..b8450316b67 100644 --- a/source3/lib/interface.c +++ b/source3/lib/interface.c @@ -338,6 +338,7 @@ static void add_interface(const struct iface_struct *ifs) iface->linkspeed = ifs->linkspeed; iface->capability = ifs->capability; iface->if_index = ifs->if_index; + iface->options = ifs->options; DLIST_ADD(local_interfaces, iface); @@ -353,8 +354,11 @@ static void add_interface(const struct iface_struct *ifs) } -static void parse_extra_info(char *key, uint64_t *speed, uint32_t *cap, - uint32_t *if_index) +static void parse_extra_info(char *key, + uint64_t *speed, + uint32_t *cap, + uint32_t *if_index, + uint32_t *options) { while (key != NULL && *key != '\0') { char *next_key; @@ -397,6 +401,15 @@ static void parse_extra_info(char *key, uint64_t *speed, uint32_t *cap, if (error != 0) { DBG_DEBUG("Invalid key value (%s)\n", val); } + } else if (strequal_m(key, "options")) { + if (strequal_m(val, "dynamic")) { + *options |= IFACE_DYNAMIC_OPTION; + } else if (strequal_m(val, "nodynamic")) { + *options &= ~IFACE_DYNAMIC_OPTION; + } else { + DBG_WARNING("Options unknown: " + "'%s'\n", val); + } } else { DBG_DEBUG("Key unknown: '%s'\n", key); } @@ -455,6 +468,8 @@ static void interpret_interface(char *token) bool speed_set = false; bool cap_set = false; bool if_index_set = false; + uint32_t options = IFACE_NONE_OPTION; + bool options_set = false; /* * extract speed / capability information if present @@ -462,7 +477,7 @@ static void interpret_interface(char *token) p = strchr_m(token, ';'); if (p != NULL) { *p++ = 0; - parse_extra_info(p, &speed, &cap, &if_index); + parse_extra_info(p, &speed, &cap, &if_index, &options); if (speed != 0) { speed_set = true; } @@ -472,6 +487,9 @@ static void interpret_interface(char *token) if (if_index != 0) { if_index_set = true; } + if (options != IFACE_NONE_OPTION) { + options_set = true; + } } /* first check if it is an interface name */ @@ -486,6 +504,9 @@ static void interpret_interface(char *token) if (if_index_set) { probed_ifaces[i].if_index = if_index; } + if (options_set) { + probed_ifaces[i].options = options; + } add_interface(&probed_ifaces[i]); added = true; } @@ -515,6 +536,9 @@ static void interpret_interface(char *token) if (if_index_set) { probed_ifaces[i].if_index = if_index; } + if (options_set) { + probed_ifaces[i].options = options; + } add_interface(&probed_ifaces[i]); return; } @@ -595,6 +619,9 @@ static void interpret_interface(char *token) if (if_index_set) { probed_ifaces[i].if_index = if_index; } + if (options_set) { + probed_ifaces[i].options = options; + } add_interface(&probed_ifaces[i]); probed_ifaces[i].netmask = saved_mask; return; @@ -626,6 +653,7 @@ static void interpret_interface(char *token) ifs.linkspeed = 1000 * 1000 * 1000; } ifs.capability = cap; + ifs.options = options; add_interface(&ifs); } diff --git a/source3/lib/interface.h b/source3/lib/interface.h index 1a575c5f22b..d93e9094a33 100644 --- a/source3/lib/interface.h +++ b/source3/lib/interface.h @@ -24,6 +24,9 @@ #include +#define IFACE_NONE_OPTION 0x00000000U +#define IFACE_DYNAMIC_OPTION 0x00000001U + bool ismyaddr(const struct sockaddr *ip); bool ismyip_v4(struct in_addr ip); bool is_local_net(const struct sockaddr *from); -- 2.34.1