From 98e8cf2147db3e569a52b0304d48e4734dbf541d Mon Sep 17 00:00:00 2001 From: Kari Argillander Date: Wed, 4 Sep 2024 21:32:31 +0300 Subject: [PATCH] Make it possible to select multiple datalinks (#717) * datalink/dlenv: Rename addr -> addr6 when ipv6 If we are building this file with BACDL_BIP6 and BACDL_BIP enabled we get two definitions for addr. For this reason rename other addr6 so there will be no conflict. * config: Reorder MAX_APDU selection so biggest is first When multiple datalinks are selected we should guess biggest MAX_APDU. To do that we need to order selection based on biggest to lowest. With this change MAX_APDU should be more correct most of the times and user does not need to specifie that by hand. * Make it possible to select multiple datalinks Before we had option to select all datalinks. Many times you however do not need all datalinks but just some. Change logic so that it does not matter if user selects multiple datalinks. Now user just select what they want and everything should just work. * dlenv: Move variables start of function Because we use C89 we need to move variables start of block. * datalink: Hide strings.h because Windows Windows does not support strings.h. Hide it from it. --------- Co-authored-by: Kari Argillander --- CMakeLists.txt | 24 +++--- ports/arduino_uno/datalink.h | 29 ++++--- src/bacnet/basic/object/netport.c | 55 ++++++------- src/bacnet/basic/object/netport.h | 2 +- src/bacnet/config.h | 98 +++++++++++++++------- src/bacnet/datalink/datalink.c | 131 +++++++++++++++++++++++++++--- src/bacnet/datalink/datalink.h | 37 ++++++--- src/bacnet/datalink/dlenv.c | 18 ++-- 8 files changed, 279 insertions(+), 115 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 93d5db8e..b8c52b87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,33 +46,37 @@ option( option( BACDL_ETHERNET - "compile with ethernet support" + "compile with ethernet datalink support" OFF) option( BACDL_MSTP - "compile with mstp support" + "compile with mstp datalink support" OFF) option( BACDL_ARCNET - "compile with arcnet support" + "compile with arcnet datalink support" OFF) option( BACDL_BIP - "compile with ip support" + "compile with ip datalink support" ON) option( BACDL_BIP6 - "compile with ipv6 support" + "compile with ipv6 datalink support" OFF) -option( - BACDL_NONE - "compile without datalink" - OFF) +if(NOT (BACDL_ETHERNET OR + BACDL_MSTP OR + BACDL_ARCNET OR + BACDL_BIP OR + BACDL_BIP6 OR + BACDL_CUSTOM)) + add_definitions(-DBACDL_NONE) +endif() set(BACNET_PROTOCOL_REVISION 19) @@ -962,9 +966,9 @@ message(STATUS "BACNET: CMAKE_CXX_COMPILER_VERSION:.....\"${CMAKE_CXX_COMPILER_V message(STATUS "BACNET: CMAKE_BUILD_TYPE:...............\"${CMAKE_BUILD_TYPE}\"") message(STATUS "BACNET: CMAKE_INSTALL_PREFIX:...........\"${CMAKE_INSTALL_PREFIX}\"") message(STATUS "BACNET: BACNET_PROTOCOL_REVISION:.......\"${BACNET_PROTOCOL_REVISION}\"") +message(STATUS "BACNET: Selected datalinks:") message(STATUS "BACNET: BACDL_BIP6:.....................\"${BACDL_BIP6}\"") message(STATUS "BACNET: BACDL_BIP:......................\"${BACDL_BIP}\"") message(STATUS "BACNET: BACDL_ARCNET:...................\"${BACDL_ARCNET}\"") message(STATUS "BACNET: BACDL_MSTP:.....................\"${BACDL_MSTP}\"") message(STATUS "BACNET: BACDL_ETHERNET:.................\"${BACDL_ETHERNET}\"") -message(STATUS "BACNET: BACDL_NONE:.....................\"${BACDL_NONE}\"") diff --git a/ports/arduino_uno/datalink.h b/ports/arduino_uno/datalink.h index 3f55ed36..3db6e940 100644 --- a/ports/arduino_uno/datalink.h +++ b/ports/arduino_uno/datalink.h @@ -13,7 +13,22 @@ #if defined(BACDL_ETHERNET) #include "bacnet/datalink/ethernet.h" +#endif +#if defined(BACDL_ARCNET) +#include "bacnet/datalink/arcnet.h" +#endif +#if defined(BACDL_MSTP) +#include "bacnet/datalink/dlmstp.h" +#endif +#if defined(BACDL_BIP) +#include "bacnet/datalink/bip.h" +#include "bvlc-arduino.h" +#endif +#if defined(BACDL_BIP6) +#error currently not implemented for Arduino +#endif +#if defined(BACDL_ETHERNET) && !defined(BACDL_MULTIPLE) #define datalink_init ethernet_init #define datalink_send_pdu ethernet_send_pdu #define datalink_receive ethernet_receive @@ -21,9 +36,7 @@ #define datalink_get_broadcast_address ethernet_get_broadcast_address #define datalink_get_my_address ethernet_get_my_address -#elif defined(BACDL_ARCNET) -#include "bacnet/datalink/arcnet.h" - +#elif defined(BACDL_ARCNET) && !defined(BACDL_MULTIPLE) #define datalink_init arcnet_init #define datalink_send_pdu arcnet_send_pdu #define datalink_receive arcnet_receive @@ -31,9 +44,7 @@ #define datalink_get_broadcast_address arcnet_get_broadcast_address #define datalink_get_my_address arcnet_get_my_address -#elif defined(BACDL_MSTP) -#include "bacnet/datalink/dlmstp.h" - +#elif defined(BACDL_MSTP) && !defined(BACDL_MULTIPLE) #define datalink_init dlmstp_init #define datalink_send_pdu dlmstp_send_pdu #define datalink_receive dlmstp_receive @@ -41,9 +52,7 @@ #define datalink_get_broadcast_address dlmstp_get_broadcast_address #define datalink_get_my_address dlmstp_get_my_address -#elif defined(BACDL_BIP) -#include "bacnet/datalink/bip.h" -#include "bvlc-arduino.h" +#elif defined(BACDL_BIP) && !defined(BACDL_MULTIPLE) #define datalink_init bip_init // #if defined(BBMD_ENABLED) && BBMD_ENABLED @@ -62,7 +71,7 @@ extern void routed_get_my_address(BACNET_ADDRESS *my_address); #define datalink_get_my_address bip_get_my_address #endif -#else /* Ie, BACDL_ALL */ +#else /* Ie, BACDL_MULTIPLE */ #include "bacnet/npdu.h" #define MAX_HEADER (8) diff --git a/src/bacnet/basic/object/netport.c b/src/bacnet/basic/object/netport.c index 1c46ec27..2c396d4b 100644 --- a/src/bacnet/basic/object/netport.c +++ b/src/bacnet/basic/object/netport.c @@ -26,7 +26,7 @@ /* me */ #include "bacnet/basic/object/netport.h" -#if defined(BACDL_BIP6) || defined(BACDL_ALL) +#if defined(BACDL_BIP6) #include "bacnet/datalink/bvlc6.h" #endif @@ -139,17 +139,14 @@ static const int BIP_Port_Properties_Optional[] = { PROP_IP_DEFAULT_GATEWAY, PROP_IP_DNS_SERVER, PROP_IP_DHCP_ENABLE, -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) && \ - (BBMD_ENABLED || BBMD_CLIENT_ENABLED) -#if (BBMD_ENABLED) +#if defined(BACDL_BIP) && (BBMD_ENABLED) PROP_BBMD_ACCEPT_FD_REGISTRATIONS, PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE, PROP_BBMD_FOREIGN_DEVICE_TABLE, #endif -#if (BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP) && (BBMD_CLIENT_ENABLED) PROP_FD_BBMD_ADDRESS, PROP_FD_SUBSCRIPTION_LIFETIME, -#endif #endif -1 }; @@ -168,17 +165,14 @@ static const int BIP6_Port_Properties_Optional[] = { PROP_IPV6_DHCP_LEASE_TIME_REMAINING, PROP_IPV6_DHCP_SERVER, PROP_IPV6_ZONE_INDEX, -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) && \ - (BBMD_ENABLED || BBMD_CLIENT_ENABLED) -#if (BBMD_ENABLED) +#if defined(BACDL_BIP6) && (BBMD_ENABLED) PROP_BBMD_ACCEPT_FD_REGISTRATIONS, PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE, PROP_BBMD_FOREIGN_DEVICE_TABLE, #endif -#if (BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP6) && (BBMD_CLIENT_ENABLED) PROP_FD_BBMD_ADDRESS, PROP_FD_SUBSCRIPTION_LIFETIME, -#endif #endif -1 }; @@ -1654,8 +1648,7 @@ bool Network_Port_BBMD_FD_Table_Set(uint32_t object_instance, void *fdt_head) return status; } -#if (defined(BACDL_BIP) || defined(BACDL_ALL)) && \ - (BBMD_ENABLED || BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP) && (BBMD_ENABLED || BBMD_CLIENT_ENABLED) /** * For a given object instance-number, gets the ip-address and port * Note: depends on Network_Type being set for this object @@ -1875,7 +1868,7 @@ bool Network_Port_Remote_BBMD_BIP_Lifetime_Set( } /* IPv6 BBMD related getters and setters */ -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) /** * For a given object instance-number, returns the BBMD-Accept-FD-Registrations @@ -2034,7 +2027,7 @@ bool Network_Port_BBMD_IP6_FD_Table_Set( return status; } -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) && (BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP6) && (BBMD_CLIENT_ENABLED) /** * For a given object instance-number, gets the ip-address and port * Note: depends on Network_Type being set for this object @@ -2852,7 +2845,7 @@ static bool Network_Port_FD_BBMD_Address_Write( return status; } switch (Network_Port_Type(object_instance)) { -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) +#if defined(BACDL_BIP) case PORT_TYPE_BIP: if (Network_Port_BIP_Mode(object_instance) != BACNET_IP_MODE_FOREIGN) { @@ -2876,7 +2869,7 @@ static bool Network_Port_FD_BBMD_Address_Write( } break; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) case PORT_TYPE_BIP6: if (Network_Port_BIP6_Mode(object_instance) != BACNET_IP_MODE_FOREIGN) { @@ -2936,7 +2929,7 @@ static bool Network_Port_FD_Subscription_Lifetime_Write( } lifetime = (uint16_t)value; switch (Network_Port_Type(object_instance)) { -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) +#if defined(BACDL_BIP) case PORT_TYPE_BIP: if (Network_Port_BIP_Mode(object_instance) == BACNET_IP_MODE_FOREIGN) { @@ -2952,7 +2945,7 @@ static bool Network_Port_FD_Subscription_Lifetime_Write( } break; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) case PORT_TYPE_BIP6: if (Network_Port_BIP6_Mode(object_instance) == BACNET_IP_MODE_FOREIGN) { @@ -3076,11 +3069,10 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) BACNET_BIT_STRING bit_string; BACNET_OCTET_STRING octet_string; BACNET_CHARACTER_STRING char_string; -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) && \ - (BBMD_ENABLED || BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP) && (BBMD_ENABLED || BBMD_CLIENT_ENABLED) BACNET_IP_ADDRESS ip_address; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) && (BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP6) && (BBMD_CLIENT_ENABLED) BACNET_IP6_ADDRESS ip6_address; #endif uint8_t *apdu = NULL; @@ -3238,7 +3230,7 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; } break; -#if (defined(BACDL_BIP) || defined(BACDL_BIP6) || defined(BACDL_ALL)) && \ +#if (defined(BACDL_BIP) || defined(BACDL_BIP6)) && \ (BBMD_ENABLED || BBMD_CLIENT_ENABLED) #if (BBMD_ENABLED) case PROP_BBMD_ACCEPT_FD_REGISTRATIONS: @@ -3249,14 +3241,14 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) break; case PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE: switch (network_type) { -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) +#if defined(BACDL_BIP) case PORT_TYPE_BIP: apdu_len = bvlc_broadcast_distribution_table_encode( &apdu[0], rpdata->application_data_len, Network_Port_BBMD_BD_Table(rpdata->object_instance)); break; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) case PORT_TYPE_BIP6: apdu_len = bvlc6_broadcast_distribution_table_encode( &apdu[0], rpdata->application_data_len, @@ -3273,14 +3265,14 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) break; case PROP_BBMD_FOREIGN_DEVICE_TABLE: switch (network_type) { -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) +#if defined(BACDL_BIP) case PORT_TYPE_BIP: apdu_len = bvlc_foreign_device_table_encode( &apdu[0], rpdata->application_data_len, Network_Port_BBMD_FD_Table(rpdata->object_instance)); break; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) case PORT_TYPE_BIP6: apdu_len = bvlc6_foreign_device_table_encode( &apdu[0], rpdata->application_data_len, @@ -3299,8 +3291,7 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) #if (BBMD_CLIENT_ENABLED) case PROP_FD_BBMD_ADDRESS: switch (network_type) { -#if (defined(BACDL_BIP) || defined(BACDL_ALL)) && \ - (BBMD_ENABLED || BBMD_CLIENT_ENABLED) +#if defined(BACDL_BIP) && (BBMD_ENABLED || BBMD_CLIENT_ENABLED) case PORT_TYPE_BIP: Network_Port_Remote_BBMD_IP_Address_And_Port( rpdata->object_instance, &ip_address); @@ -3308,7 +3299,7 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) &apdu[0], apdu_size, &ip_address); break; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) case PORT_TYPE_BIP6: Network_Port_Remote_BBMD_IP6_Address_And_Port( rpdata->object_instance, &ip6_address); @@ -3325,7 +3316,7 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) break; case PROP_FD_SUBSCRIPTION_LIFETIME: switch (network_type) { -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) +#if defined(BACDL_BIP) case PORT_TYPE_BIP: apdu_len = encode_application_unsigned( &apdu[0], @@ -3333,7 +3324,7 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) rpdata->object_instance)); break; #endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) case PORT_TYPE_BIP6: apdu_len = encode_application_unsigned( &apdu[0], diff --git a/src/bacnet/basic/object/netport.h b/src/bacnet/basic/object/netport.h index 9d9ac0cf..2e81919e 100644 --- a/src/bacnet/basic/object/netport.h +++ b/src/bacnet/basic/object/netport.h @@ -209,7 +209,7 @@ BACNET_STACK_EXPORT bool Network_Port_Remote_BBMD_BIP_Lifetime_Set( uint32_t object_instance, uint16_t value); -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) +#if defined(BACDL_BIP6) BACNET_STACK_EXPORT bool Network_Port_BBMD_IP6_Accept_FD_Registrations(uint32_t object_instance); BACNET_STACK_EXPORT diff --git a/src/bacnet/config.h b/src/bacnet/config.h index f2cadd3b..2fe386f1 100644 --- a/src/bacnet/config.h +++ b/src/bacnet/config.h @@ -21,17 +21,66 @@ /* Note: these defines can be defined in your makefile or project or here or not defined and defaults will be used */ -/* declare a single physical layer using your compiler define. - see datalink.h for possible defines. */ -#if !( \ - defined(BACDL_ETHERNET) || defined(BACDL_ARCNET) || defined(BACDL_MSTP) || \ - defined(BACDL_BIP) || defined(BACDL_BIP6) || defined(BACDL_TEST) || \ - defined(BACDL_ALL) || defined(BACDL_NONE) || defined(BACDL_CUSTOM)) +/* Declare a physical layers using your compiler define. See + datalink.h for possible defines. */ + +/* For backward compatibility for old BACDL_ALL */ +#if defined(BACDL_ALL) +#define BACDL_ETHERNET +#define BACDL_ARCNET +#define BACDL_MSTP +#define BACDL_BIP +#define BACDL_BIP6 +#endif + +#if defined(BACDL_ETHERNET) +#define BACDL_SOME_DATALINK_ENABLED 1 +#endif + +#if defined(BACDL_ARCNET) +#if defined(BACDL_SOME_DATALINK_ENABLED) +#define BACDL_MULTIPLE 1 +#endif +#define BACDL_SOME_DATALINK_ENABLED 1 +#endif + +#if defined(BACDL_MSTP) +#if defined(BACDL_SOME_DATALINK_ENABLED) +#define BACDL_MULTIPLE 1 +#endif +#define BACDL_SOME_DATALINK_ENABLED 1 +#endif + +#if defined(BACDL_BIP) +#if defined(BACDL_SOME_DATALINK_ENABLED) +#define BACDL_MULTIPLE 1 +#endif +#define BACDL_SOME_DATALINK_ENABLED 1 +#endif + +#if defined(BACDL_BIP6) +#if defined(BACDL_SOME_DATALINK_ENABLED) +#define BACDL_MULTIPLE 1 +#endif +#define BACDL_SOME_DATALINK_ENABLED 1 +#endif + +#if defined(BACDL_CUSTOM) +#if defined(BACDL_SOME_DATALINK_ENABLED) +#define BACDL_MULTIPLE 1 +#endif +#endif + +#if defined(BACDL_SOME_DATALINK_ENABLED) && defined(BACDL_NONE) +#error "BACDL_NONE is not compatible with other BACDL_ defines" +#elif !defined(BACDL_SOME_DATALINK_ENABLED) && !defined(BACDL_NONE) && \ + !defined(BACDL_TEST) +/* If none of the datalink is enabled let's default to BIP. */ #define BACDL_BIP #endif /* optional configuration for BACnet/IP datalink layer */ -#if (defined(BACDL_BIP) || defined(BACDL_ALL)) +#if (defined(BACDL_BIP)) #if !defined(BBMD_ENABLED) #define BBMD_ENABLED 1 #endif @@ -74,35 +123,24 @@ /* #define MAX_APDU 1476 */ #if defined(BACDL_BIP) #define MAX_APDU 1476 -/* #define MAX_APDU 128 enable this IP for testing - readrange so you get the More Follows flag set */ +/* Enable this IP for testing readrange so you get the More Follows flag set */ +/* #define MAX_APDU 128 */ #elif defined(BACDL_BIP6) #define MAX_APDU 1476 -#elif defined(BACDL_ETHERNET) -#if defined(BACNET_SECURITY) -#define MAX_APDU 1420 -#else -#define MAX_APDU 1476 -#endif -#elif defined(BACDL_ARCNET) -#if defined(BACNET_SECURITY) -#define MAX_APDU 412 -#else -#define MAX_APDU 480 -#endif -#elif defined(BACDL_MSTP) -#if defined(BACNET_SECURITY) -#define MAX_APDU 412 -#else +#elif defined(BACDL_MSTP) && !defined(BACNET_SECURITY) /* note: MS/TP extended frames can be up to 1476 bytes */ #define MAX_APDU 1476 -#endif -#else -#if defined(BACNET_SECURITY) +#elif defined(BACDL_ETHERNET) && !defined(BACNET_SECURITY) +#define MAX_APDU 1476 +#elif defined(BACDL_ETHERNET) && defined(BACNET_SECURITY) +#define MAX_APDU 1420 +#elif !defined(BACNET_SECURITY) +#define MAX_APDU 480 +#elif defined(BACDL_MSTP) && defined(BACNET_SECURITY) +/* TODO: Is this really 412 or should it be 480? */ #define MAX_APDU 412 #else -#define MAX_APDU 480 -#endif +#define MAX_APDU 412 #endif #endif diff --git a/src/bacnet/datalink/datalink.c b/src/bacnet/datalink/datalink.c index 34d62b8a..8ff21208 100644 --- a/src/bacnet/datalink/datalink.c +++ b/src/bacnet/datalink/datalink.c @@ -9,17 +9,29 @@ */ #include "bacnet/datalink/datalink.h" -#if defined(BACDL_ALL) || defined FOR_DOXYGEN +#if defined(BACDL_MULTIPLE) || defined FOR_DOXYGEN +#if defined(BACDL_ETHERNET) #include "bacnet/datalink/ethernet.h" +#endif +#if defined(BACDL_BIP) #include "bacnet/datalink/bip.h" #include "bacnet/datalink/bvlc.h" #include "bacnet/basic/bbmd/h_bbmd.h" +#endif +#if defined(BACDL_BIP6) #include "bacnet/datalink/bip6.h" #include "bacnet/datalink/bvlc6.h" #include "bacnet/basic/bbmd6/h_bbmd6.h" +#endif +#if defined(BACDL_ARCNET) #include "bacnet/datalink/arcnet.h" +#endif +#if defined(BACDL_MSTP) #include "bacnet/datalink/dlmstp.h" +#endif +#ifdef HAVE_STRINGS_H #include /* for strcasecmp() */ +#endif static enum { DATALINK_NONE = 0, @@ -32,19 +44,34 @@ static enum { void datalink_set(char *datalink_string) { - if (strcasecmp("bip", datalink_string) == 0) { - Datalink_Transport = DATALINK_BIP; - } else if (strcasecmp("bip6", datalink_string) == 0) { - Datalink_Transport = DATALINK_BIP6; - } else if (strcasecmp("ethernet", datalink_string) == 0) { - Datalink_Transport = DATALINK_ETHERNET; - } else if (strcasecmp("arcnet", datalink_string) == 0) { - Datalink_Transport = DATALINK_ARCNET; - } else if (strcasecmp("mstp", datalink_string) == 0) { - Datalink_Transport = DATALINK_MSTP; - } else if (strcasecmp("none", datalink_string) == 0) { + if (strcasecmp("none", datalink_string) == 0) { Datalink_Transport = DATALINK_NONE; } +#if defined(BACDL_BIP) + else if (strcasecmp("bip", datalink_string) == 0) { + Datalink_Transport = DATALINK_BIP; + } +#endif +#if defined(BACDL_BIP6) + else if (strcasecmp("bip6", datalink_string) == 0) { + Datalink_Transport = DATALINK_BIP6; + } +#endif +#if defined(BACDL_ETHERNET) + else if (strcasecmp("ethernet", datalink_string) == 0) { + Datalink_Transport = DATALINK_ETHERNET; + } +#endif +#if defined(BACDL_ARCNET) + else if (strcasecmp("arcnet", datalink_string) == 0) { + Datalink_Transport = DATALINK_ARCNET; + } +#endif +#if defined(BACDL_MSTP) + else if (strcasecmp("mstp", datalink_string) == 0) { + Datalink_Transport = DATALINK_MSTP; + } +#endif } bool datalink_init(char *ifname) @@ -55,21 +82,31 @@ bool datalink_init(char *ifname) case DATALINK_NONE: status = true; break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: status = arcnet_init(ifname); break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: status = ethernet_init(ifname); break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: status = bip_init(ifname); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: status = bip6_init(ifname); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: status = dlmstp_init(ifname); break; +#endif default: break; } @@ -89,21 +126,31 @@ int datalink_send_pdu( case DATALINK_NONE: bytes = pdu_len; break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: bytes = arcnet_send_pdu(dest, npdu_data, pdu, pdu_len); break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: bytes = ethernet_send_pdu(dest, npdu_data, pdu, pdu_len); break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: bytes = bip_send_pdu(dest, npdu_data, pdu, pdu_len); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: bytes = bip6_send_pdu(dest, npdu_data, pdu, pdu_len); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: bytes = dlmstp_send_pdu(dest, npdu_data, pdu, pdu_len); break; +#endif default: break; } @@ -119,21 +166,31 @@ uint16_t datalink_receive( switch (Datalink_Transport) { case DATALINK_NONE: break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: bytes = arcnet_receive(src, pdu, max_pdu, timeout); break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: bytes = ethernet_receive(src, pdu, max_pdu, timeout); break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: bytes = bip_receive(src, pdu, max_pdu, timeout); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: bytes = bip6_receive(src, pdu, max_pdu, timeout); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: bytes = dlmstp_receive(src, pdu, max_pdu, timeout); break; +#endif default: break; } @@ -146,21 +203,31 @@ void datalink_cleanup(void) switch (Datalink_Transport) { case DATALINK_NONE: break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: arcnet_cleanup(); break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: ethernet_cleanup(); break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: bip_cleanup(); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: bip6_cleanup(); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: dlmstp_cleanup(); break; +#endif default: break; } @@ -171,21 +238,31 @@ void datalink_get_broadcast_address(BACNET_ADDRESS *dest) switch (Datalink_Transport) { case DATALINK_NONE: break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: arcnet_get_broadcast_address(dest); break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: ethernet_get_broadcast_address(dest); break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: bip_get_broadcast_address(dest); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: bip6_get_broadcast_address(dest); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: dlmstp_get_broadcast_address(dest); break; +#endif default: break; } @@ -196,21 +273,31 @@ void datalink_get_my_address(BACNET_ADDRESS *my_address) switch (Datalink_Transport) { case DATALINK_NONE: break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: arcnet_get_my_address(my_address); break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: ethernet_get_my_address(my_address); break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: bip_get_my_address(my_address); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: bip6_get_my_address(my_address); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: dlmstp_get_my_address(my_address); break; +#endif default: break; } @@ -222,21 +309,31 @@ void datalink_set_interface(char *ifname) case DATALINK_NONE: (void)ifname; break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: (void)ifname; break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: (void)ifname; break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: (void)ifname; break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: (void)ifname; break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: (void)ifname; break; +#endif default: break; } @@ -247,18 +344,28 @@ void datalink_maintenance_timer(uint16_t seconds) switch (Datalink_Transport) { case DATALINK_NONE: break; +#if defined(BACDL_ARCNET) case DATALINK_ARCNET: break; +#endif +#if defined(BACDL_ETHERNET) case DATALINK_ETHERNET: break; +#endif +#if defined(BACDL_BIP) case DATALINK_BIP: bvlc_maintenance_timer(seconds); break; +#endif +#if defined(BACDL_BIP6) case DATALINK_BIP6: bvlc6_maintenance_timer(seconds); break; +#endif +#if defined(BACDL_MSTP) case DATALINK_MSTP: break; +#endif default: break; } diff --git a/src/bacnet/datalink/datalink.h b/src/bacnet/datalink/datalink.h index 9e0f2412..09f46af5 100644 --- a/src/bacnet/datalink/datalink.h +++ b/src/bacnet/datalink/datalink.h @@ -14,6 +14,25 @@ #if defined(BACDL_ETHERNET) #include "bacnet/datalink/ethernet.h" +#endif +#if defined(BACDL_ARCNET) +#include "bacnet/datalink/arcnet.h" +#endif +#if defined(BACDL_MSTP) +#include "bacnet/datalink/dlmstp.h" +#endif +#if defined(BACDL_BIP) +#include "bacnet/datalink/bip.h" +#include "bacnet/datalink/bvlc.h" +#include "bacnet/basic/bbmd/h_bbmd.h" +#endif +#if defined(BACDL_BIP6) +#include "bacnet/datalink/bip6.h" +#include "bacnet/datalink/bvlc6.h" +#include "bacnet/basic/bbmd6/h_bbmd6.h" +#endif + +#if defined(BACDL_ETHERNET) && !defined(BACDL_MULTIPLE) #define MAX_MPDU ETHERNET_MPDU_MAX #define datalink_init ethernet_init @@ -24,8 +43,7 @@ #define datalink_get_my_address ethernet_get_my_address #define datalink_maintenance_timer(s) -#elif defined(BACDL_ARCNET) -#include "bacnet/datalink/arcnet.h" +#elif defined(BACDL_ARCNET) && !defined(BACDL_MULTIPLE) #define MAX_MPDU ARCNET_MPDU_MAX #define datalink_init arcnet_init @@ -36,8 +54,7 @@ #define datalink_get_my_address arcnet_get_my_address #define datalink_maintenance_timer(s) -#elif defined(BACDL_MSTP) -#include "bacnet/datalink/dlmstp.h" +#elif defined(BACDL_MSTP) && !defined(BACDL_MULTIPLE) #define MAX_MPDU DLMSTP_MPDU_MAX #define datalink_init dlmstp_init @@ -48,10 +65,7 @@ #define datalink_get_my_address dlmstp_get_my_address #define datalink_maintenance_timer(s) -#elif defined(BACDL_BIP) -#include "bacnet/datalink/bip.h" -#include "bacnet/datalink/bvlc.h" -#include "bacnet/basic/bbmd/h_bbmd.h" +#elif defined(BACDL_BIP) && !defined(BACDL_MULTIPLE) #define MAX_MPDU BIP_MPDU_MAX #define datalink_init bip_init @@ -74,10 +88,7 @@ void routed_get_my_address(BACNET_ADDRESS *my_address); #endif #define datalink_maintenance_timer(s) bvlc_maintenance_timer(s) -#elif defined(BACDL_BIP6) -#include "bacnet/datalink/bip6.h" -#include "bacnet/datalink/bvlc6.h" -#include "bacnet/basic/bbmd6/h_bbmd6.h" +#elif defined(BACDL_BIP6) && !defined(BACDL_MULTIPLE) #define MAX_MPDU BIP6_MPDU_MAX #define datalink_init bip6_init @@ -88,7 +99,7 @@ void routed_get_my_address(BACNET_ADDRESS *my_address); #define datalink_get_my_address bip6_get_my_address #define datalink_maintenance_timer(s) bvlc6_maintenance_timer(s) -#elif defined(BACDL_ALL) || defined(BACDL_NONE) || defined(BACDL_CUSTOM) +#elif !defined(BACDL_TEST) /* Multiple, none or custom datalink */ #include "bacnet/npdu.h" #define MAX_HEADER (8) diff --git a/src/bacnet/datalink/dlenv.c b/src/bacnet/datalink/dlenv.c index fa7f4872..3aa90e78 100644 --- a/src/bacnet/datalink/dlenv.c +++ b/src/bacnet/datalink/dlenv.c @@ -551,9 +551,15 @@ 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; -#if defined(BACDL_ALL) +#if defined(BACDL_MULTIPLE) pEnv = getenv("BACNET_DATALINK"); if (pEnv) { datalink_set(pEnv); @@ -562,7 +568,6 @@ void dlenv_init(void) } #endif #if defined(BACDL_BIP6) - BACNET_IP6_ADDRESS addr; pEnv = getenv("BACNET_BIP6_DEBUG"); if (pEnv) { bip6_debug_enable(); @@ -571,14 +576,14 @@ void dlenv_init(void) pEnv = getenv("BACNET_BIP6_BROADCAST"); if (pEnv) { bvlc6_address_set( - &addr, (uint16_t)strtol(pEnv, NULL, 0), 0, 0, 0, 0, 0, 0, + &addr6, (uint16_t)strtol(pEnv, NULL, 0), 0, 0, 0, 0, 0, 0, BIP6_MULTICAST_GROUP_ID); - bip6_set_broadcast_addr(&addr); + bip6_set_broadcast_addr(&addr6); } else { bvlc6_address_set( - &addr, BIP6_MULTICAST_SITE_LOCAL, 0, 0, 0, 0, 0, 0, + &addr6, BIP6_MULTICAST_SITE_LOCAL, 0, 0, 0, 0, 0, 0, BIP6_MULTICAST_GROUP_ID); - bip6_set_broadcast_addr(&addr); + bip6_set_broadcast_addr(&addr6); } pEnv = getenv("BACNET_BIP6_PORT"); if (pEnv) { @@ -588,7 +593,6 @@ void dlenv_init(void) } #endif #if defined(BACDL_BIP) - BACNET_IP_ADDRESS addr; pEnv = getenv("BACNET_IP_DEBUG"); if (pEnv) { bip_debug_enable();