From 44d727c13b77cc01df7471e6c7e9c6be22579ad9 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Mon, 5 May 2025 21:46:01 -0500 Subject: [PATCH] Fixed network specific original broadcast for IP in apps/router. (#976) --- apps/router/ipmodule.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/router/ipmodule.c b/apps/router/ipmodule.c index 35aa974c..aba148d4 100644 --- a/apps/router/ipmodule.c +++ b/apps/router/ipmodule.c @@ -223,11 +223,25 @@ int dl_ip_send( data->buff[0] = BVLL_TYPE_BACNET_IP; bip_dest.sin_family = AF_INET; - if (dest->net == BACNET_BROADCAST_NETWORK) { + if ((dest->net == BACNET_BROADCAST_NETWORK) || (dest->mac_len == 0)) { /* broadcast */ bip_dest.sin_addr.s_addr = data->broadcast_addr.s_addr; bip_dest.sin_port = data->port; data->buff[1] = BVLC_ORIGINAL_BROADCAST_NPDU; + + } else if ((dest->net > 0) && (dest->len == 0)) { + /* net > 0 and net < 65535 are network specific broadcast if len = 0 */ + if (dest->mac_len == 6) { + /* network specific broadcast to address */ + memcpy(&bip_dest.sin_addr.s_addr, &dest->mac[0], 4); + memcpy(&bip_dest.sin_port, &dest->mac[4], 2); + data->buff[1] = BVLC_ORIGINAL_BROADCAST_NPDU; + } else { + /* broadcast */ + bip_dest.sin_addr.s_addr = data->broadcast_addr.s_addr; + bip_dest.sin_port = data->port; + data->buff[1] = BVLC_ORIGINAL_BROADCAST_NPDU; + } } else if (dest->mac_len == 6) { memcpy(&bip_dest.sin_addr.s_addr, &dest->mac[0], 4); memcpy(&bip_dest.sin_port, &dest->mac[4], 2); @@ -236,7 +250,6 @@ int dl_ip_send( /* invalid address */ return -1; } - buff_len = 2; buff_len += encode_unsigned16( &data->buff[buff_len], (uint16_t)(pdu_len + 4 /*inclusive */));