REPEATER (multi-vif STA+AP) regression on rel_1_17_8

Identical MM8108 EKH01 hardware, identical kernel (5.15.189) + driver (kmod-morse 5.15.189+rel_1_17_8_2026_Mar_24-1), identical FT-SAE configuration.

  • Single wifi-iface mode=sta → associates to upstream AP successfully (-49 dBm, ~500 ms handshake, stable for hours).
  • Two wifi-iface on the same radio (mode=sta + mode=ap, our “REPEATER”) → supplicant stuck in wpa_state=SCANNING, morse_cmd_set_channel fails with rc -32768, and morse_mac_config_ps [vif:1] fails with ret:-19.

Same SSID, same PSK, same sae_pwe=0, same ieee80211w=2, same mobility_domain=a1b2, same r0kh/r1kh. The only differentiator is multi-vif vs single-vif on the same radio.

This configuration used to work on the previous build (5.15.167 + rel_1_16_4_2025_Sep_18). After the OpenWrt 23.05.5 → 23.05.6 upgrade pulled in rel_1_17_8, REPEATER stopped associating.

Question

  1. Is the multi-vif (mode=sta + mode=ap on a single radio) regression on rel_1_17_8 a known issue?
  2. Is there a recommended uci / hostapd / wpa_supplicant configuration we should add for multi-vif on rel_1_17_8?
  3. Is there a fixed driver release we can pull from your OpenWrt feed, or a build flag we should change?

Hardware & Software

  • Board: MM8108 EKH01, aarch64.
  • OS: OpenWrt 23.05.6 (r0+24540-2916bcda3f).
  • Kernel: 5.15.189.
  • Driver: kmod-morse 5.15.189+rel_1_17_8_2026_Mar_24-1.
  • hostapd / wpa_supplicant: vendor-built hostapd_s1g / wpa_supplicant_s1g, both 2.12-morse-rel_1_17_8.
  • bcf: stock EKH01 (no _ext blob; EKH01 vs HL2 distinction).
  • Radio: 8 MHz HaLow, US country, CH_12 (908 MHz HaLow / 5250 MHz mapped).
  • Auth: WPA3-Personal SAE + 802.11r FT-SAE (per your 2026-06 recipe), sae_pwe=0, ieee80211w=2, mobility_domain=a1b2.

Direct comparison — two identical EKH01 boards, identical driver

Board A (.203) - mode = single wifi-iface mode=sta:
  - kmod-morse 5.15.189+rel_1_17_8_2026_Mar_24-1
  - Wireless config: ONE wifi-iface, mode=sta, encryption=sae,
    key_mgmt=SAE (FT-SAE advertised by AP, supplicant falls back to SAE)
  - Result: associated to upstream AP at -49 dBm, sae handshake ~500 ms,
    link stable indefinitely.

Board B (.201) - mode = multi-vif (REPEATER) on same radio:
  - kmod-morse 5.15.189+rel_1_17_8_2026_Mar_24-1   (IDENTICAL to .203)
  - Wireless config: TWO wifi-iface entries on radio0:
      * repeater_uplink (mode=sta, wds=1)
      * repeater_downlink (mode=ap, wds=1, ieee80211r=1 ...)
  - Result: supplicant stuck in wpa_state=SCANNING; auth/assoc never
    initiated; dmesg shows driver-level command failures.

Failure-mode logs from Board B (.201, REPEATER)

dmesg

[ 3041.370077] morse_sdio mmc1:0001:2: Command morse_cmd_set_channel 01:710 failed with rc -32768 (0xffff8000)
[ 3041.379835] morse_sdio mmc1:0001:2: morse_mac_set_channel (morse_mac_change_channel): morse_cmd_set_channel() failed, ret -32768

[ 3060.306348] morse_sdio mmc1:0001:2: Command morse_cmd_set_ps 16:580 failed with rc -19 (0xffffffed)
[ 3060.315432] morse_sdio mmc1:0001:2: morse_mac_config_ps: [vif:1] failed (ret:-19)

