From 89fa3cea77484fc4d0039c3c6a1ae5baa5bc1a78 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Tue, 13 Feb 2024 14:15:59 -0600 Subject: [PATCH] Fixed the Network Port object subnet mask for IP example. (#573) --- ports/bsd/bip-init.c | 4 +--- ports/linux/bip-init.c | 4 +--- ports/win32/bip-init.c | 6 ++---- ports/zephyr/bip-init.c | 16 +++++++--------- src/bacnet/basic/object/netport.c | 5 ++--- src/bacnet/datalink/dlenv.c | 18 ++++++++++++++++-- 6 files changed, 29 insertions(+), 24 deletions(-) diff --git a/ports/bsd/bip-init.c b/ports/bsd/bip-init.c index c070eb60..fb61a274 100644 --- a/ports/bsd/bip-init.c +++ b/ports/bsd/bip-init.c @@ -257,7 +257,6 @@ uint8_t bip_get_subnet_prefix(void) { uint32_t address = 0; uint32_t broadcast = 0; - uint32_t test_broadcast = 0; uint32_t mask = 0xFFFFFFFE; uint8_t prefix = 0; @@ -265,8 +264,7 @@ uint8_t bip_get_subnet_prefix(void) broadcast = BIP_Broadcast_Addr.s_addr; /* calculate the subnet prefix from the broadcast address */ for (prefix = 1; prefix <= 32; prefix++) { - test_broadcast = (address & mask) | (~mask); - if (test_broadcast == broadcast) { + if ((address | mask) == broadcast) { break; } mask = mask << 1; diff --git a/ports/linux/bip-init.c b/ports/linux/bip-init.c index e9a6b798..92e65a5f 100644 --- a/ports/linux/bip-init.c +++ b/ports/linux/bip-init.c @@ -272,7 +272,6 @@ uint8_t bip_get_subnet_prefix(void) { uint32_t address = 0; uint32_t broadcast = 0; - uint32_t test_broadcast = 0; uint32_t mask = 0xFFFFFFFE; uint8_t prefix = 0; @@ -280,8 +279,7 @@ uint8_t bip_get_subnet_prefix(void) broadcast = BIP_Broadcast_Addr.s_addr; /* calculate the subnet prefix from the broadcast address */ for (prefix = 1; prefix <= 32; prefix++) { - test_broadcast = (address & mask) | (~mask); - if (test_broadcast == broadcast) { + if ((address | mask) == broadcast) { break; } mask = mask << 1; diff --git a/ports/win32/bip-init.c b/ports/win32/bip-init.c index 01a5451f..55d8e400 100644 --- a/ports/win32/bip-init.c +++ b/ports/win32/bip-init.c @@ -412,16 +412,14 @@ uint8_t bip_get_subnet_prefix(void) { uint32_t address = 0; uint32_t broadcast = 0; - uint32_t test_broadcast = 0; uint32_t mask = 0xFFFFFFFE; uint8_t prefix = 0; - address = BIP_Broadcast_Addr.s_addr; + address = BIP_Address.s_addr; broadcast = BIP_Broadcast_Addr.s_addr; /* calculate the subnet prefix from the broadcast address */ for (prefix = 1; prefix <= 32; prefix++) { - test_broadcast = (address & mask) | (~mask); - if (test_broadcast == broadcast) { + if ((address | mask) == broadcast) { break; } mask = mask << 1; diff --git a/ports/zephyr/bip-init.c b/ports/zephyr/bip-init.c index 3af68e43..3df640e7 100644 --- a/ports/zephyr/bip-init.c +++ b/ports/zephyr/bip-init.c @@ -154,7 +154,7 @@ void bip_get_my_address(BACNET_ADDRESS *addr) void bip_get_broadcast_address(BACNET_ADDRESS *dest) { - int i = 0; + int i = 0; if (dest) { dest->mac_len = BIP_ADDRESS_MAX; @@ -247,7 +247,6 @@ uint8_t bip_get_subnet_prefix(void) { uint32_t address = 0; uint32_t broadcast = 0; - uint32_t test_broadcast = 0; uint32_t mask = 0xFFFFFFFE; uint8_t prefix = 0; @@ -255,8 +254,7 @@ uint8_t bip_get_subnet_prefix(void) broadcast = BIP_Broadcast_Addr.s_addr; /* calculate the subnet prefix from the broadcast address */ for (prefix = 1; prefix <= 32; prefix++) { - test_broadcast = (address & mask) | (~mask); - if (test_broadcast == broadcast) { + if ((address | mask) == broadcast) { break; } mask = mask<<1; @@ -352,7 +350,7 @@ uint16_t bip_receive( received_bytes = zsock_recvfrom(socket, (char *)&npdu[0], max_npdu, 0, (struct sockaddr *)&sin, &sin_len); } - else + else { return 0; } @@ -371,16 +369,16 @@ uint16_t bip_receive( LOG_WRN("%s:%d - RX bad packet", THIS_FILE, __LINE__); return 0; } - + /* Data link layer addressing between B/IPv4 nodes consists of a 32-bit IPv4 address followed by a two-octet UDP port number (both of which shall be transmitted with the most significant octet first). This address shall be referred to as a B/IPv4 address. */ - + memcpy(&addr.address[0], &sin.sin_addr.s_addr, IP_ADDRESS_MAX); addr.port = ntohs(sin.sin_port); - + debug_print_ipv4("Received MPDU->", &sin.sin_addr, sin.sin_port, received_bytes); /* pass the packet into the BBMD handler */ @@ -502,7 +500,7 @@ void bip_set_interface(char *ifname) bip_set_broadcast_addr(&broadcast); /* net_if -> net_if_config . net_if_ip . net_if_ipv4 -> net_if_addr . net_addr . in_addr . s4_addr[4] */ - LOG_INF(" Unicast: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->unicast->address.in_addr))); + LOG_INF(" Unicast: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->unicast->address.in_addr))); LOG_INF(" Broadcast: %s", log_strdup(inet_ntoa(&BIP_Broadcast_Addr))); LOG_INF(" Netmask: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->netmask)) ); } diff --git a/src/bacnet/basic/object/netport.c b/src/bacnet/basic/object/netport.c index f1ec0994..45fe8079 100644 --- a/src/bacnet/basic/object/netport.c +++ b/src/bacnet/basic/object/netport.c @@ -938,7 +938,7 @@ bool Network_Port_IP_Subnet( bool status = false; uint32_t mask = 0; uint32_t prefix = 0; - uint8_t ip_mask[4] = { 0 }; + uint8_t ip_mask[4] = { 255, 255, 255, 255 }; index = Network_Port_Instance_To_Index(object_instance); if (index < BACNET_NETWORK_PORTS_MAX) { @@ -947,9 +947,8 @@ bool Network_Port_IP_Subnet( if ((prefix > 0) && (prefix <= 32)) { mask = (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF; encode_unsigned32(ip_mask, mask); - status = - octetstring_init(subnet_mask, ip_mask, sizeof(ip_mask)); } + status = octetstring_init(subnet_mask, ip_mask, sizeof(ip_mask)); } } diff --git a/src/bacnet/datalink/dlenv.c b/src/bacnet/datalink/dlenv.c index bee7ba32..5410dce9 100644 --- a/src/bacnet/datalink/dlenv.c +++ b/src/bacnet/datalink/dlenv.c @@ -357,6 +357,7 @@ void dlenv_network_port_init(void) { const uint32_t instance = 1; BACNET_IP_ADDRESS addr = { 0 }; + uint8_t prefix = 0; #if BBMD_ENABLED uint8_t addr0, addr1, addr2, addr3; #endif @@ -365,9 +366,22 @@ void dlenv_network_port_init(void) Network_Port_Name_Set(instance, "BACnet/IP Port"); Network_Port_Type_Set(instance, PORT_TYPE_BIP); bip_get_addr(&addr); + prefix = bip_get_subnet_prefix(); + if (BIP_DL_Debug) { + fprintf(stderr, + "BIP: Setting Network Port %lu address %u.%u.%u.%u:%u/%u\n", + (unsigned long)instance, + (unsigned)addr.address[0], + (unsigned)addr.address[1], + (unsigned)addr.address[2], + (unsigned)addr.address[3], + (unsigned)addr.port, + (unsigned)prefix); + } Network_Port_BIP_Port_Set(instance, addr.port); - Network_Port_MAC_Address_Set(instance, &addr.address[0], 6); - Network_Port_IP_Subnet_Prefix_Set(instance, bip_get_subnet_prefix()); + Network_Port_IP_Address_Set(instance, addr.address[0], addr.address[1], + addr.address[2], addr.address[3]); + Network_Port_IP_Subnet_Prefix_Set(instance, prefix); Network_Port_Link_Speed_Set(instance, 0.0); #if BBMD_ENABLED Network_Port_BBMD_BD_Table_Set(instance, bvlc_bdt_list());