Feature/makefile add apps library (#218)

* add BACnet stack library at apps/lib

* convert apps to use apps/lib for smaller binary

* fix -DBACDL_ALL=1 build

* fix piface build

* datalink MAX_MPDU and MAX_HEADER cleanup

* add bip6 to git workflow

* fix system library dependency of BACnet library

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
Steve Karg
2022-01-29 15:55:40 -06:00
committed by GitHub
parent 9c72572692
commit 295f127c2b
79 changed files with 917 additions and 1104 deletions
+6 -6
View File
@@ -77,7 +77,7 @@ static bool BVLC_NAT_Handling = false;
static BACNET_IP_ADDRESS Remote_BBMD;
#if BBMD_ENABLED
/* local buffer & length for sending */
static uint8_t BVLC_Buffer[MAX_MPDU];
static uint8_t BVLC_Buffer[BIP_MPDU_MAX];
static uint16_t BVLC_Buffer_Len;
/* Broadcast Distribution Table */
#ifndef MAX_BBMD_ENTRIES
@@ -317,7 +317,7 @@ static uint16_t bbmd_forward_npdu(
BACNET_IP_ADDRESS *bip_src, uint8_t *npdu, uint16_t npdu_length)
{
BACNET_IP_ADDRESS broadcast_address = { 0 };
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
mtu_len = (uint16_t)bvlc_encode_forwarded_npdu(
@@ -345,7 +345,7 @@ static uint16_t bbmd_bdt_forward_npdu(BACNET_IP_ADDRESS *bip_src,
uint16_t npdu_length,
bool original)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
unsigned i = 0; /* loop counter */
BACNET_IP_ADDRESS bip_dest = { 0 };
@@ -410,7 +410,7 @@ static uint16_t bbmd_fdt_forward_npdu(BACNET_IP_ADDRESS *bip_src,
uint16_t npdu_length,
bool original)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
unsigned i = 0; /* loop counter */
BACNET_IP_ADDRESS bip_dest = { 0 };
@@ -566,7 +566,7 @@ int bvlc_send_pdu(BACNET_ADDRESS *dest,
unsigned pdu_len)
{
BACNET_IP_ADDRESS bvlc_dest = { 0 };
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
#if BBMD_ENABLED
BACNET_IP_ADDRESS bip_src = { 0 };
@@ -633,7 +633,7 @@ int bvlc_send_pdu(BACNET_ADDRESS *dest,
*/
static int bvlc_send_result(BACNET_IP_ADDRESS *dest_addr, uint16_t result_code)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
mtu_len = bvlc_encode_result(&mtu[0], sizeof(mtu), result_code);
+7 -7
View File
@@ -67,7 +67,7 @@ static uint8_t BVLC6_Function_Code = BVLC6_RESULT;
static BACNET_IP6_ADDRESS Remote_BBMD;
#if defined(BACDL_BIP6) && BBMD6_ENABLED
/* local buffer & length for sending */
static uint8_t BVLC6_Buffer[MAX_MPDU];
static uint8_t BVLC6_Buffer[BIP6_MPDU_MAX];
static uint16_t BVLC6_Buffer_Len;
/* Broadcast Distribution Table */
#ifndef MAX_BBMD6_ENTRIES
@@ -281,7 +281,7 @@ int bvlc6_send_pdu(BACNET_ADDRESS *dest,
unsigned pdu_len)
{
BACNET_IP6_ADDRESS bvlc_dest = { { 0 } };
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP6_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
uint32_t vmac_src = 0;
uint32_t vmac_dst = 0;
@@ -403,7 +403,7 @@ static void bbmd6_send_forward_npdu(BACNET_IP6_ADDRESS *address,
uint8_t *npdu,
unsigned int npdu_len)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP6_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
unsigned i = 0; /* loop counter */
@@ -443,7 +443,7 @@ static void bbmd6_send_forward_npdu(BACNET_IP6_ADDRESS *address,
static int bvlc6_send_result(
BACNET_IP6_ADDRESS *dest_addr, uint32_t vmac_src, uint16_t result_code)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP6_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
mtu_len = bvlc6_encode_result(&mtu[0], sizeof(mtu), vmac_src, result_code);
@@ -465,7 +465,7 @@ static int bvlc6_send_result(
static int bvlc6_send_address_resolution_ack(
BACNET_IP6_ADDRESS *dest_addr, uint32_t vmac_src, uint32_t vmac_dst)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP6_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
mtu_len = bvlc6_encode_address_resolution_ack(
@@ -489,7 +489,7 @@ static int bvlc6_send_address_resolution_ack(
static int bvlc6_send_virtual_address_resolution_ack(
BACNET_IP6_ADDRESS *dest_addr, uint32_t vmac_src, uint32_t vmac_dst)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP6_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
mtu_len = bvlc6_encode_virtual_address_resolution_ack(
@@ -1036,7 +1036,7 @@ int bvlc6_register_with_bbmd(BACNET_IP6_ADDRESS *bbmd_addr,
uint32_t vmac_src,
uint16_t time_to_live_seconds)
{
uint8_t mtu[MAX_MPDU] = { 0 };
uint8_t mtu[BIP6_MPDU_MAX] = { 0 };
uint16_t mtu_len = 0;
mtu_len = bvlc6_encode_register_foreign_device(
+2 -2
View File
@@ -32,8 +32,8 @@
#include "bacnet/npdu.h"
/* specific defines for ARCNET */
#define MAX_HEADER (1+1+2+2+1+1+1+1)
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
#define ARCNET_HEADER_MAX (1+1+2+2+1+1+1+1)
#define ARCNET_MPDU_MAX (ARCNET_HEADER_MAX+MAX_PDU)
#ifdef __cplusplus
extern "C" {
-2
View File
@@ -35,8 +35,6 @@
/* specific defines for BACnet/IP over Ethernet */
#define BIP_HEADER_MAX (1 + 1 + 2)
#define BIP_MPDU_MAX (BIP_HEADER_MAX + MAX_PDU)
/* for legacy demo applications */
#define MAX_MPDU BIP_MPDU_MAX
#ifdef __cplusplus
extern "C" {
-2
View File
@@ -24,8 +24,6 @@
/* specific defines for BACnet/IP over Ethernet */
#define BIP6_HEADER_MAX (1 + 1 + 2)
#define BIP6_MPDU_MAX (BIP6_HEADER_MAX+MAX_PDU)
/* for legacy demo applications */
#define MAX_MPDU BIP6_MPDU_MAX
#ifdef __cplusplus
extern "C" {
+245 -85
View File
@@ -37,104 +37,264 @@
#if defined(BACDL_ALL) || defined FOR_DOXYGEN
#include "bacnet/datalink/ethernet.h"
#include "bacnet/datalink/bip.h"
#include "bacnet/datalink/bip6.h"
#include "bacnet/datalink/bvlc.h"
#include "bacnet/basic/bbmd/h_bbmd.h"
#include "bacnet/datalink/bip6.h"
#include "bacnet/datalink/bvlc6.h"
#include "bacnet/basic/bbmd6/h_bbmd6.h"
#include "bacnet/datalink/arcnet.h"
#include "bacnet/datalink/dlmstp.h"
#include <string.h>
/* Function pointers - point to your datalink */
/** Function template to Initialize the DataLink services at the given
interface.
* @ingroup DLTemplates
*
* @note For Linux, ifname is eth0, ath0, arc0, ttyS0, and others.
For Windows, ifname is the COM port or dotted ip address of the
interface.
* @param ifname [in] The named interface to use for the network layer.
* @return True if the interface is successfully initialized,
* else False if the initialization fails.
*/
bool (*datalink_init)(char *ifname);
/** Function template to send a packet via the DataLink.
* @ingroup DLTemplates
*
* @param dest [in] Destination address.
* @param npdu_data [in] The NPDU header (Network) information.
* @param pdu [in] Buffer of data to be sent - may be null.
* @param pdu_len [in] Number of bytes in the pdu buffer.
* @return Number of bytes sent on success, negative number on failure.
*/
int (*datalink_send_pdu)(BACNET_ADDRESS *dest,
BACNET_NPDU_DATA *npdu_data,
uint8_t *pdu,
unsigned pdu_len);
uint16_t (*datalink_receive)(
BACNET_ADDRESS *src, uint8_t *pdu, uint16_t max_pdu, unsigned timeout);
/** Function template to close the DataLink services and perform any cleanup.
* @ingroup DLTemplates
*/
void (*datalink_cleanup)(void);
void (*datalink_get_broadcast_address)(BACNET_ADDRESS *dest);
void (*datalink_get_my_address)(BACNET_ADDRESS *my_address);
static enum {
DATALINK_NONE = 0,
DATALINK_ARCNET,
DATALINK_ETHERNET,
DATALINK_BIP,
DATALINK_BIP6,
DATALINK_MSTP
} Datalink_Transport;
void datalink_set(char *datalink_string)
{
if (strcasecmp("bip", datalink_string) == 0) {
datalink_init = bip_init;
datalink_send_pdu = bip_send_pdu;
datalink_receive = bip_receive;
datalink_cleanup = bip_cleanup;
datalink_get_broadcast_address = bip_get_broadcast_address;
datalink_get_my_address = bip_get_my_address;
} else if (strcasecmp("bvlc", datalink_string) == 0) {
datalink_init = bip_init;
datalink_send_pdu = bvlc_send_pdu;
datalink_receive = bvlc_receive;
datalink_cleanup = bip_cleanup;
datalink_get_broadcast_address = bip_get_broadcast_address;
datalink_get_my_address = bip_get_my_address;
Datalink_Transport = DATALINK_BIP;
} else if (strcasecmp("bip6", datalink_string) == 0) {
datalink_init = bip6_init;
datalink_send_pdu = bip6_send_pdu;
datalink_receive = bip6_receive;
datalink_cleanup = bip6_cleanup;
datalink_get_broadcast_address = bip6_get_broadcast_address;
datalink_get_my_address = bip6_get_my_address;
} else if (strcasecmp("bvlc6", datalink_string) == 0) {
datalink_init = bip6_init;
datalink_send_pdu = bvlc6_send_pdu;
datalink_receive = bvlc6_receive;
datalink_cleanup = bip6_cleanup;
datalink_get_broadcast_address = bip6_get_broadcast_address;
datalink_get_my_address = bip6_get_my_address;
Datalink_Transport = DATALINK_BIP6;
} else if (strcasecmp("ethernet", datalink_string) == 0) {
datalink_init = ethernet_init;
datalink_send_pdu = ethernet_send_pdu;
datalink_receive = ethernet_receive;
datalink_cleanup = ethernet_cleanup;
datalink_get_broadcast_address = ethernet_get_broadcast_address;
datalink_get_my_address = ethernet_get_my_address;
Datalink_Transport = DATALINK_ETHERNET;
} else if (strcasecmp("arcnet", datalink_string) == 0) {
datalink_init = arcnet_init;
datalink_send_pdu = arcnet_send_pdu;
datalink_receive = arcnet_receive;
datalink_cleanup = arcnet_cleanup;
datalink_get_broadcast_address = arcnet_get_broadcast_address;
datalink_get_my_address = arcnet_get_my_address;
Datalink_Transport = DATALINK_ARCNET;
} else if (strcasecmp("mstp", datalink_string) == 0) {
datalink_init = dlmstp_init;
datalink_send_pdu = dlmstp_send_pdu;
datalink_receive = dlmstp_receive;
datalink_cleanup = dlmstp_cleanup;
datalink_get_broadcast_address = dlmstp_get_broadcast_address;
datalink_get_my_address = dlmstp_get_my_address;
Datalink_Transport = DATALINK_MSTP;
} else if (strcasecmp("none", datalink_string) == 0) {
Datalink_Transport = DATALINK_NONE;
}
}
bool datalink_init(char *ifname)
{
bool status = false;
switch (Datalink_Transport) {
case DATALINK_NONE:
status = true;
break;
case DATALINK_ARCNET:
status = arcnet_init(ifname);
break;
case DATALINK_ETHERNET:
status = ethernet_init(ifname);
break;
case DATALINK_BIP:
status = bip_init(ifname);
break;
case DATALINK_BIP6:
status = bip6_init(ifname);
break;
case DATALINK_MSTP:
status = dlmstp_init(ifname);
break;
default:
break;
}
return status;
}
int datalink_send_pdu(BACNET_ADDRESS *dest,
BACNET_NPDU_DATA *npdu_data,
uint8_t *pdu,
unsigned pdu_len)
{
int bytes = 0;
switch (Datalink_Transport) {
case DATALINK_NONE:
bytes = pdu_len;
break;
case DATALINK_ARCNET:
bytes = arcnet_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_ETHERNET:
bytes = ethernet_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_BIP:
bytes = bip_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_BIP6:
bytes = bip6_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
case DATALINK_MSTP:
bytes = dlmstp_send_pdu(
dest, npdu_data, pdu, pdu_len);
break;
default:
break;
}
return bytes;
}
uint16_t datalink_receive(
BACNET_ADDRESS *src, uint8_t *pdu, uint16_t max_pdu, unsigned timeout)
{
uint16_t bytes = 0;
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
bytes = arcnet_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_ETHERNET:
bytes = ethernet_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_BIP:
bytes = bip_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_BIP6:
bytes = bip6_receive(
src, pdu, max_pdu, timeout);
break;
case DATALINK_MSTP:
bytes = dlmstp_receive(
src, pdu, max_pdu, timeout);
break;
default:
break;
}
return bytes;
}
void datalink_cleanup(void)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
arcnet_cleanup();
break;
case DATALINK_ETHERNET:
ethernet_cleanup();
break;
case DATALINK_BIP:
bip_cleanup();
break;
case DATALINK_BIP6:
bip6_cleanup();
break;
case DATALINK_MSTP:
dlmstp_cleanup();
break;
default:
break;
}
}
void datalink_get_broadcast_address(BACNET_ADDRESS *dest)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
arcnet_get_broadcast_address(dest);
break;
case DATALINK_ETHERNET:
ethernet_get_broadcast_address(dest);
break;
case DATALINK_BIP:
bip_get_broadcast_address(dest);
break;
case DATALINK_BIP6:
bip6_get_broadcast_address(dest);
break;
case DATALINK_MSTP:
dlmstp_get_broadcast_address(dest);
break;
default:
break;
}
}
void datalink_get_my_address(BACNET_ADDRESS *my_address)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
arcnet_get_my_address(my_address);
break;
case DATALINK_ETHERNET:
ethernet_get_my_address(my_address);
break;
case DATALINK_BIP:
bip_get_my_address(my_address);
break;
case DATALINK_BIP6:
bip6_get_my_address(my_address);
break;
case DATALINK_MSTP:
dlmstp_get_my_address(my_address);
break;
default:
break;
}
}
void datalink_set_interface(char *ifname)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
(void)ifname;
break;
case DATALINK_ARCNET:
(void)ifname;
break;
case DATALINK_ETHERNET:
(void)ifname;
break;
case DATALINK_BIP:
(void)ifname;
break;
case DATALINK_BIP6:
(void)ifname;
break;
case DATALINK_MSTP:
(void)ifname;
break;
default:
break;
}
}
void datalink_maintenance_timer(uint16_t seconds)
{
switch (Datalink_Transport) {
case DATALINK_NONE:
break;
case DATALINK_ARCNET:
break;
case DATALINK_ETHERNET:
break;
case DATALINK_BIP:
bvlc_maintenance_timer(seconds);
break;
case DATALINK_BIP6:
bvlc6_maintenance_timer(seconds);
break;
case DATALINK_MSTP:
break;
default:
break;
}
}
#endif
+6
View File
@@ -30,6 +30,7 @@
#if defined(BACDL_ETHERNET)
#include "bacnet/datalink/ethernet.h"
#define MAX_MPDU ETHERNET_MPDU_MAX
#define datalink_init ethernet_init
#define datalink_send_pdu ethernet_send_pdu
@@ -41,6 +42,7 @@
#elif defined(BACDL_ARCNET)
#include "bacnet/datalink/arcnet.h"
#define MAX_MPDU ARCNET_MPDU_MAX
#define datalink_init arcnet_init
#define datalink_send_pdu arcnet_send_pdu
@@ -52,6 +54,7 @@
#elif defined(BACDL_MSTP)
#include "bacnet/datalink/dlmstp.h"
#define MAX_MPDU DLMSTP_MPDU_MAX
#define datalink_init dlmstp_init
#define datalink_send_pdu dlmstp_send_pdu
@@ -65,6 +68,7 @@
#include "bacnet/datalink/bip.h"
#include "bacnet/datalink/bvlc.h"
#include "bacnet/basic/bbmd/h_bbmd.h"
#define MAX_MPDU BIP_MPDU_MAX
#define datalink_init bip_init
#define datalink_send_pdu bip_send_pdu
@@ -85,6 +89,8 @@ void routed_get_my_address(
#include "bacnet/datalink/bip6.h"
#include "bacnet/datalink/bvlc6.h"
#include "bacnet/basic/bbmd6/h_bbmd6.h"
#define MAX_MPDU BIP6_MPDU_MAX
#define datalink_init bip6_init
#define datalink_send_pdu bip6_send_pdu
#define datalink_receive bip6_receive
+5 -5
View File
@@ -33,15 +33,15 @@
/* defines specific to MS/TP */
/* preamble+type+dest+src+len+crc8+crc16 */
#define MAX_HEADER (2+1+1+1+2+1+2)
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
#define DLMSTP_HEADER_MAX (2+1+1+1+2+1+2)
#define DLMSTP_MPDU_MAX (DLMSTP_HEADER_MAX+MAX_PDU)
typedef struct dlmstp_packet {
bool ready; /* true if ready to be sent or received */
BACNET_ADDRESS address; /* source address */
uint8_t frame_type; /* type of message */
uint16_t pdu_len; /* packet length */
uint8_t pdu[MAX_MPDU]; /* packet */
uint8_t pdu[DLMSTP_MPDU_MAX]; /* packet */
} DLMSTP_PACKET;
#ifdef __cplusplus
@@ -135,12 +135,12 @@ extern "C" {
bool dlmstp_send_pdu_queue_empty(void);
BACNET_STACK_EXPORT
bool dlmstp_send_pdu_queue_full(void);
BACNET_STACK_EXPORT
uint8_t dlmstp_max_info_frames_limit(void);
BACNET_STACK_EXPORT
uint8_t dlmstp_max_master_limit(void);
#ifdef __cplusplus
}
+2 -2
View File
@@ -32,8 +32,8 @@
#include "bacnet/npdu.h"
/* specific defines for Ethernet */
#define MAX_HEADER (6+6+2+1+1+1)
#define MAX_MPDU (MAX_HEADER+MAX_PDU)
#define ETHERNET_HEADER_MAX (6+6+2+1+1+1)
#define ETHERNET_MPDU_MAX (ETHERNET_HEADER_MAX+MAX_PDU)
#ifdef __cplusplus
extern "C" {