Compare commits

...

39 Commits

Author SHA1 Message Date
jaspreetsachdev
222b17415c Merge pull request #1016 from Telecominfraproject/main
merge for v4.2.2
2026-03-04 15:04:30 -05:00
John Crispin
baa3cbf134 tip-defaults: update insta.pem certificates
Fixes: PKI2-209
Signed-off-by: John Crispin <john@phrozen.org>
2026-03-04 20:07:49 +01:00
John Crispin
9db344d4ea ucentral-schema: fix SSID basename to use global count
Use the global count instead of per_band_counters for the basename
to keep it in sync with the captive portal logic.

Fixes: WIFI-15327
Signed-off-by: John Crispin <john@phrozen.org>
2026-03-04 10:12:50 +01:00
Tanya Singh
515afeae6b ipq807x_v5.4: Update 2.4G radio BDF for EAP104 to improve Tx Power
Fixes: WIFI-15353
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2026-03-04 08:21:36 +01:00
Venkat Chimata
50f92c87c2 ucentral-event: Add BSSID/SSID to client stats payload
Populate bssid and ssid in the nl_cb client event payload by
resolving the hostapd instance using msg.msg.dev. Defaults to empty
values if hostapd context is unavailable.

Improves client visibility in multi-BSS deployments.

Fixes WiFi-15352

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2026-03-02 16:15:41 +01:00
800246@emplustech.com
64bcc609eb Emplus_WAP588m: Certificates Not Retained on Factory Reset
Signed-off-by: 800246@emplustech.com <cp.chang@emplustech.com>
2026-03-02 16:15:41 +01:00
800246@emplustech.com
d62881c70a mediatek: Add missed set lan wan mac function for emplus,wap588m
Signed-off-by: 800246@emplustech.com <cp.chang@emplustech.com>
2026-03-02 16:15:41 +01:00
John Crispin
333a8fb2a0 git: OpenWrt git servers have been migrated
The servers have been migrated to newer hardware. Switch back to using https.

Signed-off-by: John Crispin <john@phrozen.org>
2026-03-02 06:14:45 +01:00
dhileep
8eb37d825d ucentral-event: Client connectivity fails during DVLAN + MPSK mode
Duplicate VLAN validation fails in EAP105, which causes the client connectivity to fail.
Interface prefix (phy-*) not handled in the vlan validation

Fixes: WIFI-15351

Signed-off-by: dhileep <c-dsridhar@shasta.cloud>
Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2026-03-02 06:13:51 +01:00
jaspreetsachdev
a01b9ac0f4 Merge pull request #1002 from Telecominfraproject/main
4.2.1 merge
2026-02-05 13:29:08 -05:00
John Crispin
d7b578c58d Revert "profiles/edgecore_eap111.yml: use the sdk kernel for v4.2"
This reverts commit 20f5fa0284.

Signed-off-by: John Crispin <john@phrozen.org>
2026-02-05 16:57:15 +01:00
Arif Alam
bab5db5bf5 cloud_discovery: check operational cert in /etc/ucentral to determine reenroll
Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2026-02-05 08:35:41 +01:00
John Crispin
be9783e7db ratelimit: use sfq leaf qdisc on mediatek targets
fq_codel is not available on mediatek platforms. Replace it with sfq
during package install when CONFIG_TARGET_mediatek is set.

Fixes: WIFI-15285
Signed-off-by: John Crispin <john@phrozen.org>
2026-01-30 09:40:12 +01:00
John Crispin
e928d555e9 qca-wifi-7: fix syntax error in ipq53xx platform upgrade script
Remove extra 'fi' in edgecore,eap105 case block introduced by
commit 1d4cbc46 which replaced a two-level if/else with a
three-level nesting but kept both original closing 'fi' lines.

Fixes: 1d4cbc46 ("ipq807x_v5.4, qca-wifi-7: enable/disable boot bank switch based on upgrade_available value during fw upgrade for Edgecore APs")
Signed-off-by: John Crispin <john@phrozen.org>
2026-01-29 10:14:07 +01:00
John Crispin
ce1f7df73a certificates: unmount empty alternate bank to preserve birth certs
On a factory fresh dual boot bank device with birth certificates only
in the primary bank, the alternate bank mount would shadow the primary
with an empty filesystem. The script then exited with failure despite
birth certificates being available underneath.

After checking the alternate bank, unmount it if empty and re-check so
the primary bank's birth certificates remain accessible for EST
enrolment.

Fixes: WIFI-15292
Signed-off-by: John Crispin <john@phrozen.org>
2026-01-28 09:46:07 +01:00
Venkat Chimata
e7af38b198 rrmd: Update Tx Power control to use interface instead of wiphy
1. Update TX power control to use interface (dev) instead of wiphy, improving
   compatibility on Wi-Fi 7 platforms.
2. Introduce bssid_to_ifname() helper to reliably map BSSID to interface name.
3. Add a short delay (10 milliseconds) after setting TX power to allow
   driver/firmware state to settle before reading back the value.

Tested on EAP014 and EAP105.

Fixes WIFI-14964

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2026-01-28 09:06:58 +01:00
Venkat Chimata
34a5e87363 hostapd: fix 6 GHz center frequency adjustment condition
Ensure that the center frequency segment 0 index adjustment for
320 MHz bandwidth is applied only for valid 6 GHz frequencies.

Previously, the bandwidth check alone could trigger the adjustment
even when the operating center index did not correspond to a 6 GHz
frequency. Add an explicit is_6ghz_freq() check to avoid incorrect
center frequency offset calculations.

Fixes: WIFI-15238

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2026-01-28 08:50:21 +01:00
John Crispin
666642480a ucentral-schema: update to latest HEAD
8491119 renderer: make SSID naming band-aware for stable section names
69cf683 renderer: derive no_reconf from radio reconf capability
13f797e radio: use PHY-reported channels instead of hardcoded lists
e5a6295 state: guard against null devstats in iface_add_counters

Signed-off-by: John Crispin <john@phrozen.org>
2026-01-24 09:57:38 +01:00
Venkat Chimata
a60d3b0190 qca-wifi-7: wifi-detect: mark radios as reconf-capable
Set reconf=true in wiphy info during radio detection, indicating that
Wi-Fi 7 radios support BSS reconfiguration without requiring full
interface teardown.

This complements the bss_reload fix by ensuring the reconfiguration
capability is advertised to netifd, allowing it to choose the hot
reload path when appropriate.

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2026-01-24 09:45:50 +01:00
Venkat Chimata
becce0e6c6 wifi7: allow BSS reload with reconf flag instead of forcing full restart
On Wi-Fi 7 platforms, BSS reload events were always propagated with
reconf=false, forcing netifd/hostapd into a full teardown path even
when a reconfiguration reload was requested.

This change restores the original intent by propagating the reconf
flag correctly from the reload path, allowing hostapd to distinguish
between reconfiguration-capable reloads and teardown-required cases.

With this change, hot reload works consistently on Wi-Fi 7 APs in the
same way as on Wi-Fi 6 platforms, avoiding unnecessary wireless
teardown and driver reinitialization.

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2026-01-24 09:44:54 +01:00
ruanyaoyu
871834bae5 ipq807x_v5.4: hostapd: fix 6G MBSSID MAC address generation
Fix three issues preventing 6G non-primary SSIDs from connecting on
CIG WF-196:

1. Fix #num_global_macaddr config parsing: the value was stored with
   the '#' prefix but accessed without it, causing the setting to be
   silently ignored (always defaulting to 1).

2. Fix MBSSID config parsing: look for 'multiple_bssid' (the actual
   hostapd config key) instead of 'mbssid'.

3. Fix B5 MAC generation for MBSSID: swap bytes 3 and 5, clear lower
   nibble of byte 5, then set locally-administered bit. This avoids
   MAC collisions with 6G multi-BSSID interfaces.

4. Add iface_macaddr_init() wrapper to ensure mbssid parameter is
   passed consistently during both iface_restart and iface_reload_config.

Signed-off-by: ruanyaoyu <ruanyaoyu@cigtech.com>
2026-01-24 09:42:20 +01:00
Tanya Singh
1d4cbc46d1 ipq807x_v5.4, qca-wifi-7: enable/disable boot bank switch based on upgrade_available value during fw upgrade for Edgecore APs
Fixes: WIFI-15304
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2026-01-24 09:25:41 +01:00
Tanya Singh
6765ca15d0 qca-wifi-7/ipq53xx: Increase ramoops size for EAP105
Fixes: WIFI-15305
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2026-01-24 09:25:15 +01:00
Marek Kwaczynski
81a358f52e mtk: mac80211: fix CSA crash with dynamic VLAN
When using dynamic VLAN (AP_VLAN) on 5 GHz, CSA finalize may call
_ieee80211_sta_cap_rx_bw() with a non-NULL chandef whose ->chan is NULL.
This leads to a NULL pointer dereference at chandef->chan->band and a
kernel panic.

Avoid the crash by validating chandef->chan before accessing the band and
fall back to the existing non-chandef path when the channel pointer is not
available during CSA.