[ 3165.012063] morse_sdio mmc1:0001:2: Command morse_cmd_set_ps 16:570 failed with rc -19 (0xffffffed)
[ 3165.021118] morse_sdio mmc1:0001:2: morse_mac_config_ps: [vif:1] failed (ret:-19)

-32768 (0xffff8000) from morse_cmd_set_channel, plus -19 = -ENODEV from morse_cmd_set_ps against [vif:1], only ever fire when the second virtual interface on the same radio is being brought up. Single-iface configurations never reach this code path.

logread (supplicant)

wpa_supplicant_s1g[19538]: wlan0: Failed to initiate sched scan
wpa_supplicant_s1g[19538]: wlan0: Reject scan trigger since one is already pending
wpa_supplicant_s1g[19538]: wlan0: Failed to initiate AP scan
wpa_supplicant_s1g[19538]: wlan0: Reject scan trigger since one is already pending

# wpa_cli wlan0 status returns indefinitely:
wpa_state=SCANNING

Hostapd config (downlink iface) — generated by netifd

ssid=g7-AP
channel=12
wpa=2
wpa_key_mgmt=SAE FT-SAE
ieee80211w=2
sae_pwe=0
mobility_domain=a1b2
ft_psk_generate_local=0
reassociation_deadline=20000
r1_key_holder=0cbf74001f05
nas_identifier=0cbf74001f05
r0_key_lifetime=10000
pmk_r1_push=0
r0kh=ff:ff:ff:ff:ff:ff * a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
r1kh=00:00:00:00:00:00 00:00:00:00:00:00 a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

Supplicant config (uplink STA iface, same wireless block)

country=US
ctrl_interface=/var/run/wpa_supplicant_s1g
sae_pwe=0

network={
    scan_ssid=1
    ssid="g7-AP"
    key_mgmt=SAE
    sae_password="...32-char PSK..."
    pairwise=CCMP
    proto=RSN
    ieee80211w=2
    bssid=50:2e:91:d2:ce:54
}

uci wireless — multi-vif REPEATER

wireless.radio0=wifi-device
    type='morse'
    band='s1g'
    hwmode='11ah'
    country='US'
    channel='12'

wireless.repeater_uplink=wifi-iface
    device='radio0'
    mode='sta'
    network='lan'
    wds='1'
    ssid='g7-AP'
    encryption='sae'
    key='...'
    bssid='50:2e:91:d2:ce:54'

wireless.repeater_downlink=wifi-iface
    device='radio0'
    mode='ap'
    network='lan'
    wds='1'
    ssid='g7-AP'
    encryption='sae'
    key='...'
    ieee80211r='1'
    mobility_domain='a1b2'
    sae_pwe='0'
    ft_psk_generate_local='0'
    r1_key_holder='0cbf74001f05'
    nasid='0cbf74001f05'
    r0_key_lifetime='10000'
    pmk_r1_push='0'
    list r0kh 'ff:ff:ff:ff:ff:ff,*,a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6'
    list r1kh '00:00:00:00:00:00,00:00:00:00:00:00,a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6'

Success-case logs from Board A (.203, STA single-iface)

iw dev wlan0 link

Connected to 50:2e:91:d2:c6:59 (on wlan0)
    SSID: g7-AP
    freq: 5560
    signal: -49 dBm
    rx bitrate: 702.0 MBit/s VHT-MCS 8 160MHz VHT-NSS 1
    tx bitrate: 866.7 MBit/s VHT-MCS 9 160MHz short GI VHT-NSS 1
    bss flags:  short-slot-time
    dtim period:    2
    beacon int: 100

Supplicant config (.203)

country=US
sae_pwe=0

network={
    scan_ssid=1
    ssid="g7-AP"
    key_mgmt=SAE FT-SAE         ← FT-SAE NEGOTIATED (because single iface
                                   network block also has mobility_domain
                                   pre-set; netifd writes both key_mgmt
                                   options when ieee80211r is implied)
    sae_password="...same PSK..."
    ieee80211w=2
}

