Commit graph

26 commits

Author SHA1 Message Date
John Crispin
7fd71f2c74 unetmsg: notify subscribers when remote peer connection drops
When a remote peer's connection drops (device powered off, unetmsgd
crash, network failure), network_rx_cleanup_state silently removed
the remote publish/subscribe handles without notifying local
subscribers. This meant local clients had no way to detect that a
remote peer had disappeared.

Call handle_publish for each channel where a remote publish handle
is removed during connection cleanup, so local subscribers receive
the publisher change notification and can react accordingly.

Signed-off-by: John Crispin <john@phrozen.org>
2026-02-07 10:04:18 +01:00
Felix Fietkau
e0722d0ac4 unetmsg: only send publish notifications for remote publisher changes
handle_publish() notifies local subscribers about publisher state
changes. The publish/subscribe handler in network_socket_handle_request()
was calling it for both remote publish and subscribe changes, but
subscriber changes are not relevant to local subscribers.

Guard the handle_publish() calls with a msgtype == "publish" check,
matching the local client paths in unetmsgd-client.uc which already
have this guard.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-02-07 10:04:18 +01:00
Felix Fietkau
212040b5ca unetmsg: fix reconnect loop when RX authenticates before TX
When both peers connect simultaneously, the RX side can authenticate
before the TX handshake completes. network_check_auth() was sending a
ping on the unauthenticated TX channel, which gets rejected by the
remote's pre-auth handler as "Auth failed", killing the connection and
triggering an endless reconnect cycle.

Check chan.auth before interacting with the TX channel. If TX auth
hasn't completed yet, just schedule a reconnect timer - auth_data_cb
already handles state sync when TX auth completes.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-02-07 10:04:18 +01:00
Felix Fietkau
389a79d972 unetmsg: close all channels on network removal
network_close() only closed the listening socket without shutting down
established RX/TX connections. This left remote state in
core.remote_publish/core.remote_subscribe for hosts on the removed
network, causing stale entries in channel listings and failed routing
attempts.

Close all RX and TX channels before removing the network, which also
triggers remote state cleanup via network_rx_socket_close().

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-02-07 10:04:17 +01:00
Felix Fietkau
f09596f84f unetmsg: fix inverted condition in network_rx_socket_close()
The cleanup condition checked != instead of ==, inverting the logic.
This caused two problems:

When an authenticated RX connection disconnected, remote state for that
host was never cleaned up since the stored entry matched the one being
closed.

When a stale unauthenticated connection from a peer closed, any existing
authenticated connection from the same peer was incorrectly deleted and
its remote state wiped.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-02-07 10:04:17 +01:00
Felix Fietkau
3efcf444a1 unetmsg: fix publish notification timing around remote auth
When a remote peer's publish registrations arrive via RX before the
local TX connection is authenticated, handle_publish fires but the
subscriber can't reach the remote publisher yet since the TX channel
isn't ready.

Suppress publish notifications on the RX side when no authenticated TX
channel exists for the remote host. After TX authentication completes,
re-trigger handle_publish only for topics that the specific peer
publishes and that have local subscribers.