Trace:
Unable to handle kernel read from unreadable memory at virtual address 0000000000000000
Internal error: Oops: 0000000096000005 [#1] SMP
CPU: 0 PID: 59 Comm: kworker/u4:2
Workqueue: events_unbound wiphy_delayed_work_pending [cfg80211]
Hardware name: Edgecore EAP111 (DT)
pc : _ieee80211_sta_cap_rx_bw+0x14/0xcc [mac80211]
lr : _ieee80211_sta_cur_vht_bw+0x20/0xb0 [mac80211]

Call trace:
  _ieee80211_sta_cap_rx_bw+0x14/0xcc [mac80211]
  ieee80211_iter_chan_contexts_atomic+0x260/0xf38 [mac80211]
  ieee80211_link_unreserve_chanctx+0x430/0xab8 [mac80211]
  ieee80211_link_use_reserved_context+0xac/0xf4 [mac80211]
  ieee80211_nan_func_terminated+0x3f8c/0x4f00 [mac80211]
  ieee80211_csa_finalize_work+0x2c/0x34 [mac80211]
  wiphy_delayed_work_pending+0x298/0x3bc [cfg80211]
  process_one_work+0x178/0x2f0
  worker_thread+0x2e8/0x4d4
  kthread+0xdc/0xe0
  ret_from_fork+0x10/0x20

  Kernel panic - not syncing: Oops: Fatal exception

Fixes: WIFI-15312

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2026-01-24 09:23:58 +01:00
jackcybertan
2710848a63 ipq8074/rap630e: Fix the LAN and WAN MAC addresses
Fixes: WIFI-15286
Signed-off-by: jackcybertan <jack.tsai@cybertan.com.tw>
2026-01-14 08:32:46 +01:00
John Crispin
b0918f55be certificates: fix dual boot bank certificate handling
On dual boot bank devices, avoid running EST twice by checking for
operational certificates before falling back to the alternate bank.

Previously, after an upgrade the AP would boot from the alternate bank,
find only birth certificates there, and run EST again - resulting in
duplicate operational certificates.

Now the flow is:
- If operational.pem exists in current bank, use it
- If only birth certs in current bank, check alternate bank
- Single boot bank devices behave as before

Fixes: WIFI-15292
Signed-off-by: John Crispin <john@phrozen.org>
2026-01-14 08:30:28 +01:00
jaspreetsachdev
a00dbfa6e4 Merge pull request #985 from Telecominfraproject/main
merge for 4.2.0 RC2
2025-12-12 18:42:38 -05:00
John Crispin
815006f3e7 ucentral: set version to 4.2.0
Signed-off-by: John Crispin <john@phrozen.org>
2025-12-12 16:02:07 +01:00
John Crispin
a7a9458d81 profiles/sonicfi_rap63xc-211g: add missing hostap feed
Signed-off-by: John Crispin <john@phrozen.org>
2025-12-12 16:02:07 +01:00
ruanyaoyu
e366742c1b ipq807x: enable CPTCFG_ATH12K_DEBUG for CIG devices
Signed-off-by: ruanyaoyu <ruanyaoyu@cigtech.com>
2025-12-12 14:12:06 +01:00
Sebastian Huang
ee601508d9 qca-wifi-7/hostapd: keep BSS coloring enabled with the same color if there is no free colors
Fixes: WIFI-15279

Signed-off-by: Sebastian Huang <sebastian_huang@accton.com>
2025-12-12 14:11:37 +01:00
Tanya Singh
5c5eb7891c rrmd: Add DFS channel exclusion support to the RCS (Random Channel Selection) algo when DFS is disabled
Fixes: WIFI-15270
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-12-12 14:11:23 +01:00
Venkat Chimata
501c11be52 bandwidth: Correct handling of RADIUS-assigned bandwidth limits
Description:
Hostapd successfully parsed the uplink and downlink bandwidth attributes from
the RADIUS server, but the values were not being propagated correctly into
sta_info. As a result, the bandwidth information was missing in the UBUS
events sent to ucentral-event.

Fix:
Ensure the parsed bandwidth values are correctly passed to sta_info so they
 are included in subsequent UBUS notifications.

Tests Performed:
Configured per-client bandwidth limits on the RADIUS server and verified that:

 - The AP enforces the configured uplink/downlink limits, and
 - The correct bandwidth values appear in the UBUS events.

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2025-12-11 16:04:46 +01:00
Venkat Chimata
352e94a133 ratelimit: generate shorter IFB names for phy-based interfaces
Interfaces like phy6g-ap0 can produce overly long IFB device names
(e.g., i-phy6g-ap0), which may exceed kernel name-length limits,
specifically in case of VLANs.
This patch normalizes such interface names by replacing the phy
prefix with p and shortening ap → a, producing more compact
IFB device names (e.g., i-p2g-a0).

Other interfaces continue using their original names.

Signed-off-by: Venkat Chimata <venkat@nearhop.com>
2025-12-11 16:04:46 +01:00
John Crispin
20f5fa0284 profiles/edgecore_eap111.yml: use the sdk kernel for v4.2
Signed-off-by: John Crispin <john@phrozen.org>
2025-12-11 08:06:49 +01:00
John Crispin
aa1d2b1c73 feeds/morse: update mirror hashes
Signed-off-by: John Crispin <john@phrozen.org>
2025-12-11 06:24:44 +01:00
John Crispin
09a7f53fb4 ucentral-schema: update to latest HEAD
a6fdd32 cmd_upgrade: enable curl to follow redirects
1c3e51f fix: Updated schema to fix issue with fingerprinting raw mode

Signed-off-by: John Crispin <john@phrozen.org>
2025-12-11 06:24:44 +01:00
Yang-Yongzhi
7665eefe1d qca-wifi-7: Add Asterfusion AP7330 model (WIFI-15267)
Enable the CONFIG_GPIO_WATCHDOG of kernel config
Add the 'wdt' watchdog service in /etc/init.d/

Signed-off-by: Yang-Yongzhi <yangyongzhi@asterfusion.com>
2025-12-11 06:24:44 +01:00
ruanyaoyu
099726eff6 ipq60xx: Fix issue where ipq60xx chip would not compile ftm
Fixes: WIFI-15271
Signed-off-by: ruanyaoyu <ruanyaoyu@cigtech.com>
2025-12-11 06:18:58 +01:00
56 changed files with 1375 additions and 111 deletions

View File

@@ -21,7 +21,7 @@ jobs:
strategy:
fail-fast: false
matrix:
target: [ 'cig_wf189h', 'cig_wf189w', 'cig_wf660a', 'cig_wf672', 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf189', 'cig_wf196', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'sonicfi_rap630w-312g', 'sonicfi_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap650c', 'sonicfi_rap7110c-341x', 'sonicfi_rap750e-h', 'sonicfi_rap750e-s', 'sonicfi_rap750w-311a', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap103', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_iap2300m', 'senao_jeap6500', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655', 'emplus_wap588m', 'zyxel_nwa130be', 'sercomm_ap72tip-v4' ]
target: [ 'cig_wf189h', 'cig_wf189w', 'cig_wf660a', 'cig_wf672', 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf189', 'cig_wf196', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'sonicfi_rap630w-312g', 'sonicfi_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap650c', 'sonicfi_rap7110c-341x', 'sonicfi_rap750e-h', 'sonicfi_rap750e-s', 'sonicfi_rap750w-311a', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap103', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_iap2300m', 'senao_jeap6500', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655', 'emplus_wap588m', 'zyxel_nwa130be', 'sercomm_ap72tip-v4', 'asterfusion_ap7330']
steps:
- uses: actions/checkout@v3

View File

@@ -15,7 +15,7 @@ define Package/$(PKG_NAME)
URL:=http://www.qca.qualcomm.com
MAINTAINER:=Qualcomm Atheros
TITLE:= QCA ftm utils
DEPENDS:= @TARGET_ipq_ipq807x||TARGET_ipq_ipq807x_64||TARGET_ipq_ipq60xx||TARGET_ipq_ipq60xx_64||TARGET_ipq_ipq50xx||TARGET_ipq_ipq50xx_64||TARGET_ipq807x||TARGET_ipq50xx +libnl +libtcmd +qca-diag +librt +kmod-diag-char
DEPENDS:= @TARGET_ipq_ipq807x||TARGET_ipq_ipq807x_64||TARGET_ipq_ipq60xx||TARGET_ipq_ipq60xx_64||TARGET_ipq_ipq50xx||TARGET_ipq_ipq50xx_64||TARGET_ipq807x||TARGET_ipq60xx||TARGET_ipq50xx +libnl +libtcmd +qca-diag +librt +kmod-diag-char
endef
define Package/$(PKG_NAME)/description/Default

View File

@@ -184,10 +184,15 @@ const phy_proto = {
addr[0] ^= idx << 2;
break;
case "b5":
if (mbssid)
addr[0] |= 2;
addr[5] ^= idx;
break;
if (mbssid) {
let b5 = addr[5];
addr[5] = addr[3];
addr[3] = b5;
addr[5] &= ~0xf;
addr[0] |= 2;
}
addr[5] ^= idx;
break;
default:
for (let i = 5; i > 0; i--) {
addr[i] += idx;

View File

@@ -230,6 +230,17 @@ function iface_pending_init(phydev, config)
pending.next();
}
function iface_macaddr_init(phydev, config, macaddr_list)
{
let macaddr_data = {
num_global: config.num_global_macaddr ?? 1,
macaddr_base: config.macaddr_base,
mbssid: config.mbssid ?? 0,
};
return phydev.macaddr_init(macaddr_list, macaddr_data);
}
function iface_restart(phydev, config, old_config)
{
let phy = phydev.name;
@@ -247,7 +258,7 @@ function iface_restart(phydev, config, old_config)
return;
}
phydev.macaddr_init(iface_config_macaddr_list(config));
iface_macaddr_init(phydev, config, iface_config_macaddr_list(config));
for (let i = 0; i < length(config.bss); i++) {
let bss = config.bss[i];
if (bss.default_macaddr)
@@ -505,7 +516,7 @@ function iface_reload_config(phydev, config, old_config)
num_global: config.num_global_macaddr ?? 1,
mbssid: config.mbssid ?? 0,
};
macaddr_list = phydev.macaddr_init(macaddr_list, macaddr_data);
macaddr_list = iface_macaddr_init(phydev, config, macaddr_list);
for (let i = 0; i < length(config.bss); i++) {
if (bss_list[i])
continue;
@@ -674,9 +685,10 @@ function iface_load_config(filename)
continue;
}
if (val[0] == "#num_global_macaddr" ||
val[0] == "mbssid")
config[val[0]] = int(val[1]);
if (val[0] == "#num_global_macaddr")
config[substr(val[0], 1)] = int(val[1]);
else if (val[0] == "multiple_bssid")
config.mbssid = int(val[1]);
push(config.radio.data, line);
}

View File

@@ -121,10 +121,13 @@ qcom_setup_macs()
lan_mac=$(macaddr_add "$wan_mac" 2)
;;
sonicfi,rap630e)
mac=$(fw_printenv -n BaseMacAddress)
mtd=$(find_mtd_chardev "0:APPSBLENV")
[ -z "$mtd" ] && return;
mac=$(grep BaseMacAddress= $mtd | cut -d '=' -f2)
[ -z "$mac" ] && return;
lan_mac=$(macaddr_canonicalize $mac)
wan_mac=$(macaddr_add "$wan_mac" 1)
wan_mac=$(macaddr_canonicalize $mac)
lan_mac=$(macaddr_add "$wan_mac" 1)
ucidef_set_network_device_mac eth1 $wan_mac
ucidef_set_network_device_mac eth0 $lan_mac
ip link set eth1 address $wan_mac