What we have tried

  1. Same FT-SAE recipe (your 2026-06 reply) on both boards — verified in the auto-generated hostapd / supplicant configs.
  2. Both mobility_domain=a1b2, ieee80211w=2, sae_pwe=0, ft_psk_generate_local=0 — propagating into the actual on-disk configs (not just uci).
  3. r0kh / r1kh wildcard entries with comma-separated field format so netifd correctly emits them as r0kh=ff:ff:ff:ff:ff:ff * <key>.
  4. Identical PSK across all APs and STAs.
  5. wifi down + wifi up to force a full re-init — same failure pattern reproduces every time.

What changed since this worked

  • OS upgrade pulled OpenWrt 23.05.6 and kmod-morse rel_1_17_8_2026_Mar_24 in place of the previously-working OpenWrt 23.05.5 / kmod-morse rel_1_16_4_2025_Sep_18.
  • Configuration delta is minimal (we already had multi-vif REPEATER working before the upgrade).

What we need from you

  • Confirmation whether multi-vif (mode=sta + mode=ap on the same radio) is still a supported configuration on the current driver/firmware build.
  • If yes — the missing config option / build flag / netlink call we are missing on rel_1_17_8 that was implicit on rel_1_16_4.
  • If no — what is the recommended path for STA+AP coexistence on a single HaLow radio going forward (separate wlan0.staN virtual interface? A different bcf? morse_cli command we should issue before bringing the second VIF up?).

I’d love to capture a Sniffer trace to compare working vs broken associate sequences but the STA never gets past wpa_state=SCANNING, so there’s nothing on the air from the STA side to capture — the failure is in the driver→firmware command (morse_cmd_set_channel) before any frame is transmitted. Happy to capture a sniffer trace from an external HaLow monitor if it would still help.

Thanks,

Best regards, Asaf Tvito Senior RT Embedded Software Engineer Mobile: +972-52-2564597 Email: Asaf.Tvito@RTDevSoft.com

Hi,

It looks like you’re using our official image of Morse Openwrt 2.11.12. We test AP+STA extensively as part of EasyMesh/prplmesh testing, so we wouldn’t expect an issue with this setup.

One of the changes that we’ve made in our 2.11 release - see Commits · MorseMicro/openwrt · GitHub for the source - is that the AP shouldn’t come up until the STA associates. This is to ensure that the AP comes up on the correct channel and the STA can scan. It looks like this might not be happening in your case.

What would help diagnose would be if you go to the support page in the UI and download the archive, or use the /morse/scripts/mm_dumps.sh script, and attach the generated archive. This will capture all relevant logs and configs, but leave out wifi passwords etc.

Also, for future reference, if you’re using a normal build on our tree, you can do /morse/scripts/versions.sh to report the relevant versions.

Hi Morse Support team,

Thank you for the previous reply pointing us to the STA-first principle and
the diagnostic scripts. We’ve implemented the recommended behavior, ran both
/morse/scripts/versions.sh and /morse/scripts/mm_dumps.sh, and applied
several additional fixes. The link still fails. Detailed diagnosis below.

Perhaps you forgot to attach the tarball?

[Morse Micro Community] [Software/Linux] REPEATER (multi-vif STA+AP) regression on rel_1_17_8

Asaf Tvito

​Morse Micro Community​

Subject: Re: REPEATER (multi-vif STA+AP) regression on rel_1_17_8 — STA-first applied, additional fixes attempted, still failing

Hi Morse Support team,

Thank you for the previous reply pointing us to the STA-first principle and

the diagnostic scripts. We’ve implemented the recommended behavior, ran both

/morse/scripts/versions.sh and /morse/scripts/mm_dumps.sh, and applied

several additional fixes. The link still fails. Detailed diagnosis below.

=================================================================

ENVIRONMENT

=================================================================

