travelmate: release 2.4.6-1
authorDirk Brenken <redacted>
Tue, 16 Jun 2026 19:30:33 +0000 (21:30 +0200)
committerDirk Brenken <redacted>
Tue, 16 Jun 2026 19:30:33 +0000 (21:30 +0200)
- fix uplink teardown for bssid-pinned stations
  the new implementaion reads the sta object once and parses fields by name via jshn
  (isolated namespace, single fork). Bug finder: @adam8833 (#29768)
- add a fork-free f_normbssid() helper and normalize all config-side bssids
  to upper case before comparison (in f_getcfg(), covering all callers, and
  on the direct scan comparisons in f_main()).
- LuCI:  adds a normBssid() helper function as well

Signed-off-by: Dirk Brenken <redacted>
net/travelmate/Makefile
net/travelmate/files/travelmate-functions.sh

index 127f02d18d8a2bb08fd72753f99e8058c46bdc43..ef0fc4738ccbf6ee406a348fe09d331cca5f7e51 100644 (file)
@@ -6,8 +6,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=travelmate
-PKG_VERSION:=2.4.5
-PKG_RELEASE:=3
+PKG_VERSION:=2.4.6
+PKG_RELEASE:=1
 PKG_LICENSE:=GPL-3.0-or-later
 PKG_MAINTAINER:=Dirk Brenken <dev@brenken.org>
 
index 9351cadc88d397368f36a107bb9e20ee7969cded..5904bc16a9c7a2f69d39d1b568fc81884ab2cee2 100644 (file)
@@ -29,6 +29,7 @@ trm_maxautoadd="5"
 trm_timeout="60"
 trm_radio=""
 trm_revradio="0"
+trm_normbssid=""
 trm_connection=""
 trm_ssidfilter=""
 trm_ovpninfolist=""
@@ -205,6 +206,20 @@ f_trim() {
        printf "%s" "${trim}"
 }
 
+# normalize a bssid to upper case
+#
+f_normbssid() {
+       local bssid="${1}"
+
+       bssid="${bssid//a/A}"
+       bssid="${bssid//b/B}"
+       bssid="${bssid//c/C}"
+       bssid="${bssid//d/D}"
+       bssid="${bssid//e/E}"
+       bssid="${bssid//f/F}"
+       trm_normbssid="${bssid}"
+}
+
 # wifi helper function
 #
 f_wifi() {
@@ -509,11 +524,15 @@ f_getgw() {
 f_getcfg() {
        local t_radio t_essid t_bssid radio="${1}" essid="${2}" bssid="${3}" cnt="0"
 
+       f_normbssid "${bssid}"
+       bssid="${trm_normbssid}"
        trm_uplinkcfg=""
        while uci_get "travelmate" "@uplink[${cnt}]" >/dev/null 2>&1; do
                t_radio="$(uci_get "travelmate" "@uplink[${cnt}]" "device")"
                t_essid="$(uci_get "travelmate" "@uplink[${cnt}]" "ssid")"
                t_bssid="$(uci_get "travelmate" "@uplink[${cnt}]" "bssid")"
+               f_normbssid "${t_bssid}"
+               t_bssid="${trm_normbssid}"
                if [ -n "${radio}" ] && [ -n "${essid}" ] &&
                        [ "${t_radio}" = "${radio}" ] && [ "${t_essid}" = "${essid}" ] && [ "${t_bssid}" = "${bssid}" ]; then
                        trm_uplinkcfg="@uplink[${cnt}]"
@@ -1059,7 +1078,7 @@ f_getstatus() {
 # generate status information
 #
 f_genstatus() {
-       local parse s_captive s_proactive s_netcheck s_autoadd s_randomize s_eviltwin s_ntp s_vpn s_mail vpn vpn_iface
+       local sta_json temp_ns s_captive s_proactive s_netcheck s_autoadd s_randomize s_eviltwin s_ntp s_vpn s_mail vpn vpn_iface
        local section last_date sta_iface sta_radio sta_essid sta_bssid sta_mac dev_status status="${trm_ifstatus}" ntp_done="0" vpn_done="0" mail_done="0"
 
        # get current connection information
@@ -1067,22 +1086,24 @@ f_genstatus() {
        if [ "${status}" = "true" ]; then
                status="connected, ${trm_connection:-"-"}"
                dev_status="$("${trm_ubuscmd}" -S call network.wireless status 2>/dev/null)"
-               parse="$(printf "%s" "${dev_status}" | "${trm_jsoncmd}" \
-                       -e '@.*.interfaces[@.config.mode="sta"].section' \
-                       -e '@.*.interfaces[@.config.mode="sta"].config.ssid' \
-                       -e '@.*.interfaces[@.config.mode="sta"].config.macaddr' \
-                       -e '@.*.interfaces[@.config.mode="sta"].config.network[0]' \
-                       -e '@.*.interfaces[@.config.mode="sta"].config.bssid')"
-               {
-                       IFS= read -r section
-                       IFS= read -r sta_essid
-                       IFS= read -r sta_mac
-                       IFS= read -r sta_iface
-                       IFS= read -r sta_bssid
-               } <<-EOF
-                       ${parse}
-               EOF
+               sta_json="$(printf "%s" "${dev_status}" | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"]')"
+               if [ -n "${sta_json}" ]; then
+                       json_set_namespace "trm_sta" temp_ns
+                       json_load "${sta_json}"
+                       json_get_var section "section"
+                       if json_select "config" >/dev/null 2>&1; then
+                               json_get_var sta_essid "ssid"
+                               json_get_var sta_mac "macaddr"
+                               json_get_var sta_bssid "bssid"
+                               json_select "network" >/dev/null 2>&1 && json_get_var sta_iface "1"
+                       fi
+                       json_cleanup
+                       json_set_namespace "${temp_ns}"
+               fi
+
                if [ -n "${section}" ]; then
+                       f_normbssid "${sta_bssid}"
+                       sta_bssid="${trm_normbssid}"
                        sta_radio="$(uci_get "wireless" "${section}" "device")"
                        f_getcfg "${sta_radio}" "${sta_essid}" "${sta_bssid}"
                fi
@@ -1334,7 +1355,8 @@ f_main() {
                        config_essid="${station_id%/*}"
                        config_essid="${config_essid#*/}"
                        config_bssid="${station_id##*/}"
-                       config_bssid="${config_bssid//-/}"
+                       f_normbssid "${config_bssid//-/}"
+                       config_bssid="${trm_normbssid}"
                        f_check "dev" "true"
                        f_log "debug" "f_main-2    ::: config_radio: ${config_radio}, config_essid: \"${config_essid}\", config_bssid: ${config_bssid:-"-"}"
                else
@@ -1364,6 +1386,8 @@ f_main() {
                                        sta_radio="$(uci_get "wireless" "${section}" "device")"
                                        sta_essid="$(uci_get "wireless" "${section}" "ssid")"
                                        sta_bssid="$(uci_get "wireless" "${section}" "bssid")"
+                                       f_normbssid "${sta_bssid}"
+                                       sta_bssid="${trm_normbssid}"
                                        sta_mac="$(f_mac "get" "${section}")"
                                        if [ -z "${sta_radio}" ] || [ -z "${sta_essid}" ]; then
                                                f_log "info" "invalid wireless section '${section}'"
git clone https://git.99rst.org/PROJECT