View File

@@ -6,8 +6,9 @@ boot() {
case "$(board_name)" in
hfcl,ion4xi_w)
fw_setenv boot_count 0
;;
;;
edgecore,oap101|\
edgecore,oap101e|\
edgecore,eap104)
avail=$(fw_printenv -n upgrade_available)
[ "${avail}" -eq 0 ] && fw_setenv upgrade_available 1

View File

@@ -114,12 +114,7 @@ platform_do_upgrade() {
indio,um-325ax-v2|\
indio,um-335ax|\
indio,um-525axp|\
indio,um-525axm|\
edgecore,oap101|\
edgecore,oap101-6e|\
edgecore,oap101e|\
edgecore,oap101e-6e|\
edgecore,eap104)
indio,um-525axm)
if [ "$(find_mtd_chardev rootfs)" ]; then
CI_UBIPART="rootfs"
else
@@ -133,6 +128,43 @@ platform_do_upgrade() {
fi
nand_upgrade_tar "$1"
;;
edgecore,oap101|\
edgecore,oap101-6e|\
edgecore,oap101e|\
edgecore,oap101e-6e|\
edgecore,eap104)
if [ "$(find_mtd_chardev rootfs)" ]; then
CI_UBIPART="rootfs"
else
if [ -e /tmp/downgrade ]; then
CI_UBIPART="rootfs1"
{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
CI_FWSETENV="-s /tmp/fw_setenv.txt"
else
local CI_UBIPART_B=""
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_UBIPART_B="rootfs1"
CI_FWSETENV="active 2"
elif grep -q rootfs2 /proc/cmdline; then
CI_UBIPART="rootfs1"
CI_UBIPART_B="rootfs2"
CI_FWSETENV="active 1"
else
CI_UBIPART="rootfs1"
CI_UBIPART_B=""
CI_FWSETENV="active 1"
fi
if [ "$(fw_printenv -n upgrade_available 2>/dev/null)" = "0" ]; then
if [ -n "$CI_UBIPART_B" ]; then
CI_UBIPART="$CI_UBIPART_B"
CI_FWSETENV=""
fi
fi
fi
fi
nand_upgrade_tar "$1"
;;
glinet,b3000)
CI_UBIPART="rootfs1"
[ "$(find_mtd_chardev rootfs)" ] && CI_UBIPART="rootfs"

View File

