From 1f0a24a9413821474dd88175f88cc0aece3114a3 Mon Sep 17 00:00:00 2001 From: alex18_huang Date: Mon, 28 Apr 2025 13:57:05 +0800 Subject: [PATCH] udhcpinject: Multiple ssids sometime didn't display dhcp option 82 rules Added check when parsing ssid info retrieved from iwinfo. Program will exit if expected interface count and iwinfo entry count mismatch. Fixes: WIFI-14564 Signed-off-by: alex18_huang --- .../udhcpinject/files/etc/config/dhcpinject | 3 +++ .../udhcpinject/files/etc/init.d/dhcpinject | 9 +++++--- feeds/ucentral/udhcpinject/src/udhcpinject.c | 23 ++++++++++++++++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/feeds/ucentral/udhcpinject/files/etc/config/dhcpinject b/feeds/ucentral/udhcpinject/files/etc/config/dhcpinject index 3fc4fcc5c..e37c2306a 100644 --- a/feeds/ucentral/udhcpinject/files/etc/config/dhcpinject +++ b/feeds/ucentral/udhcpinject/files/etc/config/dhcpinject @@ -5,3 +5,6 @@ # list ssid 'EAP101-ERICHI' # list ssid 'EAP101-AKIHO' # list ssid 'EAP101-DAMAYU' +# +# config dhcpinject 'dhcpinject' +# option iface_count '6' diff --git a/feeds/ucentral/udhcpinject/files/etc/init.d/dhcpinject b/feeds/ucentral/udhcpinject/files/etc/init.d/dhcpinject index 94f9f1b9b..49beb305b 100755 --- a/feeds/ucentral/udhcpinject/files/etc/init.d/dhcpinject +++ b/feeds/ucentral/udhcpinject/files/etc/init.d/dhcpinject @@ -9,9 +9,9 @@ SERVICE_NAME="dhcpinject" PROG=/usr/bin/udhcpinject start_service() { - local ssid_list="" local ssids="" local ports="" + local ifaces="" # Function to process each ssid append_ssid() { @@ -40,6 +40,9 @@ start_service() { # Get the list of ports config_list_foreach uplink port append_port + + # Get the iface_count + config_get ifaces dhcpinject iface_count # Fallback to eth0 if no ports are specified if [ -z "$ports" ]; then @@ -47,11 +50,11 @@ start_service() { fi # Optional: Log or echo for debugging - logger -t dhcp_inject "Generated SSIDs=$ssids, Uplink=$ports" + logger -t dhcp_inject "Generated SSIDs=$ssids, Uplink=$ports, IFACEs=$ifaces" procd_open_instance "$SERVICE_NAME" procd_set_param command $PROG - procd_set_param env SSIDs="$ssids" PORTs="$ports" + procd_set_param env SSIDs="$ssids" PORTs="$ports" IFACEs="$ifaces" procd_set_param respawn 3600 10 10 procd_set_param file /etc/config/dhcpinject procd_set_param reload_signal SIGHUP diff --git a/feeds/ucentral/udhcpinject/src/udhcpinject.c b/feeds/ucentral/udhcpinject/src/udhcpinject.c index 35df2abaf..f598cb12b 100644 --- a/feeds/ucentral/udhcpinject/src/udhcpinject.c +++ b/feeds/ucentral/udhcpinject/src/udhcpinject.c @@ -26,6 +26,7 @@ struct iface_info *iface_map = NULL; static struct port_info *ports = NULL; int iface_count = 0; int port_count = 0; +int total_iface = 0; static pcap_t *handle = NULL; static char *provided_ssids = NULL; static char *provided_ports = NULL; @@ -192,6 +193,11 @@ int parse_ssids(const char *ssids) { return -1; } + if (iface_count != total_iface) { + syslog(LOG_ERR, "Expect %d but only %d interfaces were found.\n", total_iface, iface_count); + return -1; + } + syslog(LOG_INFO, "Found %d matching interfaces\n", iface_count); return 0; } @@ -310,7 +316,6 @@ void signal_handler(int sig) { exit(0); } else if (sig == SIGHUP) { syslog(LOG_INFO, "Received reload signal, reconfiguring...\n"); - sleep(5); // Clean up existing resources cleanup_tc(); @@ -561,7 +566,19 @@ int main(int argc, char *argv[]) { signal(SIGTERM, signal_handler); signal(SIGHUP, signal_handler); - sleep(5); + // Read IFACEs from environment variable + char *iface_env = getenv("IFACEs"); + if (!iface_env) { + syslog(LOG_ERR, "No IFACEs provided. Exiting...\n"); + cleanup(); + return 1; + } + total_iface = atoi(iface_env); + if (total_iface <= 0) { + syslog(LOG_ERR, "Invalid IFACEs value: %s. Exiting...\n", iface_env); + cleanup(); + return 1; + } provided_ssids = getenv("SSIDs"); syslog(LOG_INFO, "Provided SSIDs: %s\n", provided_ssids); @@ -618,4 +635,4 @@ int main(int argc, char *argv[]) { cleanup(); return 0; -} \ No newline at end of file +}