fix BACnet/IP on OS to bind broadcast to specific port (#489)

* Fixes #346 by binding the broadcast socket to the port specific broadcast address rather than INADDR_ANY or INADDR_BROADCAST. Added additional compile and environment options for those who might need them. 

* Changed the define USE_CLASSADDR to BACNET_IP_BROADCAST_USE_CLASSADDR to help manage namespaces.

* Added BACNET_IP_BROADCAST_BIND_ADDR environment variable to override the default broadcast binding address.

---------

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
Steve Karg
2023-09-10 10:24:18 -05:00
committed by GitHub
parent 0001f85f29
commit 55b8b3d93c
18 changed files with 231 additions and 58 deletions
+19 -15
View File
@@ -715,14 +715,14 @@ int bvlc_bbmd_disabled_handler(BACNET_IP_ADDRESS *addr,
if (function_len) {
if (bbmd_address_match_self(&fwd_address)) {
/* ignore forwards from my IPv4 address */
debug_print_string("Forwarded-NPDU is me!");
debug_print_string("Dropped Forwarded-NPDU from me!");
break;
}
bvlc_ip_address_to_bacnet_local(src, &fwd_address);
offset = header_len + function_len - npdu_len;
debug_print_npdu("Forwarded-NPDU", offset, npdu_len);
} else {
debug_print_string("Forwarded-NPDU: Unable to decode!");
debug_print_string("Dropped Forwarded-NPDU: Malformed!");
}
break;
case BVLC_REGISTER_FOREIGN_DEVICE:
@@ -751,7 +751,8 @@ int bvlc_bbmd_disabled_handler(BACNET_IP_ADDRESS *addr,
debug_print_bip("Received Original-Unicast-NPDU", addr);
if (bbmd_address_match_self(addr)) {
/* ignore messages from my IPv4 address */
debug_print_string("Original-Unicast-NPDU is me!");
debug_print_string(
"Dropped Original-Unicast-NPDU from me!");
break;
}
function_len = bvlc_decode_original_unicast(
@@ -762,14 +763,15 @@ int bvlc_bbmd_disabled_handler(BACNET_IP_ADDRESS *addr,
debug_print_npdu("Original-Unicast-NPDU", offset, npdu_len);
} else {
debug_print_string(
"Original-Unicast-NPDU: Unable to decode!");
"Dropped Original-Unicast-NPDU: Malformed!");
}
break;
case BVLC_ORIGINAL_BROADCAST_NPDU:
debug_print_bip("Received Original-Broadcast-NPDU", addr);
if (bbmd_address_match_self(addr)) {
/* ignore messages from my IPv4 address */
debug_print_string("Original-Broadcast-NPDU is me!");
debug_print_string(
"Dropped Original-Broadcast-NPDU from me!");
break;
}
function_len = bvlc_decode_original_broadcast(
@@ -784,15 +786,15 @@ int bvlc_bbmd_disabled_handler(BACNET_IP_ADDRESS *addr,
npdu = &mtu[offset];
if (npdu_confirmed_service(npdu, npdu_len)) {
offset = 0;
debug_print_string("Original-Broadcast-NPDU: "
"Confirmed Service! Discard!");
debug_print_string("Dropped Original-Broadcast-NPDU: "
"Confirmed Service!");
} else {
debug_print_npdu(
"Original-Broadcast-NPDU", offset, npdu_len);
}
} else {
debug_print_string(
"Original-Broadcast-NPDU: Unable to decode!");
"Dropped Original-Broadcast-NPDU: Malformed!");
}
break;
case BVLC_SECURE_BVLL:
@@ -922,7 +924,7 @@ int bvlc_bbmd_enabled_handler(BACNET_IP_ADDRESS *addr,
if (function_len) {
if (bbmd_address_match_self(&fwd_address)) {
/* ignore forwards from my IPv4 address */
debug_print_string("Forwarded-NPDU is me!");
debug_print_string("Dropped Forwarded-NPDU from me!");
break;
}
if (bbmd_bdt_member_mask_is_unicast(addr)) {
@@ -1057,7 +1059,7 @@ int bvlc_bbmd_enabled_handler(BACNET_IP_ADDRESS *addr,
debug_print_bip("Received Original-Unicast-NPDU", addr);
if (bbmd_address_match_self(addr)) {
/* ignore messages from my IPv4 address */
debug_print_string("Original-Unicast-NPDU is me!");
debug_print_string("Dropped Original-Unicast-NPDU from me!");
break;
}
function_len =
@@ -1069,14 +1071,14 @@ int bvlc_bbmd_enabled_handler(BACNET_IP_ADDRESS *addr,
debug_print_npdu("Original-Unicast-NPDU", offset, npdu_len);
} else {
debug_print_string(
"Original-Broadcast-NPDU: Unable to decode!");
"Dropped Original-Broadcast-NPDU: Malformed!");
}
break;
case BVLC_ORIGINAL_BROADCAST_NPDU:
debug_print_bip("Received Original-Broadcast-NPDU", addr);
if (bbmd_address_match_self(addr)) {
/* ignore messages from my IPv4 address */
debug_print_string("Original-Broadcast-NPDU is me!");
debug_print_string("Dropped Original-Broadcast-NPDU from me!");
break;
}
function_len = bvlc_decode_original_broadcast(
@@ -1105,8 +1107,8 @@ int bvlc_bbmd_enabled_handler(BACNET_IP_ADDRESS *addr,
network layer. */
if (npdu_confirmed_service(npdu, npdu_len)) {
offset = 0;
debug_print_string("Original-Broadcast-NPDU: "
"Confirmed Service! Discard!");
debug_print_string("Dropped Original-Broadcast-NPDU: "
"Confirmed Service!");
} else {
(void)bbmd_fdt_forward_npdu(addr, npdu, npdu_len, true);
(void)bbmd_bdt_forward_npdu(addr, npdu, npdu_len, true);
@@ -1115,7 +1117,7 @@ int bvlc_bbmd_enabled_handler(BACNET_IP_ADDRESS *addr,
}
} else {
debug_print_string(
"Original-Broadcast-NPDU: Unable to decode!");
"Dropped Original-Broadcast-NPDU: Malformed!");
}
break;
case BVLC_SECURE_BVLL:
@@ -1168,12 +1170,14 @@ int bvlc_broadcast_handler(BACNET_IP_ADDRESS *addr,
uint16_t message_length = 0;
int header_len = 0;
debug_print_bip("Received Broadcast", addr);
header_len =
bvlc_decode_header(npdu, npdu_len, &message_type, &message_length);
if (header_len == 4) {
switch (message_type) {
case BVLC_ORIGINAL_UNICAST_NPDU:
/* drop unicast when sent as a broadcast */
debug_print_bip("Dropped BVLC (Original Unicast)", addr);
break;
default:
offset = bvlc_handler(addr, src, npdu, npdu_len);
+1 -1
View File
@@ -1154,7 +1154,7 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
break;
}
/* not using len at this time */
len = len;
(void)len;
return status;
}
+2 -1
View File
@@ -414,4 +414,5 @@ bool tsm_invoke_id_failed(uint8_t invokeID)
return status;
}
#endif
#endif