@@ -182,12 +182,31 @@ platform_do_upgrade() {
if [ "$(find_mtd_chardev rootfs)" ]; then
CI_UBIPART="rootfs"
else
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_FWSETENV="active 2"
else
if [ -e /tmp/downgrade ]; then
CI_UBIPART="rootfs1"
CI_FWSETENV="active 1"
{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
CI_FWSETENV="-s /tmp/fw_setenv.txt"
else
local CI_UBIPART_B=""
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_UBIPART_B="rootfs1"
CI_FWSETENV="active 2"
elif grep -q rootfs2 /proc/cmdline; then
CI_UBIPART="rootfs1"
CI_UBIPART_B="rootfs2"
CI_FWSETENV="active 1"
else
CI_UBIPART="rootfs1"
CI_UBIPART_B=""
CI_FWSETENV="active 1"
fi
if [ "$(fw_printenv -n upgrade_available 2>/dev/null)" = "0" ]; then
if [ -n "$CI_UBIPART_B" ]; then
CI_UBIPART="$CI_UBIPART_B"
CI_FWSETENV=""
fi
fi
fi
fi
nand_upgrade_tar "$1"

View File

@@ -7,7 +7,7 @@ boot() {
hfcl,ion4xe|\
hfcl,ion4xi)
fw_setenv boot_count 0
;;
;;
edgecore,eap101|\
edgecore,eap102|\
edgecore,oap102|\

View File

@@ -78,12 +78,27 @@ platform_do_upgrade() {
CI_UBIPART="rootfs1"
{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
CI_FWSETENV="-s /tmp/fw_setenv.txt"
elif grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_FWSETENV="active 2"
else
CI_UBIPART="rootfs1"
CI_FWSETENV="active 1"
local CI_UBIPART_B=""
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_UBIPART_B="rootfs1"
CI_FWSETENV="active 2"
elif grep -q rootfs2 /proc/cmdline; then
CI_UBIPART="rootfs1"
CI_UBIPART_B="rootfs2"
CI_FWSETENV="active 1"
else
CI_UBIPART="rootfs1"
CI_UBIPART_B=""
CI_FWSETENV="active 1"
fi
if [ "$(fw_printenv -n upgrade_available 2>/dev/null)" = "0" ]; then
if [ -n "$CI_UBIPART_B" ]; then
CI_UBIPART="$CI_UBIPART_B"
CI_FWSETENV=""
fi
fi
fi
fi
nand_upgrade_tar "$1"

View File

@@ -0,0 +1,13 @@
Index: backports-6.12.6/net/mac80211/vht.c
===================================================================
--- backports-6.12.6.orig/net/mac80211/vht.c
+++ backports-6.12.6/net/mac80211/vht.c
@@ -365,7 +365,7 @@ _ieee80211_sta_cap_rx_bw(struct link_sta
enum nl80211_band band;
u8 info;
- if (chandef) {
+ if (chandef && chandef->chan) {
band = chandef->chan->band;
} else {
struct ieee80211_bss_conf *link_conf;

View File

@@ -213,6 +213,14 @@ mediatek_setup_macs()
yuncore,ax835)
label_mac=$(mtd_get_mac_binary "Factory" 0x4)
;;
emplus,wap588m)
lan_mac_offset="0x2A"
wan_mac_offset="0x24"
part_name="Factory"
lan_mac=$(mtd_get_mac_binary $part_name $lan_mac_offset)
wan_mac=$(mtd_get_mac_binary $part_name $wan_mac_offset)
label_mac=$wan_mac
;;
esac
[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac

View File

@@ -16,6 +16,7 @@ PKG_LICENSE_FILES:=LICENSE
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/morse_driver.git
PKG_MIRROR_HASH:=3ba6acd2760a1939fcd8e6f9b4dadbaed4562ce9879a21ff2a821ab445fa22b5
PKG_HASH:=159d018a92e0cf742795ed49bd94fb6ed324163012bb91c2a2e4e0f6037bbf23
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=b2ab42a5f22527422adf6afab73f2d019c16f162

View File

@@ -16,6 +16,7 @@ PKG_LICENSE:=BSD-3-Clause
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/hostap.git
PKG_MIRROR_HASH:=a2f17ce3d2fe25d45cc2d6869e9ea644bcac441ec9b541972034768d4fc63608
PKG_HASH:=a2f17ce3d2fe25d45cc2d6869e9ea644bcac441ec9b541972034768d4fc63608
PKG_SOURCE_PROTO:=git

View File

@@ -17,6 +17,7 @@ PKG_LICENSE_FILES:=
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/morse_cli.git
PKG_MIRROR_HASH:=04c88a3aea99082a29eb1f84a9b62dcbb85980fa040e0e34901c1826f33ae74c
PKG_HASH:=04c88a3aea99082a29eb1f84a9b62dcbb85980fa040e0e34901c1826f33ae74c
PKG_SOURCE_PROTO:=git

View File

@@ -16,6 +16,7 @@ PKG_LICENSE:=BSD-3-Clause
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/MorseMicro/hostap.git
PKG_MIRROR_HASH:=c342d1489d03363b79b5b4e185ccbceca53aab9e634daefb81180ad1012b77b7
PKG_HASH:=c342d1489d03363b79b5b4e185ccbceca53aab9e634daefb81180ad1012b77b7
PKG_SOURCE_PROTO:=git

View File

@@ -108,6 +108,11 @@ $(call Package/ath12k-wifi-default)
TITLE:=board-2.bin for WF672
endef
define Package/ath12k-wifi-asterfusion-ap7330
$(call Package/ath12k-wifi-default)
TITLE:=board.bin for Asterfusion AP7330
endef
define Package/ath12k-wifi-cig-wf189/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
@@ -223,6 +228,13 @@ define Package/ath12k-wifi-cig-wf672/install
$(INSTALL_DATA) ./board-2.bin.wf672-us.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin.US
endef
define Package/ath12k-wifi-asterfusion-ap7330/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
$(INSTALL_DATA) ./board-2.bin.ap7330.QCN92XX $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board-2.bin
$(INSTALL_DATA) ./board-2.bin.ap7330.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin
endef
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189))
$(eval $(call BuildPackage,ath12k-wifi-edgecore-eap105))
$(eval $(call BuildPackage,ath12k-wifi-emplus-wap7635))
@@ -238,3 +250,4 @@ $(eval $(call BuildPackage,ath12k-wifi-zyxel-nwa130be))
$(eval $(call BuildPackage,ath12k-wifi-zyxel-nwa50be))
$(eval $(call BuildPackage,ath12k-wifi-zyxel-nwa210be))
$(eval $(call BuildPackage,ath12k-wifi-cig-wf672))
$(eval $(call BuildPackage,ath12k-wifi-asterfusion-ap7330))

View File

@@ -0,0 +1,20 @@
[
{
"board": [
{
"names": [
"bus=ahb,qmi-chip-id=0,qmi-board-id=255"
],
"data": "board-asterfusion-ap7330.bin.ipq53xx"
}
],
"regdb": [
{
"names": [
"bus=ahb,qmi-chip-id=0,qmi-board-id=255"
],
"data": "regdb-asterfusion-ipq5332-qcn92xx.bin"
}
]
}
]

View File

@@ -0,0 +1,20 @@
[
{
"board": [
{
"names": [
"bus=pci,qmi-chip-id=0,qmi-board-id=255"
],
"data": "board-asterfusion-ap7330.bin.qcn9224"
}
],
"regdb": [
{
"names": [
"bus=pci,qmi-chip-id=0,qmi-board-id=255"
],
"data": "regdb-asterfusion-ipq5332-qcn92xx.bin"
}
]
}
]

View File

@@ -24,3 +24,6 @@ $encoder -c board-2-nwa50be-QCN6432.json -o board-2.bin.nwa50be.QCN6432
$encoder -c board-2-nwa210be-IPQ5332.json -o board-2.bin.nwa210be.IPQ5332
$encoder -c board-2-nwa210be-QCN92XX.json -o board-2.bin.nwa210be.QCN92XX
$encoder -c board-2-ap7330-IPQ5332.json -o board-2.bin.ap7330.IPQ5332
$encoder -c board-2-ap7330-QCN92XX.json -o board-2.bin.ap7330.QCN92XX

View File

@@ -1057,8 +1057,7 @@ return {
bss_event("add", name);
},
bss_reload: function(phy, name, obj, reconf) {
//bss_event("reload", name, { reconf: reconf != 0 });
bss_event("reload", name, { reconf: false });
bss_event("reload", name, { reconf: reconf != 0 });
},
bss_remove: function(phy, name, obj) {
bss_event("remove", name);

View File

@@ -0,0 +1,69 @@
From c2e1dbd799ae5ed166e9c84a3c3d3a07a8f8cc9b Mon Sep 17 00:00:00 2001
From: Venkat Chimata <venkat@nearhop.com>
Date: Thu, 11 Dec 2025 10:38:07 +0530
Subject: [PATCH] bandwidth: Correct handling of RADIUS-assigned bandwidth
limits
Description:
Hostapd successfully parsed the uplink and downlink bandwidth attributes from
the RADIUS server, but the values were not being propagated correctly into
sta_info. As a result, the bandwidth information was missing in the UBUS
events sent to ucentral-event.
Fix:
Ensure the parsed bandwidth values are correctly passed to sta_info so they
are included in subsequent UBUS notifications.
Tests Performed:
Configured per-client bandwidth limits on the RADIUS server and verified that:
- The AP enforces the configured uplink/downlink limits, and
- The correct bandwidth values appear in the UBUS events.
Signed-off-by: Venkat Chimata <venkat@nearhop.com>
---
src/ap/ieee802_11.c | 2 ++
src/ap/ieee802_11_auth.c | 1 +
src/ap/ieee802_11_auth.h | 1 +
3 files changed, 4 insertions(+)
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index ef1ad21..615fb32 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -2485,6 +2485,8 @@ int ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
ap_sta_no_session_timeout(hapd, sta);
}
+ os_memcpy(sta->bandwidth, info->bandwidth, sizeof(sta->bandwidth));
+
return 0;
}
diff --git a/src/ap/ieee802_11_auth.c b/src/ap/ieee802_11_auth.c
index e673296..9d0d734 100644
--- a/src/ap/ieee802_11_auth.c
+++ b/src/ap/ieee802_11_auth.c
@@ -581,6 +581,7 @@ hostapd_acl_recv_radius(struct radius_msg *msg, struct radius_msg *req,
os_memcpy(info->radius_cui, buf, len);
}
+ radius_msg_get_wispr(msg, info->bandwidth);
if (hapd->conf->wpa_psk_radius == PSK_RADIUS_REQUIRED &&
!info->psk)
cache->accepted = HOSTAPD_ACL_REJECT;
diff --git a/src/ap/ieee802_11_auth.h b/src/ap/ieee802_11_auth.h
index 22ae1a9..b0005bd 100644
--- a/src/ap/ieee802_11_auth.h
+++ b/src/ap/ieee802_11_auth.h
@@ -23,6 +23,7 @@ struct radius_sta {
struct hostapd_sta_wpa_psk_short *psk;
char *identity;
char *radius_cui;
+ u32 bandwidth[2];
};
int hostapd_check_acl(struct hostapd_data *hapd, const u8 *addr,
--
2.34.1

View File

@@ -0,0 +1,20 @@
diff -urp a/src/ap/hostapd.c b/src/ap/hostapd.c
--- a/src/ap/hostapd.c 2025-10-28 15:50:59.024346272 +0800
+++ b/src/ap/hostapd.c 2025-12-09 23:03:55.351738472 +0800
@@ -5115,14 +5115,11 @@ static void hostapd_switch_color_timeout
}
if (i == HE_OPERATION_BSS_COLOR_MAX) {
- /* There are no free colors so turn BSS coloring off */
+ /* There are no free colors so do not change color and wait for next check */
wpa_printf(MSG_INFO,
- "No free colors left, turning off BSS coloring");
+ "No free colors left, stay at the same color");
hapd->iface->conf->he_op.he_bss_color_disabled = 1;
- hapd->iface->conf->he_op.he_bss_color = os_random() % 63 + 1;
hapd->no_free_color = 1;
- for (b = 0; b < hapd->iface->num_bss; b++)
- ieee802_11_set_beacon(hapd->iface->bss[b]);
/* Enabling for next check after timeout*/
hapd->iface->conf->he_op.he_bss_color_disabled = 0;

View File

@@ -0,0 +1,34 @@
From 406807b134f88ec038ee120a0a0085e140e96313 Mon Sep 17 00:00:00 2001
From: Venkat Chimata <venkat@nearhop.com>
Date: Fri, 23 Jan 2026 00:31:13 +0530
Subject: [PATCH] hostapd: fix 6 GHz center frequency adjustment condition
Ensure that the center frequency segment 0 index adjustment for
320 MHz bandwidth is applied only for valid 6 GHz frequencies.
Previously, the bandwidth check alone could trigger the adjustment
even when the operating center index did not correspond to a 6 GHz
frequency. Add an explicit is_6ghz_freq() check to avoid incorrect
center frequency offset calculations.
Signed-off-by: Venkat Chimata <venkat@nearhop.com>
---
src/ap/ap_config.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index dfd895e..b6c2a4a 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -1306,7 +1306,7 @@ hostapd_set_oper_centr_freq_seg0_idx(struct hostapd_config *conf,
#ifdef CONFIG_IEEE80211BE
if (conf->ieee80211be)
conf->eht_oper_centr_freq_seg0_idx = oper_centr_freq_seg0_idx;
- if (center_idx_to_bw_6ghz(oper_centr_freq_seg0_idx) == 4)
+ if (is_6ghz_freq(conf->channel) && (center_idx_to_bw_6ghz(oper_centr_freq_seg0_idx) == 4))
oper_centr_freq_seg0_idx +=
conf->channel > oper_centr_freq_seg0_idx ? 16 : -16;
--
2.34.1

View File

@@ -46,6 +46,11 @@ ipq53xx_setup_interfaces()
zyxel,nwa130be)
ucidef_set_interfaces_lan_wan "eth1" "eth0"
;;
asterfusion,AP7330)
ucidef_set_interface_wan "eth0"
ucidef_add_switch "switch1" \
"0u@eth1" "3:lan" "4:lan"
;;
esac
}
@@ -154,6 +159,19 @@ qcom_setup_macs()
ucidef_set_wireless_macaddr_base 2g $(macaddr_add "$wan_mac" 1)
ucidef_set_wireless_macaddr_base 5g $(macaddr_add "$wan_mac" 2)
;;
asterfusion,AP7330)
mtd=$(find_mtd_chardev "0:ART")
[ -z "$mtd" ] && return;
wan_mac=$(mtd_get_mac_binary 0:ART 0x0)
[ -z "$wan_mac" ] && return;
wan_mac=$(macaddr_canonicalize $wan_mac)
lan_mac=$(macaddr_add "$wan_mac" 1)
ucidef_set_network_device_mac eth0 $wan_mac
ucidef_set_network_device_mac eth1 $lan_mac
ucidef_set_wireless_macaddr_base 2g $(macaddr_add "$wan_mac" 2)
ucidef_set_wireless_macaddr_base 5g $(macaddr_add "$wan_mac" 3)
ucidef_set_wireless_macaddr_base 6g $(macaddr_add "$wan_mac" 4)
;;
*)
wan_mac=$(cat /sys/class/net/eth1/address)
lan_mac=$(macaddr_add "$wan_mac" 1)

View File

@@ -67,6 +67,7 @@ ath12k/IPQ5332/hw1.0/caldata.bin)
emplus,wap7635|\
sercomm,ap72tip-v4|\
sercomm,ap72tip|\
asterfusion,AP7330|\
zyxel,nwa130be|\
zyxel,nwa210be|\
zyxel,nwa50be)
@@ -92,6 +93,7 @@ ath12k/QCN92XX/hw1.0/cal-pci-0001:01:00.0.bin)
emplus,wap7635|\
sercomm,ap72tip-v4|\
sercomm,ap72tip|\
asterfusion,AP7330|\
zyxel,nwa210be|\
zyxel,nwa130be)
caldata_extract "0:ART" 0x58800 0x2d000