Output of /morse/scripts/versions.sh on the REPEATER (.201):

  • Firmware = rel_1_17_8_2026_Mar_24

  • Morse Driver = 0-rel_1_17_8_2026_Mar_24

  • Dot11ah Driver = 0-rel_1_17_8_2026_Mar_24

  • morse_cli = rel_1_17_8_2026_Mar_24

  • Morsectrl = rel_1_17_8_2026_Mar_24

  • Hostapd = 2.12-morse_micro-rel_1_17_8_2026_Mar_24

  • WPA_Supplicant = 2.12-morse_micro-rel_1_17_8_2026_Mar_24

  • OpenWRT = Morse-2.11.12

  • Chip = MM8108B2

Topology:

.201 = EKH01 REPEATER (multi-vif: STA uplink + AP downlink, single radio)

.200 = HALOWLINK2 router (g7-AP, CH_28, 8 MHz, SAE)

.202 = HALOWLINK2 router (g7-AP, CH_28, 8 MHz, SAE)

.203 = EKH01 STA (downstream client of .201)

The mm_dumps.sh archive is attached separately.

=================================================================

WHAT WE IMPLEMENTED FOLLOWING YOUR GUIDANCE

=================================================================

Per your reply (“the AP shouldn’t come up until the STA associates”),

we explicitly orchestrate STA-first sequencing in our REPEATER bring-up:

1. uci config: STA + AP both defined, but AP has option disabled=‘1’

2. wifi up — only STA iface created (wlan0)

3. wpa_cli_s1g reconfigure + select_network + reassociate (5 retries)

4. Wait for `iw dev wlan0 link` to report “Connected to ”

5. uci set repeater_downlink.disabled=‘0’

6. wifi reload — adds AP iface

7. After reload: wlan1 = STA (managed), wlan0 = AP (roles swapped)

