From 2406e53e8071885deb734078e91cf89a4c0daef7 Mon Sep 17 00:00:00 2001 From: jokken2 Date: Fri, 10 Apr 2026 17:04:18 +0200 Subject: [PATCH 1/2] fix: Don't always send to broadcast --- zephyr/subsys/bacnet_datalink/bip-init.c | 1 - 1 file changed, 1 deletion(-) diff --git a/zephyr/subsys/bacnet_datalink/bip-init.c b/zephyr/subsys/bacnet_datalink/bip-init.c index 79dc4d9..da18464 100644 --- a/zephyr/subsys/bacnet_datalink/bip-init.c +++ b/zephyr/subsys/bacnet_datalink/bip-init.c @@ -385,7 +385,6 @@ int bip_send_pdu( uint8_t *pdu, unsigned pdu_len) { - dest->net = BACNET_BROADCAST_NETWORK; return bvlc_send_pdu(dest, npdu_data, pdu, pdu_len); } From afb3293166e120be135ed0bbd1963d7ef913d505 Mon Sep 17 00:00:00 2001 From: jokken2 Date: Wed, 15 Apr 2026 14:42:52 +0200 Subject: [PATCH 2/2] fix(bacnet): Fixes to handle dynamic pport change and disable-enable. --- zephyr/subsys/bacnet_datalink/bip-init.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/zephyr/subsys/bacnet_datalink/bip-init.c b/zephyr/subsys/bacnet_datalink/bip-init.c index da18464..4cbb7a8 100644 --- a/zephyr/subsys/bacnet_datalink/bip-init.c +++ b/zephyr/subsys/bacnet_datalink/bip-init.c @@ -630,7 +630,14 @@ bool bip_init(char *ifname) int sock_fd; struct sockaddr_in sin = { 0 }; - bip_set_interface(ifname); + /* Only call bip_set_interface() if we don't have an address yet. + * On re-init after bip_cleanup() (port change / enable-disable cycle) + * BIP_Address is already populated from the initial DHCP assignment, so + * calling bip_set_interface() again would try to re-add a MANUAL address + * on top of the DHCP one and corrupt the interface netmask. */ + if (BIP_Address.s_addr == 0) { + bip_set_interface(ifname); + } if (BIP_Address.s_addr == 0) { LOG_ERR( @@ -679,13 +686,18 @@ void bip_cleanup(void) { LOG_DBG("bip_cleanup()"); - memset(&BIP_Address, 0, sizeof(BIP_Address)); - memset(&BIP_Broadcast_Addr, 0, sizeof(BIP_Broadcast_Addr)); - + /* Only close the sockets — preserve BIP_Address and BIP_Broadcast_Addr so + * that a subsequent bip_init() takes the static (non-blocking) path in + * bip_set_interface() instead of blocking on wait_for_net_event() again. */ if (BIP_Socket != -1) { zsock_close(BIP_Socket); } BIP_Socket = -1; + if (BIP_Broadcast_Socket != -1) { + zsock_close(BIP_Broadcast_Socket); + } + BIP_Broadcast_Socket = -1; + return; }