Signed-off-by: John Crispin <john@phrozen.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-02-07 10:04:17 +01:00
Felix Fietkau
a2368e0f69 unetmsg: fix stale network cleanup in unetd_network_update()
The condition checked !data.networks instead of !data.networks[name],
making it always false since data.networks was already validated earlier
in the function. Networks removed from unetd were never closed.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-02-07 10:04:17 +01:00
Felix Fietkau
bdc3c1a820 unetmsg: remove redundant socket close
channel.disconnect() already closes the fd via ubus_shutdown(),
so calling socket.close() afterwards is redundant and causes EBADF.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-01-05 12:43:40 +01:00
Felix Fietkau
8a304d051f unetmsg: add timeout for outgoing auth requests
Add a 10-second timeout for outgoing auth requests to prevent
connections from getting stuck when the remote peer goes silent
after the hello handshake but before responding to auth.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-01-05 12:43:40 +01:00
Felix Fietkau
f631d1576d unetmsg: add null check in TX disconnect callback
The network may be deleted before the disconnect callback fires.
Check for null to avoid crash when accessing net.tx_channels.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-01-05 12:43:40 +01:00
Felix Fietkau
e782341848 unetmsg: fix variable shadowing bug in network_rx_cleanup_state()
Some checks are pending
Build all core packages / Build all core packages for selected target (push) Waiting to run
The for-in loop variable 'name' was shadowing the function parameter,
causing remote subscription cleanup to fail when hosts disconnect.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-01-02 20:20:16 +01:00
Christian Marangi
afb83c8197
unetmsg: drop usage of AUTORELEASE
AUTORELEASE has been deprecated from a long time. Drop it and hardcode
the release following the current one present in the downloads
repository.

Link: https://github.com/openwrt/openwrt/pull/20586
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
2025-10-29 21:09:56 +01:00
Felix Fietkau
91a50b27bc unetmsg: make remote connection TCP timeout more aggressive
Some checks are pending
Build all core packages / Build all core packages for selected target (push) Waiting to run
It is meant for reliable network connections, so requests should fail
early if a node goes down.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-06-21 17:12:46 +02:00
Felix Fietkau
e29669dae1 unetmsg: set TCP timeout for outgoing connections
Avoid running into long timeouts

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-31 16:22:39 +02:00
Felix Fietkau
82cc7f56e3 unetmsg: fix host name in response messages
Some checks are pending
Build all core packages / Build all core packages for selected target (push) Waiting to run
Avoid using loop iterator variable when generating the closure

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-20 18:38:39 +02:00
Felix Fietkau
12f4814c41 unetmsg: add support for sending requests/messages to specific hosts
Makes it possible to implement unetmsg APIs for host control

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-20 18:38:39 +02:00
Felix Fietkau
f60bbfa23f unetmsg: list remotely published ids via ubus call
Some checks are pending
Build all core packages / Build all core packages for selected target (push) Waiting to run
Before this change, only locally published ids were listed

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-16 13:01:41 +02:00
Felix Fietkau
a242cfb4e1 unetmsg: return the request data when issuing async requests
Makes it possible to track and cancel requests

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-16 13:01:41 +02:00
Felix Fietkau
6e60ce007b unetmsg: clean up remote data when replacing the incoming connection
Ensure that pub/sub state is in sync

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-12 12:47:20 +02:00
Felix Fietkau
9bdbe24176 unetmsg: ping on tx channel after new incoming connection
Ensure that stale connections are timed out faster

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-12 12:47:20 +02:00
Felix Fietkau
929702fdc5 unetmsg: reconnect on loss of tx connection
Avoids half-connected broken state

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-12 12:47:20 +02:00
Felix Fietkau
41728acc77 unetmsg: fix reconnecting outgoing socket
Due to a typo, the rx channel was deleted after disconnect instead of tx.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-09 10:12:03 +02:00
Felix Fietkau
06f44f69b6 unetmsg: add subscriber update callback to notify about publish events
When services start publishing on a topic, this can be used to allow
subscribers to query them.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-05 13:57:08 +02:00
Felix Fietkau
6fcaf3d589 unetmsg: fix issuing requests without previously subscribing
Perform ACL check if not subscribed. Helps with one-shot requests.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-05-05 13:57:08 +02:00
Felix Fietkau
f8ed36f0d7 unetmsg: allow communication between hosts if no service is defined
Simplifies unet setup

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-04-11 13:02:31 +02:00
Felix Fietkau
77f8a70f65 unetmsg: add unet pub/sub message broker based on ubus
This service automatically establishes connections to any hosts that are members
of the same unet network, and allows publish/subscribe exchanges via ubus channels.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-03-17 13:17:52 +01:00