Silicon Labs Multiprotocol container does not start

Hi all,

I’ve been digging for a bit but can’t seem to get both Zigbee and the Open Thread Border Router working at the same time. I successfully flashed my Sonoff ZBDongle-E to the RCP firmware, which is then recognized correctly by the container. Settings are set to use device /dev/serial/by-id/usb-ITEAD_SONOFF_Zigbee_3.0_USB_Dongle_Plus_V2_20230505161412-if00 and 460800, software flow control and I disabled automatic flashing.

Seems like the otbr-agent is crashing due to [C] Platform------: platformBackboneInit() at backbone.cpp:62: Failure - but I really can’t find anything relating to what that might indicate.

-----------------------------------------------------------
 Add-on version: 2.3.0
 You are running the latest version of this add-on.
 System: Home Assistant OS 10.3  (amd64 / generic-x86-64)
 Home Assistant Core: 2023.8.0
 Home Assistant Supervisor: 2023.07.1
-----------------------------------------------------------
 Please, share the above information when looking for help
 or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service banner successfully started
s6-rc: info: service universal-silabs-flasher: starting
[10:14:09] INFO: Flashing firmware is disabled
s6-rc: info: service universal-silabs-flasher successfully started
s6-rc: info: service cpcd-config: starting
[10:14:10] INFO: Generating cpcd configuration.
s6-rc: info: service cpcd-config successfully started
s6-rc: info: service cpcd: starting
[10:14:10] INFO: Starting cpcd...
WARNING in function 'main' in file /usr/src/cpc-daemon/main.c at line #186 : Running CPCd as 'root' is not recommended. Proceed at your own risk.
s6-rc: info: service cpcd successfully started
s6-rc: info: service zigbeed: starting
s6-rc: info: service otbr-agent: starting
s6-rc: info: service zigbeed successfully started
[10:14:11] INFO: Starting zigbeed...
[10:14:11] WARNING: No primary network interface found! Using static eth0.
[10:14:11] INFO: Setup OTBR firewall...
[10:14:11] INFO: Starting otbr-agent...
otbr-agent[302]: [NOTE]-AGENT---: Running 0.3.0
otbr-agent[302]: [NOTE]-AGENT---: Thread version: 1.3.0
otbr-agent[302]: [NOTE]-AGENT---: Thread interface: wpan0
otbr-agent[302]: [NOTE]-AGENT---: Radio URL: spinel+cpc://cpcd_0?iid=2
otbr-agent[302]: [NOTE]-ILS-----: Infra link selected: eth0
otbr-agent[302]: 57d.16:31:22.411 [C] Platform------: mCpcBusSpeed = 115200
[10:14:10:695019] Info : [CPCd v4.3.0.0] [Library API v3] [RCP Protocol v4]
[10:14:10:695148] Info : Git commit: 5264ecaef094c48b94f501b71edff4caaadb4545 / branch: 
[10:14:10:695151] Info : Sources hash: d0b1e4d46195ed78ab5fccd6b1dd93f77d56dafcd09d1613ec1806014d40d496
[10:14:10:695154] WARNING : In function 'main' in file /usr/src/cpc-daemon/main.c at line #186 : Running CPCd as 'root' is not recommended. Proceed at your own risk.
[10:14:10:695815] Info : Reading cli arguments
[10:14:10:695841] Info : /usr/local/bin/cpcd 
[10:14:10:696784] Info : Reading configuration
[10:14:10:696801] Info :   file_path = /usr/local/etc/cpcd.conf
[10:14:10:696803] Info :   instance_name = cpcd_0
[10:14:10:696804] Info :   socket_folder = /dev/shm
[10:14:10:696805] Info :   operation_mode = MODE_NORMAL
[10:14:10:696806] Info :   use_encryption = false
[10:14:10:696807] Info :   binding_key_file = /etc/binding-key.key
[10:14:10:696808] Info :   stdout_tracing = false
[10:14:10:696809] Info :   file_tracing = false
[10:14:10:696810] Info :   lttng_tracing = false
[10:14:10:696811] Info :   enable_frame_trace = false
[10:14:10:696812] Info :   traces_folder = /dev/shm/cpcd-traces
[10:14:10:696813] Info :   bus = UART
[10:14:10:696814] Info :   uart_baudrate = 460800
[10:14:10:696816] Info :   uart_hardflow = false
[10:14:10:696817] Info :   uart_file = /dev/ttyACM0
[10:14:10:696818] Info :   fu_recovery_pins_enabled = false
[10:14:10:696819] Info :   fu_connect_to_bootloader = false
[10:14:10:696820] Info :   fu_enter_bootloader = false
[10:14:10:696821] Info :   restart_cpcd = false
[10:14:10:696822] Info :   application_version_validation = false
[10:14:10:696823] Info :   print_secondary_versions_and_exit = false
[10:14:10:696824] Info :   use_noop_keep_alive = false
[10:14:10:696825] Info :   reset_sequence = true
[10:14:10:696826] Info :   stats_interval = 0
[10:14:10:696828] Info :   rlimit_nofile = 2000
[10:14:10:696829] Info : ENCRYPTION IS DISABLED 
[10:14:10:696831] Info : Starting daemon in normal mode
[10:14:10:708483] Info : Connecting to Secondary...
[10:14:10:783840] Info : RX capability is 256 bytes
[10:14:10:784118] Info : Connected to Secondary
[10:14:10:786026] Info : Secondary Protocol v4
[10:14:10:790036] Info : Secondary CPC v4.3.1
[10:14:10:791946] Info : Secondary bus bitrate is 460800
[10:14:10:795874] Info : Secondary APP vUNDEFINED
[10:14:10:796145] Info : Daemon startup was successful. Waiting for client connections
[10:14:11:623939] Info : New client connection using library v4.3.0.0
[10:14:11:625927] Info : Opened connection socket for ep#12
[10:14:11:626003] Info : Endpoint socket #12: Client connected. 1 connections
[10:14:12:240776] Info : New client connection using library v4.3.0.0
[10:14:12:243842] Info : Endpoint socket #12: Client connected. 2 connections
otbr-agent[302]: 57d.16:31:24.496 [C] Platform------: platformBackboneInit() at backbone.cpp:62: Failure
[10:14:13] INFO: otbr-agent ended with exit code 1 (signal 0)...
OTBR_FORWARD_INGRESS  all opt    in * out wpan0  ::/0  -> ::/0  
Chain OTBR_FORWARD_INGRESS (0 references)
target     prot opt source               destination         
DROP       all      anywhere             anywhere             PKTTYPE = unicast
DROP       all      anywhere             anywhere             match-set otbr-ingress-deny-src src
ACCEPT     all      anywhere             anywhere             match-set otbr-ingress-allow-dst dst
DROP       all      anywhere             anywhere             PKTTYPE = unicast
ACCEPT     all      anywhere             anywhere            
otbr-ingress-deny-src
otbr-ingress-deny-src-swap
otbr-ingress-allow-dst
otbr-ingress-allow-dst-swap
OTBR_FORWARD_EGRESS  all opt    in wpan0 out *  ::/0  -> ::/0  
Chain OTBR_FORWARD_EGRESS (0 references)
target     prot opt source               destination         
ACCEPT     all      anywhere             anywhere            
[10:14:13] INFO: OTBR firewall teardown completed.

