Fixed the Network Port object subnet mask for IP example. (#573)

This commit is contained in:
Steve Karg
2024-02-13 14:15:59 -06:00
committed by GitHub
parent 190183966c
commit 89fa3cea77
6 changed files with 29 additions and 24 deletions
+1 -3
View File
@@ -257,7 +257,6 @@ uint8_t bip_get_subnet_prefix(void)
{ {
uint32_t address = 0; uint32_t address = 0;
uint32_t broadcast = 0; uint32_t broadcast = 0;
uint32_t test_broadcast = 0;
uint32_t mask = 0xFFFFFFFE; uint32_t mask = 0xFFFFFFFE;
uint8_t prefix = 0; uint8_t prefix = 0;
@@ -265,8 +264,7 @@ uint8_t bip_get_subnet_prefix(void)
broadcast = BIP_Broadcast_Addr.s_addr; broadcast = BIP_Broadcast_Addr.s_addr;
/* calculate the subnet prefix from the broadcast address */ /* calculate the subnet prefix from the broadcast address */
for (prefix = 1; prefix <= 32; prefix++) { for (prefix = 1; prefix <= 32; prefix++) {
test_broadcast = (address & mask) | (~mask); if ((address | mask) == broadcast) {
if (test_broadcast == broadcast) {
break; break;
} }
mask = mask << 1; mask = mask << 1;
+1 -3
View File
@@ -272,7 +272,6 @@ uint8_t bip_get_subnet_prefix(void)
{ {
uint32_t address = 0; uint32_t address = 0;
uint32_t broadcast = 0; uint32_t broadcast = 0;
uint32_t test_broadcast = 0;
uint32_t mask = 0xFFFFFFFE; uint32_t mask = 0xFFFFFFFE;
uint8_t prefix = 0; uint8_t prefix = 0;
@@ -280,8 +279,7 @@ uint8_t bip_get_subnet_prefix(void)
broadcast = BIP_Broadcast_Addr.s_addr; broadcast = BIP_Broadcast_Addr.s_addr;
/* calculate the subnet prefix from the broadcast address */ /* calculate the subnet prefix from the broadcast address */
for (prefix = 1; prefix <= 32; prefix++) { for (prefix = 1; prefix <= 32; prefix++) {
test_broadcast = (address & mask) | (~mask); if ((address | mask) == broadcast) {
if (test_broadcast == broadcast) {
break; break;
} }
mask = mask << 1; mask = mask << 1;
+2 -4
View File
@@ -412,16 +412,14 @@ uint8_t bip_get_subnet_prefix(void)
{ {
uint32_t address = 0; uint32_t address = 0;
uint32_t broadcast = 0; uint32_t broadcast = 0;
uint32_t test_broadcast = 0;
uint32_t mask = 0xFFFFFFFE; uint32_t mask = 0xFFFFFFFE;
uint8_t prefix = 0; uint8_t prefix = 0;
address = BIP_Broadcast_Addr.s_addr; address = BIP_Address.s_addr;
broadcast = BIP_Broadcast_Addr.s_addr; broadcast = BIP_Broadcast_Addr.s_addr;
/* calculate the subnet prefix from the broadcast address */ /* calculate the subnet prefix from the broadcast address */
for (prefix = 1; prefix <= 32; prefix++) { for (prefix = 1; prefix <= 32; prefix++) {
test_broadcast = (address & mask) | (~mask); if ((address | mask) == broadcast) {
if (test_broadcast == broadcast) {
break; break;
} }
mask = mask << 1; mask = mask << 1;
+7 -9
View File
@@ -154,7 +154,7 @@ void bip_get_my_address(BACNET_ADDRESS *addr)
void bip_get_broadcast_address(BACNET_ADDRESS *dest) void bip_get_broadcast_address(BACNET_ADDRESS *dest)
{ {
int i = 0; int i = 0;
if (dest) { if (dest) {
dest->mac_len = BIP_ADDRESS_MAX; dest->mac_len = BIP_ADDRESS_MAX;
@@ -247,7 +247,6 @@ uint8_t bip_get_subnet_prefix(void)
{ {
uint32_t address = 0; uint32_t address = 0;
uint32_t broadcast = 0; uint32_t broadcast = 0;
uint32_t test_broadcast = 0;
uint32_t mask = 0xFFFFFFFE; uint32_t mask = 0xFFFFFFFE;
uint8_t prefix = 0; uint8_t prefix = 0;
@@ -255,8 +254,7 @@ uint8_t bip_get_subnet_prefix(void)
broadcast = BIP_Broadcast_Addr.s_addr; broadcast = BIP_Broadcast_Addr.s_addr;
/* calculate the subnet prefix from the broadcast address */ /* calculate the subnet prefix from the broadcast address */
for (prefix = 1; prefix <= 32; prefix++) { for (prefix = 1; prefix <= 32; prefix++) {
test_broadcast = (address & mask) | (~mask); if ((address | mask) == broadcast) {
if (test_broadcast == broadcast) {
break; break;
} }
mask = mask<<1; mask = mask<<1;
@@ -352,7 +350,7 @@ uint16_t bip_receive(
received_bytes = zsock_recvfrom(socket, (char *)&npdu[0], max_npdu, received_bytes = zsock_recvfrom(socket, (char *)&npdu[0], max_npdu,
0, (struct sockaddr *)&sin, &sin_len); 0, (struct sockaddr *)&sin, &sin_len);
} }
else else
{ {
return 0; return 0;
} }
@@ -371,16 +369,16 @@ uint16_t bip_receive(
LOG_WRN("%s:%d - RX bad packet", THIS_FILE, __LINE__); LOG_WRN("%s:%d - RX bad packet", THIS_FILE, __LINE__);
return 0; return 0;
} }
/* Data link layer addressing between B/IPv4 nodes consists of a 32-bit /* 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 IPv4 address followed by a two-octet UDP port number (both of which
shall be transmitted with the most significant octet first). This shall be transmitted with the most significant octet first). This
address shall be referred to as a B/IPv4 address. address shall be referred to as a B/IPv4 address.
*/ */
memcpy(&addr.address[0], &sin.sin_addr.s_addr, IP_ADDRESS_MAX); memcpy(&addr.address[0], &sin.sin_addr.s_addr, IP_ADDRESS_MAX);
addr.port = ntohs(sin.sin_port); addr.port = ntohs(sin.sin_port);
debug_print_ipv4("Received MPDU->", &sin.sin_addr, sin.sin_port, debug_print_ipv4("Received MPDU->", &sin.sin_addr, sin.sin_port,
received_bytes); received_bytes);
/* pass the packet into the BBMD handler */ /* pass the packet into the BBMD handler */
@@ -502,7 +500,7 @@ void bip_set_interface(char *ifname)
bip_set_broadcast_addr(&broadcast); 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] */ /* 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(" Broadcast: %s", log_strdup(inet_ntoa(&BIP_Broadcast_Addr)));
LOG_INF(" Netmask: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->netmask)) ); LOG_INF(" Netmask: %s", log_strdup(inet_ntoa(&interface->config.ip.ipv4->netmask)) );
} }
+2 -3
View File
@@ -938,7 +938,7 @@ bool Network_Port_IP_Subnet(
bool status = false; bool status = false;
uint32_t mask = 0; uint32_t mask = 0;
uint32_t prefix = 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); index = Network_Port_Instance_To_Index(object_instance);
if (index < BACNET_NETWORK_PORTS_MAX) { if (index < BACNET_NETWORK_PORTS_MAX) {
@@ -947,9 +947,8 @@ bool Network_Port_IP_Subnet(
if ((prefix > 0) && (prefix <= 32)) { if ((prefix > 0) && (prefix <= 32)) {
mask = (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF; mask = (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF;
encode_unsigned32(ip_mask, mask); 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));
} }
} }
+16 -2
View File
@@ -357,6 +357,7 @@ void dlenv_network_port_init(void)
{ {
const uint32_t instance = 1; const uint32_t instance = 1;
BACNET_IP_ADDRESS addr = { 0 }; BACNET_IP_ADDRESS addr = { 0 };
uint8_t prefix = 0;
#if BBMD_ENABLED #if BBMD_ENABLED
uint8_t addr0, addr1, addr2, addr3; uint8_t addr0, addr1, addr2, addr3;
#endif #endif
@@ -365,9 +366,22 @@ void dlenv_network_port_init(void)
Network_Port_Name_Set(instance, "BACnet/IP Port"); Network_Port_Name_Set(instance, "BACnet/IP Port");
Network_Port_Type_Set(instance, PORT_TYPE_BIP); Network_Port_Type_Set(instance, PORT_TYPE_BIP);
bip_get_addr(&addr); 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_BIP_Port_Set(instance, addr.port);
Network_Port_MAC_Address_Set(instance, &addr.address[0], 6); Network_Port_IP_Address_Set(instance, addr.address[0], addr.address[1],
Network_Port_IP_Subnet_Prefix_Set(instance, bip_get_subnet_prefix()); addr.address[2], addr.address[3]);
Network_Port_IP_Subnet_Prefix_Set(instance, prefix);
Network_Port_Link_Speed_Set(instance, 0.0); Network_Port_Link_Speed_Set(instance, 0.0);
#if BBMD_ENABLED #if BBMD_ENABLED
Network_Port_BBMD_BD_Table_Set(instance, bvlc_bdt_list()); Network_Port_BBMD_BD_Table_Set(instance, bvlc_bdt_list());