Fixed the Network Port object subnet mask for IP example. (#573)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)) );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user