View File

@@ -5,6 +5,7 @@
board=$(board_name)
case "$board" in
"asterfusion,AP7330"|\
"edgecore,eap105")
ln -s /sys/kernel/debug/ath12k/ipq5332\ hw1.0_c000000.wifi/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath12k/qcn9274\ hw2.0_0001:01:00.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g

View File

@@ -151,17 +151,32 @@ platform_do_upgrade() {
spi_nor_emmc_do_upgrade_bootconfig $1
;;
edgecore,eap105)
if [ "$(find_mtd_chardev rootfs)" ]; then
CI_UBIPART="rootfs"
else
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_FWSETENV="active 2"
else
if [ -e /tmp/downgrade ]; then
CI_UBIPART="rootfs1"
CI_FWSETENV="active 1"
{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
CI_FWSETENV="-s /tmp/fw_setenv.txt"
else
local CI_UBIPART_B=""
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_UBIPART_B="rootfs1"
CI_FWSETENV="active 2"
elif grep -q rootfs2 /proc/cmdline; then
CI_UBIPART="rootfs1"
CI_UBIPART_B="rootfs2"
CI_FWSETENV="active 1"
else
CI_UBIPART="rootfs1"
CI_UBIPART_B=""
CI_FWSETENV="active 1"
fi
if [ "$(fw_printenv -n upgrade_available 2>/dev/null)" = "0" ]; then
if [ -n "$CI_UBIPART_B" ]; then
CI_UBIPART="$CI_UBIPART_B"
CI_FWSETENV=""
fi
fi
fi
fi
nand_upgrade_tar "$1"
;;
sonicfi,rap7110c-341x)
@@ -174,6 +189,7 @@ platform_do_upgrade() {
sonicfi_dualimage_check
nand_upgrade_tar "$1"
;;
asterfusion,AP7330|\
zyxel,nwa130be|\
zyxel,nwa210be|\
zyxel,nwa50be)

View File

@@ -1226,3 +1226,5 @@ CONFIG_PSTORE_RAM=y
# CONFIG_RTL8221D_PHY is not set
# CONFIG_INPUT_LSM303AGR is not set
# CONFIG_USB_SERIAL_XR is not set
CONFIG_GPIO_WATCHDOG=y
CONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y

View File