After this message repeats all the time, indicating a crashloop of some sort:

[10:16:10] WARNING: No primary network interface found! Using static eth0.
[10:16:10] INFO: Setup OTBR firewall...
[10:16:10] INFO: Starting otbr-agent...
otbr-agent[3557]: [NOTE]-AGENT---: Running 0.3.0
otbr-agent[3557]: [NOTE]-AGENT---: Thread version: 1.3.0
otbr-agent[3557]: [NOTE]-AGENT---: Thread interface: wpan0
otbr-agent[3557]: [NOTE]-AGENT---: Radio URL: spinel+cpc://cpcd_0?iid=2
otbr-agent[3557]: [NOTE]-ILS-----: Infra link selected: eth0
otbr-agent[3557]: 57d.16:33:21.380 [C] Platform------: mCpcBusSpeed = 115200
[10:16:10:594490] Info : New client connection using library v4.3.0.0
[10:16:10:596963] Info : Endpoint socket #12: Client connected. 2 connections
otbr-agent[3557]: 57d.16:33:23.080 [C] Platform------: platformBackboneInit() at backbone.cpp:62: Failure
[10:16:12] INFO: otbr-agent ended with exit code 1 (signal 0)...
OTBR_FORWARD_INGRESS  all opt    in * out wpan0  ::/0  -> ::/0  
Chain OTBR_FORWARD_INGRESS (0 references)
target     prot opt source               destination         
DROP       all      anywhere             anywhere             PKTTYPE = unicast
DROP       all      anywhere             anywhere             match-set otbr-ingress-deny-src src
ACCEPT     all      anywhere             anywhere             match-set otbr-ingress-allow-dst dst
DROP       all      anywhere             anywhere             PKTTYPE = unicast
ACCEPT     all      anywhere             anywhere            
otbr-ingress-deny-src
otbr-ingress-deny-src-swap
otbr-ingress-allow-dst
otbr-ingress-allow-dst-swap
OTBR_FORWARD_EGRESS  all opt    in wpan0 out *  ::/0  -> ::/0  
Chain OTBR_FORWARD_EGRESS (0 references)
target     prot opt source               destination         
ACCEPT     all      anywhere             anywhere            
[10:16:12] INFO: OTBR firewall teardown completed.
[10:16:12:298284] Info : Endpoint socket #12: Client disconnected. 1 connections
[10:16:12:299027] Info : Client disconnected