In addition we applied:

  • sae_pwe=2 on both supplicant and hostapd_s1g configs

    (without this, HALOWLINK2 rejects auth with status_code=1; we observe

    the Morse supplicant emits an h2e-style SAE commit even when uci says

    sae_pwe=0)

  • rmmod morse + insmod morse.ko with all three PS knobs disabled at

    module load:

    enable_ps=0

    enable_dynamic_ps_offload=0

    enable_pre_assoc_ps=0

    Writing these to /sys/module/morse/parameters/* at runtime had NO

    effect — the driver continued to issue `morse_cmd_set_ps` and got

    rc=-19. With the insmod-time parameters those PS commands no longer

    appear, confirming the runtime sysfs values are not honoured by the

    driver after load.

=================================================================

CURRENT FAILURE MODE

=================================================================

Sequence on the REPEATER (.201) after the new code path:

[11:09:51] morse driver reloaded with enable_ps=0 enable_dynamic_ps_offload=0

         enable_pre_assoc_ps=0 (insmod rc=OK)

[11:10:09] Pre-scan finds .202 (-43 dBm CH_28) and .200 (-55 dBm CH_28)

[11:10:21] REPEATER simple: reassoc attempt 1/5

[11:10:24] REPEATER simple: associated on wlan0 (attempt 1)

[11:10:32] STA iface moved wlan0 → wlan1 after wifi reload

         downlink AP + STA both up after wifi reload (STA-first sequence)

[11:10:32] State: HALOW_READY - Monitoring HaLow link

[11:10:32] link-loss suspected (1/10) - debouncing ← LINK DIES IMMEDIATELY

[11:10:42] REPEATER uplink down

After this, the supplicant retries authentication every ~9-20 seconds.

Every single attempt fails with “authentication timed out” — no auth

response received from the AP. wpa_state=SCANNING.

Kernel log (dmesg) excerpt from .201 during the retry loop:

[7836.192] wlan1: authenticate with 50:2e:91:d2:ce:54

[7836.208] wlan1: send auth to 50:2e:91:d2:ce:54 (try 1/3)

[7836.233] wlan1: send auth to 50:2e:91:d2:ce:54 (try 2/3)

[7836.305] wlan1: send auth to 50:2e:91:d2:ce:54 (try 3/3)

[7836.329] wlan1: authentication with 50:2e:91:d2:ce:54 timed out

[7844.982] wlan1: authenticate with 50:2e:91:d2:ce:54

…same pattern repeats every ~9-20 s…

Notably ABSENT from dmesg after the insmod-time PS disable:

  • morse_cmd_set_ps failed -19 (was firing constantly before)

  • morse_mac_config_ps [vif:1] failed (was firing constantly before)

  • morse_cmd_set_channel failed -32768 (was firing during PS cascade)

So PS-related errors are gone. But auth frames now fail silently with

timeout — implying the radio still cannot complete an 802.11 exchange

in multi-vif STA+AP mode on the same radio.

=================================================================

WHAT INITIAL ASSOCIATION LOOKS LIKE

=================================================================

The initial reassoc (when only STA is up, AP still disabled in uci)

succeeds reliably:

[11:10:21] reassoc attempt 1/5

[11:10:24] associated on wlan0 (attempt 1, net_id=1) ← 3 seconds, success

After we enable the AP via uci+wifi reload, both ifaces are present

(“iw dev” shows wlan0 type AP + wlan1 type managed on the same phy)

but the STA link breaks within ~10 seconds and cannot be re-established

afterwards (the timeouts above).

=================================================================

UCI WIRELESS CONFIG AT THE TIME OF FAILURE

=================================================================

(abbreviated — full /etc/config/wireless in the mm_dumps archive)

wireless.radio0.type=‘morse’

wireless.radio0.band=‘s1g’

wireless.radio0.hwmode=‘11ah’

wireless.radio0.country=‘US’

wireless.radio0.channel=‘28’

wireless.radio0.htmode=‘HE8’

wireless.radio0.s1g_chanbw=‘8’

wireless.radio0.op_class=‘4’

wireless.repeater_downlink=wifi-iface

wireless.repeater_downlink.device=‘radio0’

wireless.repeater_downlink.mode=‘ap’

wireless.repeater_downlink.network=‘lan’

wireless.repeater_downlink.ssid=‘g7-AP’

wireless.repeater_downlink.encryption=‘sae’

wireless.repeater_downlink.sae_pwe=‘2’

wireless.repeater_downlink.disabled=‘0’

wireless.repeater_downlink.ieee80211r=‘1’ (FT enabled)

wireless.repeater_downlink.mobility_domain=‘a1b2’

wireless.repeater_downlink.bss_transition=‘1’ (802.11v)

wireless.repeater_downlink.rrm_neighbor_report=‘1’ (802.11k)

wireless.repeater_uplink=wifi-iface

wireless.repeater_uplink.device=‘radio0’

wireless.repeater_uplink.mode=‘sta’

wireless.repeater_uplink.network=‘ahwlan’

wireless.repeater_uplink.ssid=‘g7-AP’

wireless.repeater_uplink.encryption=‘sae’

wireless.repeater_uplink.sae_pwe=‘2’

wireless.repeater_uplink.bssid=‘50:2e:91:d2:ce:54’

wireless.repeater_uplink.scan_freq=‘5570’ (CH_28 mapped freq)

=================================================================

QUESTIONS

=================================================================

1. Is there a netifd-morse / mac80211 config option we are missing

 that gates the AP bring-up on STA association? We implemented this

 explicitly in user-space because we did not see the behaviour

 surface automatically in morse-feed main netifd-morse/lib/netifd/

 wireless/morse.sh — that script processes "ap sta ..." in order

 with no explicit wait. Is the EasyMesh / prplmesh test setup using

 a different orchestration path?

2. Why does auth time out post-AP-enable? We disabled all three PS

 knobs at insmod time. Are there other module parameters that need

 to be set for multi-vif on this build (e.g. virtual_sta_max,

 enable_dynamic_ps_offload, enable_mac80211_connection_monitor)?

3. Should we be using a different `op_class` for multi-vif? We use

 op_class=4 (US 8 MHz). The radio comes up correctly with this

 when only STA is configured, but multi-vif fails reliably.

4. Do you have a working /etc/config/wireless example for a

 concurrent STA+AP REPEATER on MM8108 rel_1_17_8 we could diff

 against ours?

Happy to provide additional dumps, packet captures, or kernel debug

logs as needed. Thanks for your help.

Asaf

Subject: Re: REPEATER (multi-vif STA+AP) on rel_1_17_8 — mm_dumps attached

Hi,

Apologies — yes, the mm_dumps tarball was missing. Attached now from a
fresh REPEATER run on .201 (EKH01, Morse-2.11.12, kmod-morse rel_1_17_8_2026_Mar_24):

mm_dumps_2026-06-18_repeater_201.tar.gz

Since the previous email, here’s the narrowed-down picture:

:white_check_mark: STA uplink alone — works perfectly (3 s association, stable).
:white_check_mark: STA-first orchestration — we split bring-up into two states:
HALOW_ASSOCIATE (STA scan + connect, reusing the proven STA path)
HALOW_REPEATER_ENABLE_AP (add downlink AP after STA is associated)
:white_check_mark: rmmod morse + insmod with enable_ps=0,
enable_dynamic_ps_offload=0, enable_pre_assoc_ps=0
eliminates morse_cmd_set_ps [vif:1] failed -19.

:cross_mark: The remaining failure is repeatable and reproducible:
• STA associates cleanly to upstream (single-vif).
• We add the downlink wifi-iface (disabled=0 → wifi reload).
• Within ~30 ms after wifi reload returns, the STA goes
“Not connected” — netifd has restarted the supplicant and the
fresh auth attempts time out with
wlan1: authentication with <upstream> timed out
(no AssocResp ever observed in dmesg for these retries).
• Downstream STAs CANNOT associate to the downlink AP even when
it briefly comes up. We see in hostapd_s1g logs:
wlan0: STA 0c:bf:74:00:1e:ee IEEE 802.11: did not acknowledge authentication response
repeated for every downstream-STA auth attempt — the AP sends
the auth response, no ACK ever returns. The downstream STA’s
own scan shows wlan_ap with no SSID/channel (“type AP” but
beacon parameters never got applied because hostapd_s1g
silently failed to set them).
• The whole cycle then repeats — Manager tears AP, re-associates
STA, re-enables AP, STA dies, etc.

We’ve also tried:
• Manual iw phy phyN interface add wlan_ap type __ap +
hand-built hostapd_s1g.conf to bypass wifi reload.
→ hostapd starts, then fails with
nl80211: kernel reports: Match already configured
and Failed to set beacon parameters — the iface exists in
iw dev (type AP) but has no ssid/channel; downstream STAs
still see no beacons.
start_disabled=1 on the downlink wifi-iface +
hostapd_cli_s1g enable wlan0 after STA assoc.
→ driver still rejects STA auth once the second vif exists.

Your community thread #1746 mentioned netifd-morse delays AP bring-up
until the STA associates. Reading
/lib/netifd/wireless/morse.sh on the device, I see
for_each_interface "ap sta adhoc mesh none monitor" morse_iface_bringup
which processes AP first and does not wait on STA assoc explicitly.
Is the wait actually orchestrated by the prplmesh agent (which we
have installed but not enabled), rather than by netifd-morse itself?

Questions:

  1. Is multi-vif STA+AP on a single radio supposed to work in
    “morse” backend alone (without prplmesh), or is prplmesh
    required for the STA-first sequencing?
  2. Are there other module parameters or uci options we should
    try (we’ve tested enable_ps, enable_dynamic_ps_offload,
    enable_pre_assoc_ps, start_disabled, sae_pwe=2)?
  3. Do you have a known-good /etc/config/wireless example for
    concurrent STA+AP on MM8108 we could diff against ours?
  4. What we observe — STA auth timing out AND downstream STAs
    never getting an auth ACK from the AP — suggests the radio
    itself is wedged the moment both vifs exist. Is this a known
    issue on rel_1_17_8 with a documented workaround?

The tarball includes /etc/config/wireless, /var/run/wpa_supplicant-.conf,
/var/run/hostapd-
.conf, dmesg, logread, and the relevant
/sys/module/morse/parameters/* snapshot.

Thanks,