@@ -0,0 +1,711 @@
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
* IPQ5332 RDP468 board device tree source
*
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
#include "ipq5332.dtsi"
#include "ipq5332-default-memory.dtsi"
/*
* This file is copied from ipq5332-rdp468.dts but has been modified.
* For modification, please compare the original QSDK's ipq5332-mi01.6.dts
* with the modified version.
*/
/ {
model = "ASTERFUSION";
compatible = "asterfusion,AP7330", "qcom,ipq5332-ap-mi01.6", "qcom,ipq5332-rdp468", "qcom,ipq5332";
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
ramoops@49c00000 {
compatible = "ramoops";
no-map;
reg = <0x0 0x49c00000 0x0 0x50000>;
record-size = <0x20000>;
console-size = <0x8000>;
pmsg-size = <0x8000>;
};
};
aliases {
serial0 = &blsp1_uart0;
serial1 = &blsp1_uart1;
ethernet0 = "/soc/dp1";
ethernet1 = "/soc/dp2";
led-boot = &led_green;
led-failsafe = &led_red;
led-running = &led_green;
led-upgrade = &led_green;
};
chosen {
stdout-path = "serial0";
};
soc@0 {
mdio:mdio@90000 {
pinctrl-0 = <&mdio1_pins &mdio0_pins>;
pinctrl-names = "default";
/*gpio51 for manhattan reset*/
phy-reset-gpio = <&tlmm 51 GPIO_ACTIVE_LOW>;
phyaddr_fixup = <0xC90F018>;
uniphyaddr_fixup = <0xC90F014>;
mdio_clk_fixup; /* MDIO clock sequence fix up flag */
status = "okay";
phy0: ethernet-phy@0 {
reg = <1>;
fixup;
};
phy1: ethernet-phy@1 {
reg = <2>;
fixup;
};
phy2: ethernet-phy@2 {
reg = <3>;
fixup;
};
phy3: ethernet-phy@3 {
reg = <4>;
fixup;
};
switch0@10 {
compatible = "qca,qca8386";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x10>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
label = "cpu";
ethernet = <&gmac2>;
phy-mode = "sgmii";
};
port@1 {
reg = <1>;
label = "lan1";
phy-handle = <&phy0>;
};
port@2 {
reg = <2>;
label = "lan2";
phy-handle = <&phy1>;
};
port@3 {
reg = <3>;
label = "lan3";
phy-handle = <&phy2>;
};
port@4 {
reg = <4>;
label = "lan4";
phy-handle = <&phy3>;
};
};
};
};
ess-instance {
num_devices = <0x2>;
ess-switch@3a000000 {
pinctrl-names = "default";
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
switch_lan_bmp = <0x2>; /* lan port bitmap */
switch_wan_bmp = <0x4>; /* wan port bitmap */
switch_mac_mode = <0xc>; /* mac mode for uniphy instance0*/
switch_mac_mode1 = <0xe>; /* mac mode for uniphy instance1*/
switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/
qcom,port_phyinfo {
port@0 {
port_id = <1>;
forced-speed = <2500>;
forced-duplex = <1>;
};
port@1 {
port_id = <2>;
phy_address = <30>;
media-type = "sfp"; /* fiber mode */
};
};
};
ess-switch1@1 {
compatible = "qcom,ess-switch-qca8386";
device_id = <1>;
switch_access_mode = "mdio";
mdio-bus = <&mdio>;
switch_mac_mode = <0xc>; /* mac mode for uniphy instance0 */
switch_mac_mode1 = <0xff>; /* mac mode1 for uniphy instance1 */
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
switch_lan_bmp = <0x1e>; /* lan port bitmap */
switch_wan_bmp = <0x0>; /* wan port bitmap */
link-polling-required = <0>;
fdb_sync = "interrupt";
link-intr-gpio = <&tlmm 23 GPIO_ACTIVE_HIGH>;
qcom,port_phyinfo {
port@0 {
port_id = <0>;
forced-speed = <2500>;
forced-duplex = <1>;
};
port@1 {
port_id = <1>;
phy_address = <1>;
};
port@2 {
port_id = <2>;
phy_address = <2>;
};
port@3 {
port_id = <3>;
phy_address = <3>;
};
port@4 {
port_id = <4>;
phy_address = <4>;
};
};
led_source@2 {
source = <2>;
mode = "normal";
speed = "all";
blink_en = "enable";
active = "high";
};
led_source@5 {
source = <5>;
mode = "normal";
speed = "all";
blink_en = "enable";
active = "high";
};
led_source@8 {
source = <8>;
mode = "normal";
speed = "all";
blink_en = "enable";
active = "high";
};
led_source@11 {
source = <11>;
mode = "normal";
speed = "all";
blink_en = "enable";
active = "high";
};
};
};
dp1 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <2>;
reg = <0x3a504000 0x4000>;
qcom,mactype = <1>;
local-mac-address = [000000000000];
mdio-bus = <&mdio>;
qcom,phy-mdio-addr = <30>;
qcom,link-poll = <1>;
phy-mode = "sgmii";
};
gmac2:dp2 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <1>;
reg = <0x3a500000 0x4000>;
qcom,mactype = <1>;
local-mac-address = [000000000000];
phy-mode = "sgmii";
qcom,mht-dev = <1>;
qcom,is_switch_connected = <1>;
qcom,ppe-offload-disabled = <1>;
};
/* EDMA host driver configuration for the board */
edma@3ab00000 {
qcom,txdesc-ring-start = <4>; /* Tx desc ring start ID */
qcom,txdesc-rings = <12>; /* Total number of Tx desc rings to be provisioned */
qcom,mht-txdesc-rings = <8>; /* Extra Tx desc rings to be provisioned for MHT SW ports */
qcom,txcmpl-ring-start = <4>; /* Tx complete ring start ID */
qcom,txcmpl-rings = <12>; /* Total number of Tx complete rings to be provisioned */
qcom,mht-txcmpl-rings = <8>; /* Extra Tx complete rings to be provisioned for mht sw ports. */
qcom,rxfill-ring-start = <4>; /* Rx fill ring start ID */
qcom,rxfill-rings = <4>; /* Total number of Rx fill rings to be provisioned */
qcom,rxdesc-ring-start = <12>; /* Rx desc ring start ID */
qcom,rxdesc-rings = <4>; /* Total number of Rx desc rings to be provisioned */
qcom,rx-page-mode = <0>; /* Rx fill ring page mode */
qcom,tx-map-priority-level = <1>; /* Tx priority level per port */
qcom,rx-map-priority-level = <1>; /* Rx priority level per core */
qcom,ppeds-num = <2>; /* Number of PPEDS nodes */
/* PPE-DS node format: <Rx-fill Tx-cmpl Rx Tx Queue-base Queue-count> */
qcom,ppeds-map = <1 1 1 1 32 8>, /* PPEDS Node#0 ring and queue map */
<2 2 2 2 40 8>; /* PPEDS Node#1 ring and queue map */
qcom,txdesc-map = <8 9 10 11>, /* Port0 per-core Tx ring map */
<12 13 14 15>, /* MHT-Port1 per-core Tx ring map */
<4 5 6 7>, /* MHT-Port2 per-core Tx ring map/packets from vp*/
<16 17 18 19>, /* MHT-Port3 per-core Tx ring map */
<20 21 22 23>; /* MHT-Port4 per-core Tx ring map */
qcom,txdesc-fc-grp-map = <1 2 3 4 5>; /* Per GMAC flow control group map */
qcom,rxfill-map = <4 5 6 7>; /* Per-core Rx fill ring map */
qcom,rxdesc-map = <12 13 14 15>; /* Per-core Rx desc ring map */
qcom,rx-queue-start = <0>; /* Rx queue start */
qcom,rx-ring-queue-map = <0 8 16 24>, /* Priority 0 queues per-core Rx ring map */
<1 9 17 25>, /* Priority 1 queues per-core Rx ring map */
<2 10 18 26>, /* Priority 2 queues per-core Rx ring map */
<3 11 19 27>, /* Priority 3 queues per-core Rx ring map */
<4 12 20 28>, /* Priority 4 queues per-core Rx ring map */
<5 13 21 29>, /* Priority 5 queues per-core Rx ring map */
<6 14 22 30>, /* Priority 6 queues per-core Rx ring map */
<7 15 23 31>; /* Priority 7 queues per-core Rx ring map */
interrupts = <0 163 4>, /* Tx complete ring id #4 IRQ info */
<0 164 4>, /* Tx complete ring id #5 IRQ info */
<0 165 4>, /* Tx complete ring id #6 IRQ info */
<0 166 4>, /* Tx complete ring id #7 IRQ info */
<0 167 4>, /* Tx complete ring id #8 IRQ info */
<0 168 4>, /* Tx complete ring id #9 IRQ info */
<0 169 4>, /* Tx complete ring id #10 IRQ info */
<0 170 4>, /* Tx complete ring id #11 IRQ info */
<0 171 4>, /* Tx complete ring id #12 IRQ info */
<0 172 4>, /* Tx complete ring id #13 IRQ info */
<0 173 4>, /* Tx complete ring id #14 IRQ info */
<0 174 4>, /* Tx complete ring id #15 IRQ info */
<0 139 4>, /* Rx desc ring id #12 IRQ info */
<0 140 4>, /* Rx desc ring id #13 IRQ info */
<0 141 4>, /* Rx desc ring id #14 IRQ info */
<0 142 4>, /* Rx desc ring id #15 IRQ info */
<0 191 4>, /* Misc error IRQ info */
<0 160 4>, /* PPEDS Node #1(TxComp ring id #1) TxComplete IRQ info */
<0 128 4>, /* PPEDS Node #1(Rx Desc ring id #1) Rx Desc IRQ info */
<0 152 4>, /* PPEDS Node #1(RxFill Desc ring id #1) Rx Fill IRQ info */
<0 161 4>, /* PPEDS Node #2(TxComp ring id #2) TxComplete IRQ info */
<0 129 4>, /* PPEDS Node #2(Rx Desc ring id #2) Rx Desc IRQ info */
<0 153 4>, /* PPEDS Node #2(RxFill Desc ring id #2) Rx Fill IRQ info */
<0 175 4>, /* MHT port Tx complete ring id #16 IRQ info */
<0 176 4>, /* MHT port Tx complete ring id #17 IRQ info */
<0 177 4>, /* MHT port Tx complete ring id #18 IRQ info */
<0 178 4>, /* MHT port Tx complete ring id #19 IRQ info */
<0 179 4>, /* MHT port Tx complete ring id #20 IRQ info */
<0 180 4>, /* MHT port Tx complete ring id #21 IRQ info */
<0 181 4>, /* MHT port Tx complete ring id #22 IRQ info */
<0 182 4>; /* MHT port Tx complete ring id #23 IRQ info */
};
leds {
compatible = "gpio-leds";
pinctrl-0 = <&gpio_leds_default>;
pinctrl-names = "default";
led_wifi: led@36 {
label = "led_wifi";
gpios = <&tlmm 36 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "none";
default-state = "off";
};
led_red: led@37 {
label = "led_red";
gpios = <&tlmm 37 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "timer";
default-state = "on";
};
led_green: led@38 {
label = "led_green";
gpios = <&tlmm 38 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "none";
default-state = "off";
};
};
gpio-watchdog {
compatible = "linux,wdt-gpio";
gpios = <&tlmm 39 GPIO_ACTIVE_LOW>;
hw_algo = "toggle";
hw_margin_ms = <5000>;
always-running;
};
gpio_keys {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
status = "okay";
button@1 {
label = "wps";
linux,code = <KEY_WPS_BUTTON>;
gpios = <&tlmm 35 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
wsi: wsi {
id = <0>;
num_chip = <2>;
status = "okay";
chip_info = <0 1 1>,
<1 1 0>;
};
};
};
&wifi0 {
// led-gpio = <&tlmm 36 GPIO_ACTIVE_HIGH>;
qcom,rproc = <&q6_wcss_pd1>;
qcom,rproc_rpd = <&q6v5_wcss>;
qcom,multipd_arch;
qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
memory-region = <&q6_region>;
qcom,wsi = <&wsi>;
qcom,wsi_index = <0>;
qcom,board_id = <0x12>;
status = "okay";
};
&qcn9224_pcie1 {
status = "okay";
};
&blsp1_uart0 {
pinctrl-0 = <&serial_0_pins>;
pinctrl-names = "default";
status = "okay";
};
&blsp1_uart1 {
pinctrl-0 = <&serial_1_pins>;
pinctrl-names = "default";
status = "disabled";
};
&blsp1_i2c1 {
clock-frequency = <400000>;
pinctrl-0 = <&i2c_1_pins>;
pinctrl-names = "default";
status = "ok";
};
&blsp1_spi0 {
pinctrl-0 = <&spi_0_data_clk_pins &spi_0_cs_pins>;
pinctrl-names = "default";
status = "okay";
flash@0 {
compatible = "n25q128a11", "micron,n25q128a11", "jedec,spi-nor";
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;
spi-max-frequency = <50000000>;
};
};
&blsp1_spi2 {
pinctrl-0 = <&spi_2_pins>;
pinctrl-names = "default";
cs-select = <0>;
status = "disabled";
};
&pcm {
pinctrl-0 = <&audio_pins_pri>;
pinctrl-names = "primary";
status = "disabled";
};
&sdhc {
bus-width = <4>;
max-frequency = <192000000>;
mmc-ddr-1_8v;
mmc-hs200-1_8v;
non-removable;
pinctrl-0 = <&sdc_default_state>;
pinctrl-names = "default";
status = "disabled";
};
&sleep_clk {
clock-frequency = <32000>;
};
&xo {
clock-frequency = <24000000>;
};
&qpic_bam {
status = "okay";
};
&qpic_nand {
pinctrl-0 = <&qspi_default_state>;
pinctrl-names = "default";
status = "okay";
nandcs@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;
nand-ecc-strength = <8>;
nand-ecc-step-size = <512>;
nand-bus-width = <8>;
};
};
&pcie1_phy_x2 {
status = "okay";
};
&pcie1 {
pinctrl-0 = <&pcie1_default_state>;
pinctrl-names = "default";
perst-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>;
status = "okay";
pcie1_rp {
reg = <0 0 0 0 0>;
qcom,mhi@1 {
reg = <0 0 0 0 0>;
boot-args = <0x2 0x4 0x34 0x3 0x0 0x0 /* MX Rail, GPIO52, Drive strength 0x3 */
0x4 0x4 0x18 0x3 0x0 0x0 /* RFA1p2 Rail, GPIO24, Drive strength 0x3 */
0x0 0x4 0x0 0x0 0x0 0x0>; /* End of arguments */
memory-region = <&qcn9224_pcie1>;
qcom,wsi = <&wsi>;
qcom,wsi_index = <1>;
qcom,board_id = <0x1006>;
};
};
};
/* PINCTRL */
&tlmm {
audio_pins_pri: audio_pinmux_pri {
mux_1 {
pins = "gpio29";
function = "audio_pri";
drive-strength = <8>;
bias-pull-down;
};
mux_2 {
pins = "gpio30";
function = "audio_pri";
drive-strength = <8>;
bias-pull-down;
};
mux_3 {
pins = "gpio31";
function = "audio_pri";
drive-strength = <4>;
bias-pull-down;
};
mux_4 {
pins = "gpio32";
function = "audio_pri";
drive-strength = <4>;
bias-pull-down;
};
};
i2c_1_pins: i2c-1-state {
pins = "gpio29", "gpio30";
function = "blsp1_i2c0";
drive-strength = <8>;
bias-pull-up;
};
spi_2_pins: spi-2-pins {
pins = "gpio33", "gpio34", "gpio35";
function = "blsp2_spi0";
drive-strength = <8>;
bias-pull-down;
};
sdc_default_state: sdc-default-state {
clk-pins {
pins = "gpio13";
function = "sdc_clk";
drive-strength = <8>;
bias-disable;
};
cmd-pins {
pins = "gpio12";
function = "sdc_cmd";
drive-strength = <8>;
bias-pull-up;
};
data-pins {
pins = "gpio8", "gpio9", "gpio10", "gpio11";
function = "sdc_data";
drive-strength = <8>;
bias-pull-up;
};
};
spi_0_data_clk_pins: spi-0-data-clk-state {
pins = "gpio14", "gpio15", "gpio16";
function = "blsp0_spi";
drive-strength = <2>;
bias-pull-down;
};
spi_0_cs_pins: spi-0-cs-state {
pins = "gpio17";
function = "blsp0_spi";
drive-strength = <2>;
bias-pull-up;
};
qspi_default_state: qspi-default-state {
qspi_clock {
pins = "gpio13";
function = "qspi_clk";
drive-strength = <8>;
bias-pull-down;
};
qspi_cs {
pins = "gpio12";
function = "qspi_cs";
drive-strength = <8>;
bias-pull-up;
};
qspi_data {
pins = "gpio8", "gpio9", "gpio10", "gpio11";
function = "qspi_data";
drive-strength = <8>;
bias-pull-down;
};
};
serial_1_pins: serial1-pinmux {
pins = "gpio33", "gpio34", "gpio35", "gpio36";
function = "blsp1_uart2";
drive-strength = <8>;
bias-pull-up;
};
gpio_leds_default: gpio-leds-default-state {
led_wifi {
pins = "gpio36";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_blue {
pins = "gpio49";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_red {
pins = "gpio37";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_green {
pins = "gpio38";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_all_enable {
pins = "gpio24";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
};
hwwatchdog {
pins = "gpio39";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
button_pins: button-state {
pins = "gpio35";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
pwm_pins: pwm-state {
pins = "gpio46";
function = "pwm0";
drive-strength = <8>;
};
pcie1_default_state: pcie1-default-state {
pins = "gpio47";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
output-low;
};
};
&license_manager {
status = "okay";
};
&usb3 {
qcom,multiplexed-phy;
status = "okay";
};
&pwm {
pinctrl-0 = <&pwm_pins>;
pinctrl-names = "default";
status = "okay";
};
&hs_m31phy_0 {
status = "okay";
};
&ssuniphy_0 {
status = "okay";
};

View File

@@ -23,14 +23,14 @@
#size-cells = <2>;
ranges;
ramoops@49c00000 {
compatible = "ramoops";
no-map;
reg = <0x0 0x49c00000 0x0 0x50000>;
record-size = <0x20000>;
console-size = <0x8000>;
pmsg-size = <0x8000>;
};
ramoops@49a00000 {
compatible = "ramoops";
no-map;
reg = <0x0 0x49a00000 0x0 0x100000>;
record-size = <0x50000>;
console-size = <0x50000>;
pmsg-size = <0x50000>;
};
};
aliases {

View File

@@ -204,3 +204,16 @@ define Device/cig_wf672
DEVICE_PACKAGES := ath12k-wifi-cig-wf672 ath12k-firmware-ipq5332 ath12k-firmware-qcn92xx
endef
TARGET_DEVICES += cig_wf672
define Device/asterfusion_ap7330
DEVICE_TITLE := Asterfusion AP7330
DEVICE_DTS := ipq5332-asterfusion-ap7330
DEVICE_DTS_CONFIG := config@mi01.6
DEVICE_DTS_DIR := ../dts
SUPPORTED_DEVICES := asterfusion,AP7330 AP7330
IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand
IMAGE/nand-factory.ubi := append-ubi
DEVICE_PACKAGES := ath12k-wifi-asterfusion-ap7330 ath12k-firmware-qcn92xx ath12k-firmware-ipq5332
endef
TARGET_DEVICES += asterfusion_ap7330

View File

@@ -96,6 +96,7 @@ function wiphy_detect() {
let info = {
antenna_rx: phy.wiphy_antenna_avail_rx,
antenna_tx: phy.wiphy_antenna_avail_tx,
reconf: true,
bands: {},
radios: []
};

View File

@@ -1,10 +1,12 @@
#!/bin/sh
check_certificates() {
[ -f /certificates/cert.pem -a -f /certificates/key.pem ] && exit 0
[ -f /certificates/cert.pem -a -f /certificates/key.pem ] || return 1
[ -n "$1" ] && [ ! -f /certificates/operational.pem ] && return 1
exit 0
}
check_certificates
check_certificates 1
tar_part_lookup() {
part="$(fw_printenv -n cert_part)"
@@ -76,9 +78,9 @@ yuncore,ax820)
fi
esac
check_certificates
check_certificates 1
# if we get here no valid certificates were found
# if we get here no valid operational certificates were found
PART_NAME=
@@ -139,11 +141,19 @@ yuncore,fap655)
;;
senao,iap2300m|\
senao,iap4300m|\
emplus,wap588m|\
senao,jeap6500)
PART_NAME=ubi
;;
emplus,wap588m)
tmp_active_fw=$(fw_printenv | grep active_fw | awk -F= {'print $2'})
if [ $tmp_active_fw == "0" ]; then
PART_NAME=ubi
else
PART_NAME=ubi_1
fi
;;
*)
check_certificates
return 1
;;
esac
@@ -155,4 +165,7 @@ MTD=$(find_mtd_index $PART_NAME)
ubiattach -m $MTD -d 3
[ -e /dev/ubi3 ] && mount -t ubifs ubi3:certificates /certificates
check_certificates
check_certificates || {
umount /certificates
check_certificates
}

View File

@@ -400,7 +400,7 @@ function expiry_handler() {
if (!stat)
return;
let ret = system(`openssl x509 -checkend ${timeouts.expiry_threshold} -noout -in /certificates/operational.pem`);
let ret = system(`openssl x509 -checkend ${timeouts.expiry_threshold} -noout -in /etc/ucentral/operational.pem`);
if (!ret) {
ulog(LOG_INFO, 'checked certificate expiry - all ok\n');
return;

View File

@@ -1,12 +1,126 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
9V/T79RyDPMvhRQaxyV7tBGOss3Smw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
dashL0CPsbIJ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
H0FGIeDSQydpOJU=
-----END CERTIFICATE-----

View File

@@ -29,6 +29,9 @@ Build/Compile = $(Build/Compile/Default)
define Package/ratelimit/install
$(CP) ./files/* $(1)
ifeq ($(CONFIG_TARGET_mediatek),y)
$(SED) 's|qdisc replace dev $$$${iface} parent 1:$$$${id} handle $$$${id}: fq_codel flows 128 limit 800 quantum 300 noecn|qdisc add dev $$$${iface} parent 1:$$$${id} sfq perturb 10 limit 2000 quantum 1514|' $(1)/usr/bin/ratelimit
endif
endef
$(eval $(call BuildPackage,ratelimit))

View File

@@ -37,7 +37,19 @@ function qdisc_del(iface) {
}
function ifb_dev(iface) {
return "i-" + iface;
let ifbname;
if ((index(iface, 'phy') != -1) && (index(iface, 'ap') != -1)) {
// For interfaces like phy6g-ap0, phy5g-ap0, phy2g-ap0
// we replace 'phy' with "p" to confine the ifb name length
// and replace 'ap' with 'a' to further shorten it.
ifbname = replace(iface, 'phy', 'p');
ifbname = replace(ifbname, 'ap', 'a');
} else {
ifbname = iface;
}
ifbname = "i-" + ifbname;
return ifbname;
}
function ifb_add(iface, ifbdev) {

View File

@@ -42,7 +42,12 @@ const actions = {
tx_power: function(msg) {
if (!global.phy.txpower(msg))
return result(1, msg.event, 'BSS ' + msg.bssid + ' failed to set TX power', { action: 'tx_power', bssid: msg.bssid });
// iw dev gives updated value
// But fetching it immediately failed once.
// Could n't reprouce it though
// Give few milliseconds to settle
sleep(10);
let level = global.local.txpower(msg.bssid) / 100;
return result(0, msg.event, 'BSS ' + msg.bssid + ' changed TX power', { action: 'tx_power', bssid: msg.bssid, level });
},

View File

@@ -293,6 +293,15 @@ return {
return -1;
},
bssid_to_ifname: function(bssid) {
for (let bss, v in interfaces) {
if (v.bssid == lc(bssid)) {
return bss;
}
}
return null;
},
txpower: function(bssid) {
for (let bss, v in interfaces) {
if (v.bssid != lc(bssid))

View File

@@ -163,10 +163,11 @@ return {
txpower: function(msg) {
if (!msg.bssid || !msg.level)
return false;
let wiphy = global.local.bssid_to_phy(msg.bssid);
if (wiphy < 0)
return false;
global.nl80211.request(global.nl80211.const.NL80211_CMD_SET_WIPHY, 0, { wiphy, wiphy_tx_power_setting: 2, wiphy_tx_power_level: msg.level * 100});
let dev = global.local.bssid_to_ifname(msg.bssid);
if (dev == null) {
return false;
}
global.nl80211.request(global.nl80211.const.NL80211_CMD_SET_WIPHY, 0, { dev, wiphy_tx_power_setting: 2, wiphy_tx_power_level: msg.level * 100});
return true;
},
};

View File

@@ -364,9 +364,9 @@ function switch_status_check(iface, dfs_enabled_5g_flag) {
let cac_time = trim(_cac_time.read('all'));
_cac_time.close();
// if cac_time is a valid number, set timer to cac_time + 5 seconds
// if cac_time is a valid number, set timer to cac_time + 10 seconds
if (cac_time > 0 && match(cac_time, /^[0-9]+$/)) {
timer = int(cac_time) + 5;
timer = int(cac_time) + 10;
}
while (p < timer) {
@@ -537,7 +537,7 @@ function get_chan_util(radio_band, sleep_time) {
return chan_util;
}
function random_channel_selection(iface, band, htmode, chan_list_valid) {
function random_channel_selection(iface, band, htmode, chan_list_valid, exclude_dfs) {
let math = require('math');
let bw = replace(htmode, /[^0-9]/g, '');
let iface_num = replace(iface, /[^0-9]/g, '');
@@ -547,7 +547,9 @@ function random_channel_selection(iface, band, htmode, chan_list_valid) {
}
// channel list from the driver based on the country code
let chan_list_cc = global.phy.phys[phy_id].channels;
let chan_list_cc = uniq(sort(global.phy.phys[phy_id].channels, (a, b) => a - b));
// DFS channel list from the driver
let dfs_chan_list = global.phy.phys[phy_id].dfs_channels || [];
// complete channel list
let chan_list_default = {};
// allowed channel list to select random channel from
@@ -555,6 +557,7 @@ function random_channel_selection(iface, band, htmode, chan_list_valid) {
let chan_list_init = [];
let chan_list_legal = [];
let _chan_list_legal = [];
ulog_info(`[%s] Channel list from the driver = %s \n`, iface, chan_list_cc);
ulog_info(`[%s] Selected channel list from config (default channel list shall be used in case channels haven't been selected) = %s \n`, iface, (chan_list_valid || '[]'));
@@ -663,9 +666,29 @@ function random_channel_selection(iface, band, htmode, chan_list_valid) {
if (band == '5g' && (bw == "80" || bw == "40")) {
// exclude last channels from the channel list when bw is 80MHz or 40MHz to avoid selecting a channel with a secondary channel that cannot be supported
chan_list_legal = slice(chan_list_init, 0, length(chan_list_init)-1) ;
_chan_list_legal = slice(chan_list_init, 0, length(chan_list_init)-1) ;
} else {
chan_list_legal = chan_list_init;
_chan_list_legal = chan_list_init;
}
// check if dfs is enabled or disabled for 5G radio; if dfs is disabled, remove dfs channels from chan_list_legal
if (band == '5g' && exclude_dfs == true) {
ulog_info(`[%s] DFS Channel list from the driver = %s \n`, iface, dfs_chan_list);
for (let _legal_chan in _chan_list_legal) {
let is_dfs_chan = false;
for (let dfs_chan in dfs_chan_list) {
if (dfs_chan == _legal_chan) {
is_dfs_chan = true;
break;
}
}
if (is_dfs_chan == false) {
push(chan_list_legal, _legal_chan);
}
}
} else {
chan_list_legal = _chan_list_legal;
}
if (chan_list_valid) {
@@ -710,13 +733,13 @@ function check_center_channel(chosen_random_channel, current_channel, band, htmo
return ret;
}
function algo_rcs(iface, current_channel, band, htmode, selected_channels) {
function algo_rcs(iface, current_channel, band, htmode, selected_channels, exclude_dfs) {
let chosen_random_channel = 0;
let res = 0;
let same_center_channel = false;
// random_channel_selection script will help to select random channel
chosen_random_channel = random_channel_selection(iface, band, htmode, selected_channels);
chosen_random_channel = random_channel_selection(iface, band, htmode, selected_channels, exclude_dfs);
stats_info_write("/tmp/rrm_random_channel_" + iface, chosen_random_channel);
if (chosen_random_channel == current_channel) {
@@ -826,7 +849,7 @@ function channel_optimize() {
// get radio's uci config
htmode[j] = wireless_status[radio_id].config.htmode;
acs_exclude_dfs[j] = wireless_status[radio_id].config.acs_exclude_dfs;
acs_exclude_dfs[j] = wireless_status[radio_id].config.acs_exclude_dfs || false;
channel_config[j] = wireless_status[radio_id].config.channel;
selected_channels[j] = wireless_status[radio_id].config.channels;
@@ -961,7 +984,7 @@ function channel_optimize() {
let assign_max_chan_util = 0;
// call RCS for multiple random chan
let chan_scan = algo_rcs(radio_iface[l], curr_chan_list[num_chan-1], radio_band[l], htmode[l], selected_channels[l]);
let chan_scan = algo_rcs(radio_iface[l], curr_chan_list[num_chan-1], radio_band[l], htmode[l], selected_channels[l], acs_exclude_dfs[l]);
curr_chan_list[num_chan] = stats_info_read("/tmp/rrm_random_channel_" + radio_iface[l]);
if (chan_scan == 1) {

View File

@@ -1,5 +1,5 @@
{
"major": 4,
"minor": 1,
"patch": 1
"minor": 2,
"patch": 0
}

View File

@@ -282,7 +282,10 @@ handlers = {
vlan_refcount[vlan_id] = (vlan_refcount[vlan_id] || 0) + 1;
let parts = split(notify.data.ifname, '-v');
let is_wifi_iface = (length(parts) == 2 && wildcard(parts[0], 'wlan*'));
let is_wifi_iface = (length(parts) == 2 && wildcard(parts[0], 'phy*'));
if (!is_wifi_iface)
is_wifi_iface = (length(parts) == 2 && wildcard(parts[0], 'wlan*'));
if (vlan_refcount[vlan_id] > 1 && !is_wifi_iface)
return;
@@ -588,8 +591,13 @@ function listener_cb(event, payload) {
function nl_cb(msg) {
let mac = msg.msg.mac;
let sinfo = msg.msg.sta_info;
let dev = msg.msg.dev;
let hapd = hostapd[dev];
let payload = {
client: mac,
bssid: hapd?.bssid || '',
ssid: hapd?.ssid || '',
tx_bytes: sinfo.tx_bytes64,
rx_bytes: sinfo.rx_bytes64,
tx_packets: sinfo.tx_packets,

View File

@@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema
PKG_RELEASE:=1
PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git
PKG_MIRROR_HASH:=7eac2e19363e3810b0980afd0ae9ce63e11b7da0f5ccff5ff6b3c8c0e2c07a3e
PKG_MIRROR_HASH:=ac2a5b026cfc0cdc893cf2ed8dd5aff31c5c56feaffa6bf3489d5c260f2ed724
PKG_SOURCE_PROTO:=git
PKG_SOURCE_DATE:=2025-12-05
PKG_SOURCE_VERSION:=384eba5c0ecfe9ec0b09864752c3516937aec9db
PKG_SOURCE_DATE:=2026-01-24
PKG_SOURCE_VERSION:=8491119c93f7d94dc8940f1b76619a134f22c5a5
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
PKG_LICENSE:=BSD-3-Clause

View File

@@ -0,0 +1,28 @@
From 9af6661616c5428509dac11357fbc54e9365db57 Mon Sep 17 00:00:00 2001
From: Venkat Chimata <venkat@nearhop.com>
Date: Mon, 9 Feb 2026 23:57:59 +0530
Subject: [PATCH] Change `basename` to use the global `count` instead of
per_band_counters[phy.band[0]]
This will keep the basename in sync with that of captive portal logic.
Signed-off-by: Venkat Chimata <venkat@nearhop.com>
---
renderer/templates/interface/ssid.uc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/renderer/templates/interface/ssid.uc b/renderer/templates/interface/ssid.uc
index bd70e6a2..c1c81baf 100644
--- a/renderer/templates/interface/ssid.uc
+++ b/renderer/templates/interface/ssid.uc
@@ -365,8 +365,8 @@
# Wireless configuration
{% for (let n, phy in phys): %}
{% let band_index = get_radio_index(phy.band[0]); %}
-{% let basename = name + '_' + per_band_counters[phy.band[0]]; %}
-{% let ssidname = basename + '_' + band_index + '_' + per_band_counters[phy.band[0]]; %}
+{% let basename = name + '_' + count; %}
+{% let ssidname = name + '_' + per_band_counters[phy.band[0]] + '_' + band_index + '_' + per_band_counters[phy.band[0]]; %}
{% let section = (owe ? 'o' : '' ) + ssidname; %}
{% let id = wiphy.allocate_ssid_section_id(phy) %}
{% let band = match_band(phy); %}

View File

@@ -1,27 +0,0 @@
From 9afc63f356f10942f924aaa6361f314f06727495 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
Date: Mon, 21 Jul 2025 13:27:07 +0200
Subject: [PATCH] include/download.mk: switch to using git:// instead of
https://
Signed-off-by: John Crispin <john@phrozen.org>
---
include/download.mk | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/download.mk b/include/download.mk
index 9ab0b6c08f..430bd89307 100644
--- a/include/download.mk
+++ b/include/download.mk
@@ -3,7 +3,7 @@
# Copyright (C) 2006-2012 OpenWrt.org
# Copyright (C) 2016 LEDE project
-PROJECT_GIT = https://git.openwrt.org
+PROJECT_GIT = git://git.openwrt.org
OPENWRT_GIT = $(PROJECT_GIT)
LEDE_GIT = $(PROJECT_GIT)
--
2.34.1

View File

@@ -0,0 +1,16 @@
---
profile: asterfusion_ap7330
target: ipq53xx
subtarget: generic
description: Build image for the asterfusion ap7330
image: bin/targets/ipq53xx/generic/openwrt-ipq53xx-asterfusion_ap7330-squashfs-sysupgrade.tar
feeds:
- name: qca
path: ../../feeds/qca-wifi-7
include:
- ucentral-ap
packages:
- ipq53xx
- qca-ssdk-shell
diffconfig: |
CONFIG_KERNEL_IPQ_MEM_PROFILE=0

View File

@@ -18,3 +18,4 @@ packages:
- kmod-cig-poe-judgment
diffconfig: |
CONFIG_KERNEL_IPQ_MEM_PROFILE=0
CONFIG_PACKAGE_ATH_DEBUG=y

View File

@@ -17,3 +17,4 @@ packages:
- kmod-cig-poe-judgment
diffconfig: |
CONFIG_KERNEL_IPQ_MEM_PROFILE=0
CONFIG_PACKAGE_ATH_DEBUG=y

View File

@@ -17,3 +17,4 @@ packages:
- kmod-cig-poe-judgment
diffconfig: |
CONFIG_KERNEL_IPQ_MEM_PROFILE=0
CONFIG_PACKAGE_ATH_DEBUG=y

View File

@@ -27,3 +27,4 @@ diffconfig: |
CONFIG_KERNEL_IPQ_MEM_PROFILE=0
CONFIG_BUSYBOX_CUSTOM=y
CONFIG_BUSYBOX_CONFIG_STTY=y
CONFIG_PACKAGE_ATH_DEBUG=y

View File

@@ -6,3 +6,4 @@ description: Build image for the Sonicfi EAP RAP63XC-211G
image: bin/targets/ramips/mt7621/openwrt-ramips-mt7621-sonicfi_rap63xc-211g-squashfs-sysupgrade.bin
include:
- ucentral-ap
- hostapd