When I disable the “Enable OpenThread Border Router” the Zigbee part works just as well as it did in dedicated ZHA mode - heck, I even managed to successfully restore the backup that was made (happy surprise).

[10:07:04] INFO: The otbr-agent is disabled.
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/check-cpcd-shm.sh
cont-init: info: /etc/cont-init.d/check-cpcd-shm.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service banner: starting
-----------------------------------------------------------
 Add-on: Silicon Labs Multiprotocol
 Zigbee and OpenThread multiprotocol add-on
-----------------------------------------------------------
 Add-on version: 2.3.0
 You are running the latest version of this add-on.
 System: Home Assistant OS 10.3  (amd64 / generic-x86-64)
 Home Assistant Core: 2023.8.0
 Home Assistant Supervisor: 2023.07.1
-----------------------------------------------------------
 Please, share the above information when looking for help
 or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service banner successfully started
s6-rc: info: service universal-silabs-flasher: starting
[10:07:06] INFO: Flashing firmware is disabled
s6-rc: info: service universal-silabs-flasher successfully started
s6-rc: info: service cpcd-config: starting
[10:07:07] INFO: Generating cpcd configuration.
s6-rc: info: service cpcd-config successfully started
s6-rc: info: service cpcd: starting
[10:07:07] INFO: Starting cpcd...
WARNING in function 'main' in file /usr/src/cpc-daemon/main.c at line #186 : Running CPCd as 'root' is not recommended. Proceed at your own risk.
s6-rc: info: service cpcd successfully started
s6-rc: info: service zigbeed: starting
s6-rc: info: service zigbeed successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
[10:07:08] INFO: Starting zigbeed...
[10:07:07:597725] Info : [CPCd v4.3.0.0] [Library API v3] [RCP Protocol v4]
[10:07:07:597853] Info : Git commit: 5264ecaef094c48b94f501b71edff4caaadb4545 / branch: 
[10:07:07:597856] Info : Sources hash: d0b1e4d46195ed78ab5fccd6b1dd93f77d56dafcd09d1613ec1806014d40d496
[10:07:07:597859] WARNING : In function 'main' in file /usr/src/cpc-daemon/main.c at line #186 : Running CPCd as 'root' is not recommended. Proceed at your own risk.
[10:07:07:598278] Info : Reading cli arguments
[10:07:07:598303] Info : /usr/local/bin/cpcd 
[10:07:07:599109] Info : Reading configuration
[10:07:07:599127] Info :   file_path = /usr/local/etc/cpcd.conf
[10:07:07:599128] Info :   instance_name = cpcd_0
[10:07:07:599130] Info :   socket_folder = /dev/shm
[10:07:07:599131] Info :   operation_mode = MODE_NORMAL
[10:07:07:599132] Info :   use_encryption = false
[10:07:07:599133] Info :   binding_key_file = /etc/binding-key.key
[10:07:07:599134] Info :   stdout_tracing = false
[10:07:07:599135] Info :   file_tracing = false
[10:07:07:599136] Info :   lttng_tracing = false
[10:07:07:599137] Info :   enable_frame_trace = false
[10:07:07:599138] Info :   traces_folder = /dev/shm/cpcd-traces
[10:07:07:599139] Info :   bus = UART
[10:07:07:599140] Info :   uart_baudrate = 460800
[10:07:07:599142] Info :   uart_hardflow = false
[10:07:07:599143] Info :   uart_file = /dev/ttyACM0
[10:07:07:599144] Info :   fu_recovery_pins_enabled = false
[10:07:07:599145] Info :   fu_connect_to_bootloader = false
[10:07:07:599146] Info :   fu_enter_bootloader = false
[10:07:07:599147] Info :   restart_cpcd = false
[10:07:07:599148] Info :   application_version_validation = false
[10:07:07:599149] Info :   print_secondary_versions_and_exit = false
[10:07:07:599150] Info :   use_noop_keep_alive = false
[10:07:07:599151] Info :   reset_sequence = true
[10:07:07:599153] Info :   stats_interval = 0
[10:07:07:599154] Info :   rlimit_nofile = 2000
[10:07:07:599155] Info : ENCRYPTION IS DISABLED 
[10:07:07:599157] Info : Starting daemon in normal mode
[10:07:07:610680] Info : Connecting to Secondary...
[10:07:07:685778] Info : RX capability is 256 bytes
[10:07:07:685818] Info : Connected to Secondary
[10:07:07:687717] Info : Secondary Protocol v4
[10:07:07:691521] Info : Secondary CPC v4.3.1
[10:07:07:693315] Info : Secondary bus bitrate is 460800
[10:07:07:697054] Info : Secondary APP vUNDEFINED
[10:07:07:697360] Info : Daemon startup was successful. Waiting for client connections
[10:07:09:139285] Info : New client connection using library v4.3.0.0
[10:07:09:143496] Info : Opened connection socket for ep#12
[10:07:09:143847] Info : Endpoint socket #12: Client connected. 1 connections
Listening on port 9999 for connection...
Accepting connection.
Accepted connection 7.

