travelmate: release 2.4.6-1

- 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 <dev@brenken.org>
(cherry picked from commit 71d92bcc9e)
This commit is contained in:
Dirk Brenken committed 2026-06-16 21:36:57 +02:00
1 parent 726c1d171c
commit 8e0ccf6545
2 files changed
+43 -19

No files matched your search

+2 -2
View 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>
+41 -17
View 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}'"