diff --git a/CMakeLists.txt b/CMakeLists.txt index a46f6c31..a30c31a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,7 +121,7 @@ if(BACNET_STACK_DEPRECATED_DISABLE) add_definitions(-DBACNET_STACK_DEPRECATED_DISABLE) endif() -set(CMAKE_C_STANDARD 90) +set(CMAKE_C_STANDARD 99) if (CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "AppleClang" OR CMAKE_C_COMPILER_ID MATCHES "GNU") add_compile_options(-Wall -Wextra -pedantic) @@ -577,22 +577,22 @@ add_library(${PROJECT_NAME} src/bacnet/datalink/bacsec.c src/bacnet/datalink/bacsec.h src/bacnet/datalink/bip6.h - $<$:src/bacnet/datalink/bip.h> - $<$:src/bacnet/datalink/bvlc6.c> - $<$:src/bacnet/datalink/bvlc6.h> - $<$:src/bacnet/datalink/bvlc.h> - $<$:src/bacnet/datalink/bvlc.c> - $<$:src/bacnet/datalink/crc.h> - $<$:src/bacnet/datalink/crc.c> - $<$:src/bacnet/datalink/cobs.h> - $<$:src/bacnet/datalink/cobs.c> + src/bacnet/datalink/bip.h + src/bacnet/datalink/bvlc6.c + src/bacnet/datalink/bvlc6.h + src/bacnet/datalink/bvlc.h + src/bacnet/datalink/bvlc.c + src/bacnet/datalink/crc.h + src/bacnet/datalink/crc.c + src/bacnet/datalink/cobs.h + src/bacnet/datalink/cobs.c src/bacnet/datalink/datalink.c src/bacnet/datalink/datalink.h src/bacnet/datalink/dlenv.c src/bacnet/datalink/dlenv.h src/bacnet/datalink/dlmstp.h src/bacnet/datalink/ethernet.h - $<$:src/bacnet/datalink/mstp.c> + src/bacnet/datalink/mstp.c src/bacnet/datalink/mstpdef.h src/bacnet/datalink/mstp.h src/bacnet/datalink/mstptext.c diff --git a/apps/lib/Makefile b/apps/lib/Makefile index 3153e44b..d4ac927e 100644 --- a/apps/lib/Makefile +++ b/apps/lib/Makefile @@ -132,6 +132,7 @@ BACNET_SRC ?= \ $(BACNET_SRC_DIR)/bacnet/datalink/bvlc6.c \ $(BACNET_SRC_DIR)/bacnet/datalink/cobs.c \ $(BACNET_SRC_DIR)/bacnet/datalink/crc.c \ + $(BACNET_SRC_DIR)/bacnet/datalink/datalink.c \ $(BACNET_SRC_DIR)/bacnet/datalink/mstp.c \ $(BACNET_SRC_DIR)/bacnet/datalink/mstptext.c diff --git a/src/bacnet/config.h b/src/bacnet/config.h index 052d4706..cb440364 100644 --- a/src/bacnet/config.h +++ b/src/bacnet/config.h @@ -129,7 +129,9 @@ #if !defined(MAX_APDU) /* #define MAX_APDU 50 */ /* #define MAX_APDU 1476 */ -#if defined(BACDL_BIP) +#if defined(BACDL_MULTIPLE) +#define MAX_APDU 1476 +#elif defined(BACDL_BIP) #define MAX_APDU 1476 /* Enable this IP for testing readrange so you get the More Follows flag set */ /* #define MAX_APDU 128 */ @@ -152,7 +154,6 @@ #endif #endif -#if defined(BACDL_BSC) #ifndef SC_NETPORT_BVLC_MAX #define SC_NETPORT_BVLC_MAX 1500 #endif @@ -171,7 +172,6 @@ #ifndef SC_NETPORT_RECONNECT_TIME #define SC_NETPORT_RECONNECT_TIME 2 #endif -#endif /* for confirmed messages, this is the number of transactions */ /* that we hold in a queue waiting for timeout. */ diff --git a/src/bacnet/datalink/datalink.c b/src/bacnet/datalink/datalink.c index 9aa981b4..647ceecf 100644 --- a/src/bacnet/datalink/datalink.c +++ b/src/bacnet/datalink/datalink.c @@ -7,6 +7,7 @@ * @defgroup DataLink DataLink Network Layer * @ingroup DataLink */ +#include "bacnet/bacdef.h" #include "bacnet/datalink/datalink.h" #include "bacnet/bacstr.h" #if defined(BACDL_MULTIPLE) || defined FOR_DOXYGEN diff --git a/src/bacnet/datalink/dlenv.c b/src/bacnet/datalink/dlenv.c index c3cddf81..78f9925d 100644 --- a/src/bacnet/datalink/dlenv.c +++ b/src/bacnet/datalink/dlenv.c @@ -7,6 +7,7 @@ * @ingroup DataLink */ #include +#include #include #include #include @@ -14,54 +15,39 @@ #include "bacnet/bacdef.h" /* BACnet Stack API */ #include "bacnet/apdu.h" -#include "bacnet/datalink/datalink.h" #include "bacnet/basic/services.h" -#include "bacnet/datalink/dlenv.h" #include "bacnet/basic/tsm/tsm.h" -#if defined(BACDL_BIP) -#include "bacnet/datalink/bip.h" #include "bacnet/basic/bbmd/h_bbmd.h" -#endif - -#if (BACNET_PROTOCOL_REVISION >= 17) #include "bacnet/basic/object/netport.h" -#endif -#if defined(BACDL_BSC) #include "bacnet/basic/object/bacfile.h" #include "bacnet/basic/object/sc_netport.h" +#include "bacnet/datalink/bip.h" #include "bacnet/datalink/bsc/bvlc-sc.h" #include "bacnet/datalink/bsc/bsc-util.h" #include "bacnet/datalink/bsc/bsc-datalink.h" #include "bacnet/datalink/bsc/bsc-event.h" -#endif +#include "bacnet/datalink/bvlc.h" +#include "bacnet/datalink/bvlc6.h" +#include "bacnet/datalink/datalink.h" +#include "bacnet/datalink/dlenv.h" +#include "bacnet/datalink/dlmstp.h" /* enable debugging */ static bool Datalink_Debug; - /* timer used to renew Foreign Device Registration */ -#if defined(BACDL_BIP) || defined(BACDL_BIP6) static uint16_t BBMD_Timer_Seconds; static uint16_t BBMD_TTL_Seconds = 60000; -#endif - -#if defined(BACDL_BIP) -#ifndef BBMD_ENABLED -#define BBMD_ENABLED 1 -#endif /* BBMD variables */ static BACNET_IP_ADDRESS BBMD_Address; static bool BBMD_Address_Valid; static uint16_t BBMD_Result = 0; -#if BBMD_ENABLED static BACNET_IP_BROADCAST_DISTRIBUTION_TABLE_ENTRY BBMD_Table_Entry; -#endif - -/* Debug toggle */ +static uint32_t Network_Port_Instance = 1; /** * @brief Enabled debug printing of BACnet/IPv4 DL */ -void bip_dl_debug_enable(void) +void dlenv_debug_enable(void) { Datalink_Debug = true; } @@ -69,7 +55,7 @@ void bip_dl_debug_enable(void) /** * @brief Disable debug printing of BACnet/IPv4 DL */ -void bip_dl_debug_disable(void) +void dlenv_debug_disable(void) { Datalink_Debug = false; } @@ -117,9 +103,7 @@ int dlenv_bbmd_result(void) /* Else, show our send: */ return BBMD_Result; } -#endif -#if defined(BACDL_BIP) && BBMD_ENABLED /** Register as a Foreign Device with the designated BBMD. * @ingroup DataLink * The BBMD's address, port, and lease time must be provided by @@ -136,7 +120,8 @@ int dlenv_bbmd_result(void) */ static int bbmd_register_as_foreign_device(void) { - int retval = 0; + int retval = -1; +#if defined(BACDL_BIP) && BBMD_ENABLED bool bdt_entry_valid = false; uint16_t bdt_entry_port = 0; char *pEnv = NULL; @@ -145,6 +130,7 @@ static int bbmd_register_as_foreign_device(void) unsigned entry_number = 0; long long_value = 0; int c; + BACNET_IP_BROADCAST_DISTRIBUTION_TABLE_ENTRY *bdt_table = NULL; pEnv = getenv("BACNET_BBMD_PORT"); if (pEnv) { @@ -245,8 +231,9 @@ static int bbmd_register_as_foreign_device(void) a[3]); } } + bdt_table = bvlc_bdt_list(); bvlc_broadcast_distribution_table_entry_append( - bvlc_bdt_list(), &BBMD_Table_Entry); + bdt_table, &BBMD_Table_Entry); if (Datalink_Debug) { fprintf( stderr, "BBMD %4u: %u.%u.%u.%u:%u %u.%u.%u.%u\n", @@ -264,13 +251,12 @@ static int bbmd_register_as_foreign_device(void) } } } +#endif BBMD_Result = retval; return retval; } -#endif -#if defined(BACDL_BIP6) && BBMD6_ENABLED /** Register as a Foreign Device with the designated BBMD. * @ingroup DataLink * The BBMD's address, port, and lease time must be provided by @@ -287,15 +273,10 @@ static int bbmd_register_as_foreign_device(void) */ static int bbmd6_register_as_foreign_device(void) { - int retval = 0; - bool bdt_entry_valid = false; - uint16_t bdt_entry_port = 0; + int retval = -1; +#if defined(BACDL_BIP6) && BBMD6_ENABLED char *pEnv = NULL; - unsigned a[4] = { 0 }; - char bbmd_env[32] = ""; - unsigned entry_number = 0; long long_value = 0; - int c; BACNET_IP6_ADDRESS bip6_addr = { 0 }; uint16_t bip6_port = 0xBAC0; @@ -314,11 +295,11 @@ static int bbmd6_register_as_foreign_device(void) } } pEnv = getenv("BACNET_BBMD6_ADDRESS"); - if (bvlc6_address_from_ascii(pEnv, &bip6_addr)) { + if (bvlc6_address_from_ascii(&bip6_addr, pEnv)) { if (Datalink_Debug) { fprintf( - stderr, "Registering with BBMD6 at %s for %u seconds\n", pEnv, - (unsigned)bip6_port, (unsigned)BBMD_TTL_Seconds); + stderr, "Registering with BBMD6 at %s:0x%04x for %u seconds\n", + pEnv, (unsigned)bip6_port, (unsigned)BBMD_TTL_Seconds); } retval = bvlc6_register_with_bbmd(&bip6_addr, BBMD_TTL_Seconds); if (retval < 0) { @@ -328,50 +309,65 @@ static int bbmd6_register_as_foreign_device(void) } BBMD_Timer_Seconds = BBMD_TTL_Seconds; } +#endif BBMD_Result = retval; return retval; } -#endif -/** Register as a Foreign Device with the designated BBMD. - * @ingroup DataLink - * The BBMD's address, port, and lease time must be provided by - * internal variables or Environment variables. - * If no address for the BBMD is provided, no BBMD registration will occur. - * - * @return Positive number (of bytes sent) on success, - * 0 if no registration request is sent, or - * -1 if registration fails. - */ -int dlenv_register_as_foreign_device(void) -{ -#if defined(BACDL_BIP) && BBMD_ENABLED - return bbmd_register_as_foreign_device(); -#elif defined(BACDL_BIP6) && BBMD6_ENABLED - return bbmd6_register_as_foreign_device(); -#else - return 0; -#endif -} - -#if (BACNET_PROTOCOL_REVISION >= 17) -#if defined(BACDL_BIP) /** * Datalink network port object settings */ -void dlenv_network_port_init(void) +static void dlenv_network_port_bip_init(uint32_t instance) { - const uint32_t instance = 1; +#if defined(BACDL_BIP) BACNET_IP_ADDRESS addr = { 0 }; uint8_t prefix = 0; -#if BBMD_ENABLED uint8_t addr0, addr1, addr2, addr3; + char *pEnv = NULL; + BACNET_IP_FOREIGN_DEVICE_TABLE_ENTRY *fdt_table = NULL; + BACNET_IP_BROADCAST_DISTRIBUTION_TABLE_ENTRY *bdt_table = NULL; #endif Network_Port_Object_Instance_Number_Set(0, instance); Network_Port_Name_Set(instance, "BACnet/IP Port"); Network_Port_Type_Set(instance, PORT_TYPE_BIP); + +#if defined(BACDL_BIP) + if (getenv("BACNET_IP_DEBUG")) { + bip_debug_enable(); + bvlc_debug_enable(); + dlenv_debug_enable(); + } + pEnv = getenv("BACNET_IP_PORT"); + if (pEnv) { + bip_set_port((uint16_t)strtol(pEnv, NULL, 0)); + } else { + /* BIP_Port is statically initialized to 0xBAC0, + * so if it is different, then it was programmatically altered, + * and we shouldn't just stomp on it here. + * Unless it is set below 1024, since: + * "The range for well-known ports managed by the IANA is 0-1023." + */ + if (bip_get_port() < 1024) { + bip_set_port(0xBAC0); + } + } + pEnv = getenv("BACNET_IP_BROADCAST_BIND_ADDR"); + if (pEnv) { + bip_set_broadcast_binding(pEnv); + } + pEnv = getenv("BACNET_IP_NAT_ADDR"); + if (pEnv) { + if (bip_get_addr_by_name(pEnv, &addr)) { + addr.port = 0xBAC0; + pEnv = getenv("BACNET_IP_NAT_PORT"); + if (pEnv) { + addr.port = strtol(pEnv, NULL, 0); + } + bvlc_set_global_address_for_nat(&addr); + } + } bip_get_addr(&addr); prefix = bip_get_subnet_prefix(); if (Datalink_Debug) { @@ -388,8 +384,11 @@ void dlenv_network_port_init(void) 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()); - Network_Port_BBMD_FD_Table_Set(instance, bvlc_fdt_list()); + bdt_table = bvlc_bdt_list(); + fdt_table = bvlc_fdt_list(); +#endif + Network_Port_BBMD_BD_Table_Set(instance, bdt_table); + Network_Port_BBMD_FD_Table_Set(instance, fdt_table); /* foreign device registration */ bvlc_address_get(&BBMD_Address, &addr0, &addr1, &addr2, &addr3); Network_Port_Remote_BBMD_IP_Address_Set( @@ -407,22 +406,53 @@ void dlenv_network_port_init(void) since they are already set */ Network_Port_Changes_Pending_Set(instance, false); } -#elif defined(BACDL_MSTP) + /** * Datalink network port object settings */ -void dlenv_network_port_init(void) +void dlenv_network_port_mstp_init(uint32_t instance) { - uint32_t instance = 1; uint8_t mac[1] = { 0 }; + char *pEnv = NULL; + long max_master = 127; + long max_info_frames = 1; + long baud_rate = 38400; + long mac_address = 127; + + pEnv = getenv("BACNET_MSTP_DEBUG"); + if (pEnv) { + dlenv_debug_enable(); + } + pEnv = getenv("BACNET_MAX_INFO_FRAMES"); + if (pEnv) { + max_info_frames = strtol(pEnv, NULL, 0); + } + pEnv = getenv("BACNET_MAX_MASTER"); + if (pEnv) { + max_master = strtol(pEnv, NULL, 0); + } + pEnv = getenv("BACNET_MSTP_BAUD"); + if (pEnv) { + baud_rate = strtol(pEnv, NULL, 0); + } + pEnv = getenv("BACNET_MSTP_MAC"); + if (pEnv) { + mac_address = strtol(pEnv, NULL, 0); + } +#ifdef BACDL_MSTP + dlmstp_set_max_info_frames(max_info_frames); + dlmstp_set_max_master(max_master); + dlmstp_set_baud_rate(baud_rate); + dlmstp_set_mac_address(mac_address); +#endif Network_Port_Object_Instance_Number_Set(0, instance); Network_Port_Name_Set(instance, "MS/TP Port"); Network_Port_Type_Set(instance, PORT_TYPE_MSTP); - Network_Port_MSTP_Max_Master_Set(instance, dlmstp_max_master()); - Network_Port_MSTP_Max_Info_Frames_Set(instance, dlmstp_max_info_frames()); - Network_Port_Link_Speed_Set(instance, dlmstp_baud_rate()); - mac[0] = dlmstp_mac_address(); + Network_Port_MSTP_Max_Master_Set(instance, max_master); + Network_Port_MSTP_Max_Info_Frames_Set(instance, max_info_frames); + Network_Port_Link_Speed_Set(instance, baud_rate); + mac[0] = mac_address; Network_Port_MAC_Address_Set(instance, &mac[0], 1); /* common NP data */ Network_Port_Reliability_Set(instance, RELIABILITY_NO_FAULT_DETECTED); @@ -434,26 +464,52 @@ void dlenv_network_port_init(void) since they are already set */ Network_Port_Changes_Pending_Set(instance, false); } -#elif defined(BACDL_BIP6) + /** * Datalink network port object settings */ -void dlenv_network_port_init(void) +void dlenv_network_port_bip6_init(uint32_t instance) { - uint32_t instance = 1; uint8_t prefix = 0; BACNET_ADDRESS addr = { 0 }; BACNET_IP6_ADDRESS addr6 = { 0 }; + uint16_t port = 0xBAC0; + char *pEnv = NULL; + pEnv = getenv("BACNET_BIP6_DEBUG"); + if (pEnv) { +#if defined(BACDL_BIP6) + bip6_debug_enable(); + bvlc6_debug_enable(); +#endif + dlenv_debug_enable(); + } + pEnv = getenv("BACNET_BIP6_BROADCAST"); + if (pEnv) { + bvlc6_address_set( + &addr6, (uint16_t)strtol(pEnv, NULL, 0), 0, 0, 0, 0, 0, 0, + BIP6_MULTICAST_GROUP_ID); + } else { + bvlc6_address_set( + &addr6, BIP6_MULTICAST_SITE_LOCAL, 0, 0, 0, 0, 0, 0, + BIP6_MULTICAST_GROUP_ID); + } + pEnv = getenv("BACNET_BIP6_PORT"); + if (pEnv) { + port = (uint16_t)strtol(pEnv, NULL, 0); + } +#if defined(BACDL_BIP6) + bip6_set_broadcast_addr(&addr6); + bip6_set_port(port); + bip6_get_my_address(&addr); + bip6_get_addr(&addr6); +#endif Network_Port_Object_Instance_Number_Set(0, instance); Network_Port_Name_Set(instance, "BACnet/IPv6 Port"); Network_Port_Type_Set(instance, PORT_TYPE_BIP6); - Network_Port_BIP6_Port_Set(instance, bip6_get_port()); - bip6_get_my_address(&addr); + Network_Port_BIP6_Port_Set(instance, port); Network_Port_MAC_Address_Set(instance, &addr.mac[0], addr.mac_len); - bip6_get_addr(&addr6); Network_Port_IPv6_Address_Set(instance, &addr6.address[0]); - bip6_get_broadcast_addr(&addr6); Network_Port_IPv6_Multicast_Address_Set(instance, &addr6.address[0]); Network_Port_IPv6_Subnet_Prefix_Set(instance, prefix); @@ -467,49 +523,45 @@ void dlenv_network_port_init(void) since they are already set */ Network_Port_Changes_Pending_Set(instance, false); } -#elif defined(BACDL_BSC) + /** * @brief Datalink network port object settings - * @param primary_hub_uri - * @param failover_hub_uri - * @param filename_ca_1_cert - * @param filename_ca_2_cert - * @param filename_cert - * @param filename_key - * @param direct_connect_port - * @param hub_function_port - * @param direct_connect_initiate - * @param direct_connect_accept_urls */ -static void bacnet_secure_connect_network_port_init( - char *primary_hub_uri, - char *failover_hub_uri, - char *filename_ca_1_cert, - char *filename_ca_2_cert, - char *filename_cert, - char *filename_key, - char *direct_binding, - char *hub_binding, - char *direct_connect_initiate, - char *direct_connect_accept_urls) +static void bacnet_secure_connect_network_port_init(uint32_t instance) { - const uint32_t instance = 1; +#ifdef BACDL_BSC BACNET_SC_UUID uuid = { 0 }; BACNET_SC_VMAC_ADDRESS vmac = { 0 }; - long seed; - char c; + char *primary_hub_uri; + char *failover_hub_uri; + char *filename_ca_1_cert; + char *filename_ca_2_cert; + char *filename_cert; + char *filename_key; + char *direct_binding; + char *hub_binding; + char *direct_connect_initiate; + char *direct_connect_accept_urls; - seed = (long)&instance; - srand((int)seed); + primary_hub_uri = getenv("BACNET_SC_PRIMARY_HUB_URI"); + failover_hub_uri = getenv("BACNET_SC_FAILOVER_HUB_URI"); + filename_ca_1_cert = getenv("BACNET_SC_ISSUER_1_CERTIFICATE_FILE"); + filename_ca_2_cert = getenv("BACNET_SC_ISSUER_2_CERTIFICATE_FILE"); + filename_cert = getenv("BACNET_SC_OPERATIONAL_CERTIFICATE_FILE"); + filename_key = getenv("BACNET_SC_OPERATIONAL_CERTIFICATE_PRIVATE_KEY_FILE"); + direct_binding = getenv("BACNET_SC_DIRECT_CONNECT_BINDING"); + hub_binding = getenv("BACNET_SC_HUB_FUNCTION_BINDING"); + direct_connect_initiate = getenv("BACNET_SC_DIRECT_CONNECT_INITIATE"); + direct_connect_accept_urls = getenv("BACNET_SC_DIRECT_CONNECT_ACCEPT_URLS"); +#endif + if (getenv("BACNET_SC_DEBUG")) { + dlenv_debug_enable(); + } + srand((unsigned int)instance); Network_Port_Object_Instance_Number_Set(0, instance); Network_Port_Name_Set(instance, "BACnet/BSC Port"); Network_Port_Type_Set(instance, PORT_TYPE_BSC); - bsc_generate_random_uuid(&uuid); - Network_Port_SC_Local_UUID_Set(instance, (BACNET_UUID *)&uuid); - bsc_generate_random_vmac(&vmac); - Network_Port_MAC_Address_Set(instance, vmac.address, sizeof(vmac)); - /* common NP data */ Network_Port_Reliability_Set(instance, RELIABILITY_NO_FAULT_DETECTED); Network_Port_Out_Of_Service_Set(instance, false); @@ -518,6 +570,14 @@ static void bacnet_secure_connect_network_port_init( Network_Port_Network_Number_Set(instance, 0); /* SC parameters */ +#ifdef BACDL_BSC + if (!bsc_cert_files_check()) { + exit(1); + } + bsc_generate_random_uuid(&uuid); + Network_Port_SC_Local_UUID_Set(instance, (BACNET_UUID *)&uuid); + bsc_generate_random_vmac(&vmac); + Network_Port_MAC_Address_Set(instance, vmac.address, sizeof(vmac)); Network_Port_Max_BVLC_Length_Accepted_Set(instance, SC_NETPORT_BVLC_MAX); Network_Port_Max_NPDU_Length_Accepted_Set(instance, SC_NETPORT_NPDU_MAX); Network_Port_SC_Connect_Wait_Timeout_Set( @@ -588,6 +648,7 @@ static void bacnet_secure_connect_network_port_init( Network_Port_SC_Direct_Connect_Accept_Enable_Set( instance, direct_binding != NULL); + char c; c = direct_connect_initiate ? direct_connect_initiate[0] : '0'; if ((c != '0') && (c != 'n') && (c != 'N')) { Network_Port_SC_Direct_Connect_Initiate_Enable_Set(instance, true); @@ -601,12 +662,13 @@ static void bacnet_secure_connect_network_port_init( /* HUB parameters */ Network_Port_SC_Hub_Function_Binding_Set(instance, hub_binding); Network_Port_SC_Hub_Function_Enable_Set(instance, hub_binding != NULL); - +#endif /* last thing - clear pending changes - we don't want to set these since they are already set */ Network_Port_Changes_Pending_Set(instance, false); } +#if defined(BACDL_BSC) static bool dlenv_hub_connection_status_check(void) { uint32_t instance = Network_Port_Index_To_Instance(0); @@ -624,14 +686,16 @@ static bool dlenv_hub_connection_status_check(void) return false; } +#endif /** * Datalink network port object settings for BACnet/SC */ -void dlenv_network_port_init(void) +void dlenv_network_port_bsc_init(void) { +#if defined(BACDL_BSC) /* if a user has configured BACnet/SC port with primary hub URI, */ - /* wait for a establishin of a connection to BACnet/SC hub at first */ + /* wait for a establishing of a connection to BACnet/SC hub at first */ /* to reduce possibility of packet losses. */ if (Network_Port_SC_Primary_Hub_URI_char(1)) { while (!dlenv_hub_connection_status_check()) { @@ -639,17 +703,8 @@ void dlenv_network_port_init(void) bsc_maintenance_timer(1); } } -} -#else -/** - * Datalink network port object settings - */ -void dlenv_network_port_init(void) -{ - /* do nothing */ -} -#endif #endif +} /** Datalink maintenance timer * @ingroup DataLink @@ -659,7 +714,6 @@ void dlenv_network_port_init(void) */ void dlenv_maintenance_timer(uint16_t elapsed_seconds) { -#if defined(BACDL_BIP) || defined(BACDL_BIP6) if (BBMD_Timer_Seconds) { if (BBMD_Timer_Seconds <= elapsed_seconds) { BBMD_Timer_Seconds = 0; @@ -667,16 +721,18 @@ void dlenv_maintenance_timer(uint16_t elapsed_seconds) BBMD_Timer_Seconds -= elapsed_seconds; } if (BBMD_Timer_Seconds == 0) { - (void)dlenv_register_as_foreign_device(); + if (Network_Port_Type(Network_Port_Instance) == PORT_TYPE_BIP) { + bbmd_register_as_foreign_device(); + } else if ( + Network_Port_Type(Network_Port_Instance) == PORT_TYPE_BIP6) { + bbmd6_register_as_foreign_device(); + } /* If that failed (negative), maybe just a network issue. * If nothing happened (0), may be un/misconfigured. * Set up to try again later in all cases. */ BBMD_Timer_Seconds = (uint16_t)BBMD_TTL_Seconds; } } -#else - (void)elapsed_seconds; -#endif } /** Initialize the DataLink configuration from Environment variables, @@ -754,160 +810,78 @@ void dlenv_maintenance_timer(uint16_t elapsed_seconds) */ void dlenv_init(void) { -#if defined(BACDL_BIP) - BACNET_IP_ADDRESS addr; -#endif -#if defined(BACDL_BIP6) - BACNET_IP6_ADDRESS addr6; -#endif char *pEnv = NULL; + uint8_t port_type = PORT_TYPE_BIP; #if defined(BACDL_MULTIPLE) pEnv = getenv("BACNET_DATALINK"); if (pEnv) { datalink_set(pEnv); + if (bacnet_stricmp("none", pEnv) == 0) { + port_type = PORT_TYPE_NON_BACNET; + } else if (bacnet_stricmp("bip", pEnv) == 0) { + port_type = PORT_TYPE_BIP; + } else if (bacnet_stricmp("bip6", pEnv) == 0) { + port_type = PORT_TYPE_BIP6; + } else if (bacnet_stricmp("ethernet", pEnv) == 0) { + port_type = PORT_TYPE_ETHERNET; + } else if (bacnet_stricmp("arcnet", pEnv) == 0) { + port_type = PORT_TYPE_ARCNET; + } else if (bacnet_stricmp("mstp", pEnv) == 0) { + port_type = PORT_TYPE_MSTP; + } else if (bacnet_stricmp("bsc", pEnv) == 0) { + port_type = PORT_TYPE_BSC; + } } else { #if defined(BACDL_BIP) datalink_set("bip"); + port_type = PORT_TYPE_BIP; #elif defined(BACDL_BIP6) datalink_set("bip6"); + port_type = PORT_TYPE__BIP6; #elif defined(BACDL_MSTP) datalink_set("mstp"); + port_type = PORT_TYPE_MSTP; #elif defined(BACDL_ETHERNET) datalink_set("ethernet"); + port_type = PORT_TYPE_ETHERNET; #elif defined(BACDL_ARCNET) datalink_set("arcnet"); + port_type = PORT_TYPE_ARCNET; #elif defined(BACDL_BSC) datalink_set("bsc"); + port_type = PORT_TYPE_BSC; #else datalink_set("none"); + port_type = PORT_TYPE_NON_BACNET; #endif } #endif -#if defined(BACDL_BIP6) - pEnv = getenv("BACNET_BIP6_DEBUG"); - if (pEnv) { - bip6_debug_enable(); - bvlc6_debug_enable(); - Datalink_Debug = true; + Network_Port_Type_Set(Network_Port_Instance, port_type); + switch (port_type) { + case PORT_TYPE_BIP: + dlenv_network_port_bip_init(Network_Port_Instance); + break; + case PORT_TYPE_MSTP: + dlenv_network_port_mstp_init(Network_Port_Instance); + break; + case PORT_TYPE_BIP6: + dlenv_network_port_bip6_init(Network_Port_Instance); + break; + case PORT_TYPE_BSC: + dlenv_network_port_bsc_init(); + bacnet_secure_connect_network_port_init(Network_Port_Instance); + break; + default: + break; } - pEnv = getenv("BACNET_BIP6_BROADCAST"); - if (pEnv) { - bvlc6_address_set( - &addr6, (uint16_t)strtol(pEnv, NULL, 0), 0, 0, 0, 0, 0, 0, - BIP6_MULTICAST_GROUP_ID); - bip6_set_broadcast_addr(&addr6); - } else { - bvlc6_address_set( - &addr6, BIP6_MULTICAST_SITE_LOCAL, 0, 0, 0, 0, 0, 0, - BIP6_MULTICAST_GROUP_ID); - bip6_set_broadcast_addr(&addr6); - } - pEnv = getenv("BACNET_BIP6_PORT"); - if (pEnv) { - bip6_set_port((uint16_t)strtol(pEnv, NULL, 0)); - } else { - bip6_set_port(0xBAC0); - } -#endif -#if defined(BACDL_BIP) - pEnv = getenv("BACNET_IP_DEBUG"); - if (pEnv) { - bip_debug_enable(); - bvlc_debug_enable(); - bip_dl_debug_enable(); - } - pEnv = getenv("BACNET_IP_PORT"); - if (pEnv) { - bip_set_port((uint16_t)strtol(pEnv, NULL, 0)); - } else { - /* BIP_Port is statically initialized to 0xBAC0, - * so if it is different, then it was programmatically altered, - * and we shouldn't just stomp on it here. - * Unless it is set below 1024, since: - * "The range for well-known ports managed by the IANA is 0-1023." - */ - if (bip_get_port() < 1024) { - bip_set_port(0xBAC0); - } - } - pEnv = getenv("BACNET_IP_BROADCAST_BIND_ADDR"); - if (pEnv) { - bip_set_broadcast_binding(pEnv); - } - pEnv = getenv("BACNET_IP_NAT_ADDR"); - if (pEnv) { - if (bip_get_addr_by_name(pEnv, &addr)) { - addr.port = 0xBAC0; - pEnv = getenv("BACNET_IP_NAT_PORT"); - if (pEnv) { - addr.port = strtol(pEnv, NULL, 0); - } - bvlc_set_global_address_for_nat(&addr); - } - } -#elif defined(BACDL_MSTP) - pEnv = getenv("BACNET_MAX_INFO_FRAMES"); - if (pEnv) { - dlmstp_set_max_info_frames(strtol(pEnv, NULL, 0)); - } else { - dlmstp_set_max_info_frames(1); - } - pEnv = getenv("BACNET_MAX_MASTER"); - if (pEnv) { - dlmstp_set_max_master(strtol(pEnv, NULL, 0)); - } else { - dlmstp_set_max_master(127); - } - pEnv = getenv("BACNET_MSTP_BAUD"); - if (pEnv) { - dlmstp_set_baud_rate(strtol(pEnv, NULL, 0)); - } else { - dlmstp_set_baud_rate(38400); - } - pEnv = getenv("BACNET_MSTP_MAC"); - if (pEnv) { - dlmstp_set_mac_address(strtol(pEnv, NULL, 0)); - } else { - dlmstp_set_mac_address(127); - } -#elif defined(BACDL_BSC) - char *primary_hub_uri; - char *failover_hub_uri; - char *filename_ca_1_cert; - char *filename_ca_2_cert; - char *filename_cert; - char *filename_key; - char *direct_binding; - char *hub_binding; - char *direct_connect_initiate; - char *direct_connect_accept_urls; - - primary_hub_uri = getenv("BACNET_SC_PRIMARY_HUB_URI"); - failover_hub_uri = getenv("BACNET_SC_FAILOVER_HUB_URI"); - filename_ca_1_cert = getenv("BACNET_SC_ISSUER_1_CERTIFICATE_FILE"); - filename_ca_2_cert = getenv("BACNET_SC_ISSUER_2_CERTIFICATE_FILE"); - filename_cert = getenv("BACNET_SC_OPERATIONAL_CERTIFICATE_FILE"); - filename_key = getenv("BACNET_SC_OPERATIONAL_CERTIFICATE_PRIVATE_KEY_FILE"); - direct_binding = getenv("BACNET_SC_DIRECT_CONNECT_BINDING"); - hub_binding = getenv("BACNET_SC_HUB_FUNCTION_BINDING"); - direct_connect_initiate = getenv("BACNET_SC_DIRECT_CONNECT_INITIATE"); - direct_connect_accept_urls = getenv("BACNET_SC_DIRECT_CONNECT_ACCEPT_URLS"); - bacnet_secure_connect_network_port_init( - primary_hub_uri, failover_hub_uri, filename_ca_1_cert, - filename_ca_2_cert, filename_cert, filename_key, direct_binding, - hub_binding, direct_connect_initiate, direct_connect_accept_urls); - if (!bsc_cert_files_check()) { - exit(1); - } -#endif pEnv = getenv("BACNET_APDU_TIMEOUT"); if (pEnv) { apdu_timeout_set((uint16_t)strtol(pEnv, NULL, 0)); } else { -#if defined(BACDL_MSTP) - apdu_timeout_set(60000); -#endif + if (port_type == PORT_TYPE_MSTP) { + apdu_timeout_set(60000); + } } pEnv = getenv("BACNET_APDU_RETRIES"); if (pEnv) { @@ -923,8 +897,9 @@ void dlenv_init(void) tsm_invokeID_set((uint8_t)strtol(pEnv, NULL, 0)); } #endif -#if (BACNET_PROTOCOL_REVISION >= 17) - dlenv_network_port_init(); -#endif - dlenv_register_as_foreign_device(); + if (port_type == PORT_TYPE_BIP) { + bbmd_register_as_foreign_device(); + } else if (port_type == PORT_TYPE_BIP6) { + bbmd6_register_as_foreign_device(); + } } diff --git a/src/bacnet/datalink/dlenv.h b/src/bacnet/datalink/dlenv.h index b7d5feef..be1fac85 100644 --- a/src/bacnet/datalink/dlenv.h +++ b/src/bacnet/datalink/dlenv.h @@ -24,10 +24,10 @@ BACNET_STACK_EXPORT void dlenv_init(void); BACNET_STACK_EXPORT -void bip_dl_debug_enable(void); +void dlenv_debug_disable(void); BACNET_STACK_EXPORT -void bip_dl_debug_disable(void); +void dlenv_debug_enable(void); BACNET_STACK_EXPORT int dlenv_register_as_foreign_device(void);