All suggestions are welcome - this is quite easily reproducible as well.

If I had to guess, I’d say this is the reason for the “platformBackboneInit() at backbone.cpp:62: Failure” as the “Backbone” is related to the Ethernet side of the OTBR.

As to why it can’t find a primary network interface, I don’t know, but I would guess its looking for a physical Ethernet interface on your Home Assistant and can’t find one.

Thanks for thinking along.

Actually, this device (MaxMini B1 Plus - Mini PCs - BMAX) is only connected via wired, not wireless (even disabled in EFI to save power). No virtualization layers on top, just pure HASS OS on the eMMC of the device.

joris@joris-ThinkPad:~$ ssh homeassistant.local
[email protected]'s password:

| |  | |                          /\           (_)   | |            | |
| |__| | ___  _ __ ___   ___     /  \   ___ ___ _ ___| |_ __ _ _ __ | |_
|  __  |/ _ \| '_ \ _ \ / _ \   / /\ \ / __/ __| / __| __/ _\ | '_ \| __|
| |  | | (_) | | | | | |  __/  / ____ \\__ \__ \ \__ \ || (_| | | | | |_
|_|  |_|\___/|_| |_| |_|\___| /_/    \_\___/___/_|___/\__\__,_|_| |_|\__|

Welcome to the Home Assistant command line.

System information
  IPv4 addresses for eno1:  192.168.50.134/24
  IPv6 addresses for eno1:  fe80::7fe4:82e8:cc6c:9d4c/64

  OS Version:               Home Assistant OS 10.4
  Home Assistant Core:      2023.8.0

  Home Assistant URL:       http://homeassistant.local:8123
  Observer URL:             http://homeassistant.local:4357

I think the issue is probably related to this:

[10:16:10] WARNING: No primary network interface found! Using static eth0.

The interface naming in my HASS installation is eno0 as the NIC is onboard. Since the addon_core_silabs_multiprotocol is using host networking it’s attached to the default network namespace, where there is no eth0, only eno1.

Ideally we’d have the otbr-agent looking for any eth *, * eno *, * ens * or em * type of pattern here. Do you happen to know the right place to file a bug for this?

edit: found the configuration file:

➜  ~ docker exec addon_core_silabs_multiprotocol cat  /etc/default/otbr-agent
# Default settings for otbr-agent. This file is sourced by systemd

# Options to pass to otbr-agent
OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyACM0 trel://eth0"
OTBR_NO_AUTO_ATTACH=0

It would be great if we could have (parts of) OTBR_AGENT_OPTS exposed as per the container variables for the silabs-multiprotocol container.

I would file it for the Add-On. Its possible that the problem lies upstream with the OTBR, but not sure.