Cleaned up compiler warnings and errors. Still needs to be finished.
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include "bacdef.h"
|
||||
#include "npdu.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
+128
-113
@@ -69,7 +69,7 @@ seconds remaining before the BBMD will purge the registrant's FDT
|
||||
entry if no re-registration occurs. This value will be initialized
|
||||
to the 2-octet Time-to-Live value supplied at the time of
|
||||
registration.*/
|
||||
typedef struct
|
||||
typedef struct
|
||||
{
|
||||
bool valid;
|
||||
/* BACnet/IP address */
|
||||
@@ -91,7 +91,7 @@ BACNET_BVLC_RESULT BVLC_Result_Code = BVLC_RESULT_SUCCESSFUL_COMPLETION;
|
||||
void bvlc_maintenance_timer(unsigned seconds)
|
||||
{
|
||||
unsigned i = 0;
|
||||
|
||||
|
||||
for (i = 0; i < MAX_FD_ENTRIES; i++) {
|
||||
if (FD_Table[i].valid) {
|
||||
if (FD_Table[i].seconds_remaining) {
|
||||
@@ -109,7 +109,7 @@ void bvlc_maintenance_timer(unsigned seconds)
|
||||
}
|
||||
|
||||
int bvlc_encode_bip_address(
|
||||
uint8_t * pdu, /* buffer to store encoding */
|
||||
uint8_t * pdu, /* buffer to store encoding */
|
||||
struct in_addr *address, /* in host format */
|
||||
uint16_t port)
|
||||
{
|
||||
@@ -124,34 +124,36 @@ int bvlc_encode_bip_address(
|
||||
}
|
||||
|
||||
int bvlc_decode_bip_address(
|
||||
uint8_t * pdu, /* buffer to extract encoded address */
|
||||
uint8_t * pdu, /* buffer to extract encoded address */
|
||||
struct in_addr * address, /* in host format */
|
||||
uint16_t * port)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
uint32_t raw_address = 0;
|
||||
|
||||
if (pdu) {
|
||||
(void) decode_unsigned32(&pdu[0], &(address->s_addr));
|
||||
(void) decode_unsigned32(&pdu[0], &raw_address);
|
||||
address->s_addr = raw_address;
|
||||
(void) decode_unsigned16(&pdu[4], port);
|
||||
len = 6;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/* used for both read and write entries */
|
||||
int bvlc_encode_address_entry(uint8_t * pdu,
|
||||
struct in_addr *address,
|
||||
uint16_t port,
|
||||
struct in_addr *address,
|
||||
uint16_t port,
|
||||
struct in_addr *mask)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
|
||||
if (pdu) {
|
||||
len = bvlc_encode_bip_address(pdu, address, port);
|
||||
len += encode_unsigned32(&pdu[len], mask->s_addr);
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -173,7 +175,7 @@ int bvlc_encode_bvlc_result(
|
||||
}
|
||||
|
||||
int bvlc_encode_write_bdt_init(
|
||||
uint8_t * pdu,
|
||||
uint8_t * pdu,
|
||||
unsigned entries)
|
||||
{
|
||||
int len = 0;
|
||||
@@ -187,7 +189,7 @@ int bvlc_encode_write_bdt_init(
|
||||
encode_unsigned16(&pdu[2], 4 + entries * 10);
|
||||
len = 4;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -195,7 +197,7 @@ int bvlc_encode_read_bdt(
|
||||
uint8_t * pdu)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
|
||||
if (pdu) {
|
||||
pdu[0] = BVLL_TYPE_BACNET_IP;
|
||||
pdu[1] = BVLC_READ_BROADCAST_DISTRIBUTION_TABLE;
|
||||
@@ -205,16 +207,16 @@ int bvlc_encode_read_bdt(
|
||||
encode_unsigned16(&pdu[2], 4);
|
||||
len = 4;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int bvlc_encode_read_bdt_ack_init(
|
||||
uint8_t * pdu,
|
||||
uint8_t * pdu,
|
||||
unsigned entries)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
|
||||
if (pdu) {
|
||||
pdu[0] = BVLL_TYPE_BACNET_IP;
|
||||
pdu[1] = BVLC_READ_BROADCAST_DISTRIBUTION_TABLE_ACK;
|
||||
@@ -224,7 +226,7 @@ int bvlc_encode_read_bdt_ack_init(
|
||||
encode_unsigned16(&pdu[2], 4 + entries * 10);
|
||||
len = 4;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -236,7 +238,7 @@ int bvlc_encode_read_bdt_ack(
|
||||
int len = 0;
|
||||
unsigned count = 0;
|
||||
unsigned i;
|
||||
|
||||
|
||||
for (i = 0; i < MAX_BBMD_ENTRIES; i++) {
|
||||
if (BBMD_Table[i].valid) {
|
||||
count++;
|
||||
@@ -253,24 +255,24 @@ int bvlc_encode_read_bdt_ack(
|
||||
}
|
||||
len = bvlc_encode_address_entry(
|
||||
&pdu[pdu_len],
|
||||
&BBMD_Table[i].dest_address,
|
||||
BBMD_Table[i].dest_port,
|
||||
&BBMD_Table[i].dest_address,
|
||||
BBMD_Table[i].dest_port,
|
||||
&BBMD_Table[i].broadcast_mask);
|
||||
pdu_len += len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return pdu_len;
|
||||
}
|
||||
|
||||
|
||||
int bvlc_encode_forwarded_npdu(uint8_t * pdu,
|
||||
BACNET_ADDRESS * src,
|
||||
uint8_t * npdu,
|
||||
BACNET_ADDRESS * src,
|
||||
uint8_t * npdu,
|
||||
unsigned npdu_length)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
|
||||
unsigned i; /* for loop counter */
|
||||
|
||||
if (pdu) {
|
||||
@@ -290,7 +292,7 @@ int bvlc_encode_forwarded_npdu(uint8_t * pdu,
|
||||
len++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -298,7 +300,7 @@ int bvlc_encode_register_foreign_device(uint8_t * pdu,
|
||||
uint16_t time_to_live_seconds)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
|
||||
if (pdu) {
|
||||
pdu[0] = BVLL_TYPE_BACNET_IP;
|
||||
pdu[1] = BVLC_REGISTER_FOREIGN_DEVICE;
|
||||
@@ -309,7 +311,7 @@ int bvlc_encode_register_foreign_device(uint8_t * pdu,
|
||||
encode_unsigned16(&pdu[4], time_to_live_seconds);
|
||||
len = 6;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -317,7 +319,7 @@ int bvlc_encode_read_fdt(
|
||||
uint8_t * pdu)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
|
||||
if (pdu) {
|
||||
pdu[0] = BVLL_TYPE_BACNET_IP;
|
||||
pdu[1] = BVLC_READ_FOREIGN_DEVICE_TABLE;
|
||||
@@ -332,7 +334,7 @@ int bvlc_encode_read_fdt(
|
||||
}
|
||||
|
||||
int bvlc_encode_read_fdt_ack_init(
|
||||
uint8_t * pdu,
|
||||
uint8_t * pdu,
|
||||
unsigned entries)
|
||||
{
|
||||
int len = 0;
|
||||
@@ -346,7 +348,7 @@ int bvlc_encode_read_fdt_ack_init(
|
||||
encode_unsigned16(&pdu[2], 4 + entries * 10);
|
||||
len = 4;
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -358,7 +360,7 @@ int bvlc_encode_read_fdt_ack(
|
||||
int len = 0;
|
||||
unsigned count = 0;
|
||||
unsigned i;
|
||||
|
||||
|
||||
for (i = 0; i < MAX_FD_ENTRIES; i++) {
|
||||
if (FD_Table[i].valid) {
|
||||
count++;
|
||||
@@ -375,7 +377,7 @@ int bvlc_encode_read_fdt_ack(
|
||||
}
|
||||
len = bvlc_encode_bip_address(
|
||||
&pdu[pdu_len],
|
||||
&FD_Table[i].dest_address,
|
||||
&FD_Table[i].dest_address,
|
||||
FD_Table[i].dest_port);
|
||||
pdu_len += len;
|
||||
encode_unsigned16(&pdu[pdu_len], FD_Table[i].time_to_live);
|
||||
@@ -384,12 +386,12 @@ int bvlc_encode_read_fdt_ack(
|
||||
pdu_len += len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return pdu_len;
|
||||
}
|
||||
|
||||
|
||||
int bvlc_encode_delete_fdt_entry(uint8_t * pdu,
|
||||
int bvlc_encode_delete_fdt_entry(uint8_t * pdu,
|
||||
struct in_addr *address,
|
||||
uint16_t port)
|
||||
{
|
||||
@@ -412,12 +414,12 @@ int bvlc_encode_delete_fdt_entry(uint8_t * pdu,
|
||||
}
|
||||
|
||||
int bvlc_encode_distribute_broadcast_to_network(uint8_t * pdu,
|
||||
uint8_t * npdu,
|
||||
uint8_t * npdu,
|
||||
unsigned npdu_length)
|
||||
{
|
||||
int len = 0; /* return value */
|
||||
unsigned i; /* for loop counter */
|
||||
|
||||
|
||||
if (pdu) {
|
||||
pdu[0] = BVLL_TYPE_BACNET_IP;
|
||||
pdu[1] = BVLC_DISTRIBUTE_BROADCAST_TO_NETWORK;
|
||||
@@ -434,7 +436,7 @@ int bvlc_encode_distribute_broadcast_to_network(uint8_t * pdu,
|
||||
return len;
|
||||
}
|
||||
|
||||
int bvlc_encode_original_unicast_npdu(uint8_t * pdu,
|
||||
int bvlc_encode_original_unicast_npdu(uint8_t * pdu,
|
||||
uint8_t * npdu,
|
||||
unsigned npdu_length)
|
||||
{
|
||||
@@ -458,7 +460,7 @@ int bvlc_encode_original_unicast_npdu(uint8_t * pdu,
|
||||
}
|
||||
|
||||
|
||||
int bvlc_encode_original_broadcast_npdu(uint8_t * pdu,
|
||||
int bvlc_encode_original_broadcast_npdu(uint8_t * pdu,
|
||||
uint8_t * npdu,
|
||||
unsigned npdu_length)
|
||||
{
|
||||
@@ -477,7 +479,7 @@ int bvlc_encode_original_broadcast_npdu(uint8_t * pdu,
|
||||
len++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -510,7 +512,7 @@ void bvlc_internet_to_bacnet_address(
|
||||
void bvlc_bacnet_to_internet_address(
|
||||
struct sockaddr_in *sin, /* source internet address */
|
||||
BACNET_ADDRESS * src) /* returns the BACnet source address */
|
||||
{
|
||||
{
|
||||
int len = 0;
|
||||
uint32_t address;
|
||||
uint16_t port;
|
||||
@@ -535,28 +537,33 @@ bool bvlc_create_bdt(
|
||||
struct in_addr dest_address;
|
||||
uint16_t dest_port;
|
||||
unsigned i = 0;
|
||||
|
||||
uint32_t raw_address = 0;
|
||||
|
||||
for (i = 0; i < MAX_BBMD_ENTRIES; i++) {
|
||||
if (npdu_length >= 10) {
|
||||
BBMD_Table[i].valid = true;
|
||||
decode_unsigned32(&pdu[0], &dest_address.s_addr);
|
||||
decode_unsigned32(&npdu[0], &raw_address);
|
||||
dest_address.s_addr = raw_address;
|
||||
BBMD_Table[i].dest_address.s_addr = ntohl(dest_address.s_addr);
|
||||
decode_unsigned16(&pdu[4], &dest_port);
|
||||
decode_unsigned16(&npdu[4], &dest_port);
|
||||
BBMD_Table[i].dest_port = ntohs(dest_port);
|
||||
decode_unsigned32(&pdu[6], &dest_address.s_addr);
|
||||
decode_unsigned32(&npdu[6], &raw_address);
|
||||
dest_address.s_addr = raw_address;
|
||||
BBMD_Table[i].broadcast_mask.s_addr = ntohl(dest_address.s_addr);
|
||||
npdu_length -= 10;
|
||||
npdu_length -= 10;
|
||||
} else {
|
||||
BBMD_Table[i].valid = false;
|
||||
BBMD_Table[i].dest_address.s_addr = 0;
|
||||
BBMD_Table[i].dest_port = 0;
|
||||
BBMD_Table[i].broadcast_mask = 0;
|
||||
BBMD_Table[i].broadcast_mask.s_addr = 0;
|
||||
}
|
||||
}
|
||||
/* did they all fit? */
|
||||
if (npdu_length < 10) {
|
||||
status = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
bool bvlc_register_foreign_device(
|
||||
@@ -565,7 +572,7 @@ bool bvlc_register_foreign_device(
|
||||
{
|
||||
unsigned i = 0;
|
||||
bool status = false;
|
||||
|
||||
|
||||
/* am I here already? If so, update my time to live... */
|
||||
for (i = 0; i < MAX_FD_ENTRIES; i++) {
|
||||
if (FD_Table[i].valid) {
|
||||
@@ -597,11 +604,12 @@ bool bvlc_register_foreign_device(
|
||||
|
||||
bool bvlc_delete_foreign_device(uint8_t * pdu)
|
||||
{
|
||||
struct sockaddr_in sin; /* the ip address */
|
||||
uint16_t port; /* the decoded port */
|
||||
struct sockaddr_in sin = {0}; /* the ip address */
|
||||
uint16_t port = 0; /* the decoded port */
|
||||
bool status = false; /* return value */
|
||||
unsigned i = 0;
|
||||
|
||||
bvlc_decode_bip_address(pdu, &sin, &port);
|
||||
bvlc_decode_bip_address(pdu, &sin.sin_addr, &port);
|
||||
for (i = 0; i < MAX_FD_ENTRIES; i++) {
|
||||
if (FD_Table[i].valid) {
|
||||
if ((FD_Table[i].dest_address.s_addr == sin.sin_addr.s_addr) &&
|
||||
@@ -613,7 +621,7 @@ bool bvlc_delete_foreign_device(uint8_t * pdu)
|
||||
}
|
||||
}
|
||||
}
|
||||
return status;
|
||||
return status;
|
||||
}
|
||||
|
||||
void bvlc_bdt_forward_npdu(
|
||||
@@ -634,9 +642,9 @@ void bvlc_bdt_forward_npdu(
|
||||
}
|
||||
bvlc_internet_to_bacnet_address(&src, sin);
|
||||
mtu_len = bvlc_encode_forwarded_npdu(
|
||||
&mtu[0],
|
||||
&mtu[0],
|
||||
&src,
|
||||
npdu,
|
||||
npdu,
|
||||
npdu_length);
|
||||
/* load destination IP address */
|
||||
bip_dest.sin_family = AF_INET;
|
||||
@@ -648,17 +656,17 @@ void bvlc_bdt_forward_npdu(
|
||||
mask in the BDT entry and logically ORing it with the
|
||||
BBMD address of the same entry. */
|
||||
bip_dest.sin_addr.s_addr =
|
||||
htonl(((~BBMD_Table[i].broadcast_mask.s_addr) |
|
||||
htonl(((~BBMD_Table[i].broadcast_mask.s_addr) |
|
||||
BBMD_Table[i].dest_address.s_addr));
|
||||
bip_dest.sin_port = htons(BBMD_Table[i].dest_port);
|
||||
/* don't send to my broadcast address and same port */
|
||||
if ((bip_dest.sin_addr.s_addr == htonl(bip_get_broadcast_addr())) &&
|
||||
(bip_dest.sin_port == htons(bip_get_port))) {
|
||||
(bip_dest.sin_port == htons(bip_get_port()))) {
|
||||
continue;
|
||||
}
|
||||
/* don't send to my ip address and same port */
|
||||
if ((bip_dest.sin_addr.s_addr == htonl(bip_get_addr())) &&
|
||||
(bip_dest.sin_port == htons(bip_get_port))) {
|
||||
(bip_dest.sin_port == htons(bip_get_port()))) {
|
||||
continue;
|
||||
}
|
||||
/* Send the packet */
|
||||
@@ -672,6 +680,14 @@ void bvlc_bdt_forward_npdu(
|
||||
return;
|
||||
}
|
||||
|
||||
void bvlc_broadcast_forward_npdu(
|
||||
struct sockaddr_in *sin, /* the source address */
|
||||
uint8_t * npdu, /* returns the NPDU */
|
||||
uint16_t npdu_len) /* amount of space available in the NPDU */
|
||||
{
|
||||
/* FIXME: write the code... */
|
||||
}
|
||||
|
||||
void bvlc_fdt_forward_npdu(
|
||||
struct sockaddr_in *sin, /* the source address */
|
||||
uint8_t * npdu, /* returns the NPDU */
|
||||
@@ -690,10 +706,10 @@ void bvlc_fdt_forward_npdu(
|
||||
}
|
||||
bvlc_internet_to_bacnet_address(&src, sin);
|
||||
mtu_len = bvlc_encode_forwarded_npdu(
|
||||
&mtu[0],
|
||||
&mtu[0],
|
||||
&src,
|
||||
npdu,
|
||||
npdu_length);
|
||||
npdu,
|
||||
max_npdu);
|
||||
/* load destination IP address */
|
||||
bvlc_dest.sin_family = AF_INET;
|
||||
/* loop through the FDT and send one to each entry */
|
||||
@@ -711,7 +727,7 @@ void bvlc_fdt_forward_npdu(
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void bvlc_send_mpdu(
|
||||
struct sockaddr_in *dest, /* the destination address */
|
||||
@@ -719,9 +735,7 @@ void bvlc_send_mpdu(
|
||||
uint16_t mtu_len) /* amount of data to send */
|
||||
{
|
||||
int bytes_sent = 0;
|
||||
unsigned i = 0; /* loop counter */
|
||||
struct sockaddr_in bvlc_dest;
|
||||
BACNET_ADDRESS src;
|
||||
|
||||
/* assumes that the driver has already been initialized */
|
||||
if (bip_socket() < 0) {
|
||||
@@ -738,7 +752,7 @@ void bvlc_send_mpdu(
|
||||
sizeof(struct sockaddr));
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void bvlc_send_result(
|
||||
struct sockaddr_in *dest, /* the destination address */
|
||||
@@ -751,7 +765,7 @@ void bvlc_send_result(
|
||||
bvlc_send_mpdu(dest, mtu, mtu_len);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int bvlc_send_bdt(struct sockaddr_in *dest)
|
||||
{
|
||||
@@ -760,7 +774,7 @@ int bvlc_send_bdt(struct sockaddr_in *dest)
|
||||
|
||||
mtu_len = bvlc_encode_read_bdt_ack(&mtu[0], sizeof(mtu));
|
||||
if (mtu_len) {
|
||||
bvlc_send_mpdu(&sin, &mtu[0], mtu_len);
|
||||
bvlc_send_mpdu(dest, &mtu[0], mtu_len);
|
||||
}
|
||||
|
||||
return mtu_len;
|
||||
@@ -774,8 +788,8 @@ int bvlc_send_fdt(struct sockaddr_in *dest)
|
||||
mtu_len = bvlc_encode_read_fdt_ack(&mtu[0], sizeof(mtu));
|
||||
if (mtu_len) {
|
||||
bvlc_send_mpdu(dest, &mtu[0], mtu_len);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return mtu_len;
|
||||
}
|
||||
|
||||
@@ -783,12 +797,12 @@ bool bvlc_broadcast_address_same(
|
||||
struct sockaddr_in *sin) /* network order address */
|
||||
{
|
||||
bool same = false;
|
||||
|
||||
if ((sin->sin_addr.s_addr == htonl(bip_get_broadcast_addr())) &&
|
||||
|
||||
if ((sin->sin_addr.s_addr == htonl(bip_get_broadcast_addr())) &&
|
||||
(sin->sin_port == htons(bip_get_port()))) {
|
||||
same = true;
|
||||
}
|
||||
|
||||
|
||||
return same;
|
||||
}
|
||||
|
||||
@@ -800,7 +814,7 @@ uint16_t bvlc_receive(
|
||||
uint16_t max_npdu, /* amount of space available in the NPDU */
|
||||
unsigned timeout) /* number of milliseconds to wait for a packet */
|
||||
{
|
||||
uint16_t pdu_len = 0; /* return value */
|
||||
uint16_t npdu_len = 0; /* return value */
|
||||
fd_set read_fds;
|
||||
int max = 0;
|
||||
struct timeval select_timeout;
|
||||
@@ -852,7 +866,7 @@ uint16_t bvlc_receive(
|
||||
return 0;
|
||||
}
|
||||
/* the signature of a BACnet/IP packet */
|
||||
if (buf[0] != BVLL_TYPE_BACNET_IP) {
|
||||
if (npdu[0] != BVLL_TYPE_BACNET_IP) {
|
||||
return 0;
|
||||
}
|
||||
function_type = npdu[1];
|
||||
@@ -862,11 +876,11 @@ uint16_t bvlc_receive(
|
||||
npdu_len -= 4;
|
||||
switch (function_type) {
|
||||
case BVLC_RESULT:
|
||||
/* Upon receipt of a BVLC-Result message containing a result code
|
||||
/* Upon receipt of a BVLC-Result message containing a result code
|
||||
of X'0000' indicating the successful completion of the
|
||||
registration, a foreign device shall start a timer with a value
|
||||
registration, a foreign device shall start a timer with a value
|
||||
equal to the Time-to-Live parameter of the preceding Register-
|
||||
Foreign-Device message. At the expiration of the timer, the
|
||||
Foreign-Device message. At the expiration of the timer, the
|
||||
foreign device shall re-register with the BBMD by sending a BVLL
|
||||
Register-Foreign-Device message */
|
||||
/* FIXME: clients may need this result */
|
||||
@@ -890,12 +904,12 @@ uint16_t bvlc_receive(
|
||||
}
|
||||
break;
|
||||
case BVLC_READ_BROADCAST_DISTRIBUTION_TABLE:
|
||||
/* Upon receipt of a BVLL Read-Broadcast-Distribution-Table
|
||||
/* Upon receipt of a BVLL Read-Broadcast-Distribution-Table
|
||||
message, a BBMD shall load the contents of its BDT into a BVLL
|
||||
Read-Broadcast-Distribution-Table-Ack message and send it to the
|
||||
Read-Broadcast-Distribution-Table-Ack message and send it to the
|
||||
originating device. If the BBMD is unable to perform the
|
||||
read of its BDT, it shall return a BVLC-Result message to the
|
||||
originating device with a result code of X'0020' indicating that
|
||||
read of its BDT, it shall return a BVLC-Result message to the
|
||||
originating device with a result code of X'0020' indicating that
|
||||
the read attempt has failed.*/
|
||||
if (bvlc_send_bdt(&sin) <= 0) {
|
||||
bvlc_send_result(&sin,
|
||||
@@ -925,7 +939,7 @@ uint16_t bvlc_receive(
|
||||
broadcast address. The method by which a BBMD determines whether
|
||||
or not other BACnet devices are present is a local matter. */
|
||||
/* if this was received via Broadcast, don't broadcast it */
|
||||
|
||||
|
||||
/* FIXME: how do I know if I received a unicast or broadcast? */
|
||||
if (!bvlc_broadcast_address_same(&sin)) {
|
||||
dest.sin_addr.s_addr = htonl(bip_get_broadcast_addr());
|
||||
@@ -935,30 +949,30 @@ uint16_t bvlc_receive(
|
||||
bvlc_fdt_forward_npdu(&sin, &npdu[4], npdu_len);
|
||||
break;
|
||||
case BVLC_REGISTER_FOREIGN_DEVICE:
|
||||
/* Upon receipt of a BVLL Register-Foreign-Device message, a BBMD
|
||||
/* Upon receipt of a BVLL Register-Foreign-Device message, a BBMD
|
||||
shall start a timer with a value equal to the Time-to-Live
|
||||
parameter supplied plus a fixed grace period of 30 seconds. If,
|
||||
parameter supplied plus a fixed grace period of 30 seconds. If,
|
||||
within the period during which the timer is active, another BVLL
|
||||
Register-Foreign-Device message from the same device is received,
|
||||
Register-Foreign-Device message from the same device is received,
|
||||
the timer shall be reset and restarted. If the time expires
|
||||
without the receipt of another BVLL Register-Foreign-Device
|
||||
without the receipt of another BVLL Register-Foreign-Device
|
||||
message from the same foreign device, the FDT entry for this
|
||||
device shall be cleared.*/
|
||||
(void) decode_unsigned16(&npdu[4], &time_to_live);
|
||||
if (bvlc_register_foreign_device(&sin, time_to_live)) {
|
||||
bvlc_send_result(&sin,
|
||||
bvlc_send_result(&sin,
|
||||
BVLC_RESULT_SUCCESSFUL_COMPLETION);
|
||||
} else {
|
||||
bvlc_send_result(&sin,
|
||||
bvlc_send_result(&sin,
|
||||
BVLC_RESULT_REGISTER_FOREIGN_DEVICE_NAK);
|
||||
}
|
||||
break;
|
||||
case BVLC_READ_FOREIGN_DEVICE_TABLE:
|
||||
/* Upon receipt of a BVLL Read-Foreign-Device-Table message, a
|
||||
/* Upon receipt of a BVLL Read-Foreign-Device-Table message, a
|
||||
BBMD shall load the contents of its FDT into a BVLL Read-
|
||||
Foreign-Device-Table-Ack message and send it to the originating
|
||||
Foreign-Device-Table-Ack message and send it to the originating
|
||||
device. If the BBMD is unable to perform the read of its FDT,
|
||||
it shall return a BVLC-Result message to the originating device
|
||||
it shall return a BVLC-Result message to the originating device
|
||||
with a result code of X'0040' indicating that the read attempt has
|
||||
failed.*/
|
||||
if (bvlc_send_fdt(&sin) <= 0) {
|
||||
@@ -970,34 +984,34 @@ uint16_t bvlc_receive(
|
||||
/* FIXME: complete the code for client side read */
|
||||
break;
|
||||
case BVLC_DELETE_FOREIGN_DEVICE_TABLE_ENTRY:
|
||||
/* Upon receipt of a BVLL Delete-Foreign-Device-Table-Entry
|
||||
/* Upon receipt of a BVLL Delete-Foreign-Device-Table-Entry
|
||||
message, a BBMD shall search its foreign device table for an entry
|
||||
corresponding to the B/IP address supplied in the message. If an
|
||||
corresponding to the B/IP address supplied in the message. If an
|
||||
entry is found, it shall be deleted and the BBMD shall return a
|
||||
BVLC-Result message to the originating device with a result code
|
||||
BVLC-Result message to the originating device with a result code
|
||||
of X'0000'. Otherwise, the BBMD shall return a BVLCResult
|
||||
message to the originating device with a result code of X'0050'
|
||||
message to the originating device with a result code of X'0050'
|
||||
indicating that the deletion attempt has failed.*/
|
||||
if (bvlc_delete_foreign_device(&npdu[4])) {
|
||||
bvlc_send_result(&sin,
|
||||
bvlc_send_result(&sin,
|
||||
BVLC_RESULT_SUCCESSFUL_COMPLETION);
|
||||
} else {
|
||||
bvlc_send_result(&sin,
|
||||
bvlc_send_result(&sin,
|
||||
BVLC_RESULT_DELETE_FOREIGN_DEVICE_TABLE_ENTRY_NAK);
|
||||
}
|
||||
break;
|
||||
case BVLC_DISTRIBUTE_BROADCAST_TO_NETWORK:
|
||||
/* Upon receipt of a BVLL Distribute-Broadcast-To-Network message
|
||||
/* Upon receipt of a BVLL Distribute-Broadcast-To-Network message
|
||||
from a foreign device, the receiving BBMD shall transmit a
|
||||
BVLL Forwarded-NPDU message on its local IP subnet using the
|
||||
BVLL Forwarded-NPDU message on its local IP subnet using the
|
||||
local B/IP broadcast address as the destination address. In
|
||||
addition, a Forwarded-NPDU message shall be sent to each entry
|
||||
addition, a Forwarded-NPDU message shall be sent to each entry
|
||||
in its BDT as described above in the case of the receipt of a
|
||||
BVLL Original-Broadcast-NPDU as well as directly to each foreign
|
||||
BVLL Original-Broadcast-NPDU as well as directly to each foreign
|
||||
device currently in the BBMD's FDT except the originating
|
||||
node. If the BBMD is unable to perform the forwarding function,
|
||||
node. If the BBMD is unable to perform the forwarding function,
|
||||
it shall return a BVLC-Result message to the foreign device
|
||||
with a result code of X'0060' indicating that the forwarding
|
||||
with a result code of X'0060' indicating that the forwarding
|
||||
attempt was unsuccessful*/
|
||||
/* FIXME: complete the function code */
|
||||
bvlc_broadcast_forward_npdu(&sin, &npdu[4], npdu_len);
|
||||
@@ -1005,7 +1019,7 @@ uint16_t bvlc_receive(
|
||||
break;
|
||||
case BVLC_ORIGINAL_UNICAST_NPDU:
|
||||
/* ignore messages from me */
|
||||
if ((sin.sin_addr.s_addr == htonl(bip_get_addr())) &&
|
||||
if ((sin.sin_addr.s_addr == htonl(bip_get_addr())) &&
|
||||
(sin.sin_port == htons(bip_get_port()))) {
|
||||
npdu_len = 0;
|
||||
} else {
|
||||
@@ -1053,7 +1067,7 @@ uint16_t bvlc_receive(
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return npdu_len;
|
||||
}
|
||||
|
||||
@@ -1068,25 +1082,26 @@ int bvlc_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
uint8_t mtu[MAX_MPDU] = { 0 };
|
||||
int mtu_len = 0;
|
||||
int bytes_sent = 0;
|
||||
uint32_t raw_address = 0;
|
||||
|
||||
/* bip datalink doesn't need to know the npdu data */
|
||||
(void) npdu_data;
|
||||
/* assumes that the driver has already been initialized */
|
||||
if (BIP_Socket < 0)
|
||||
return BIP_Socket;
|
||||
if (bip_socket() < 0)
|
||||
return bip_socket();
|
||||
|
||||
mtu[0] = BVLL_TYPE_BACNET_IP;
|
||||
bvlc_dest.sin_family = AF_INET;
|
||||
if (dest->net == BACNET_BROADCAST_NETWORK) {
|
||||
/* broadcast */
|
||||
bvlc_dest.sin_addr.s_addr = htonl(BIP_Broadcast_Address.s_addr);
|
||||
bvlc_dest.sin_port = htons(BIP_Port);
|
||||
bvlc_dest.sin_addr.s_addr = bip_get_broadcast_addr();
|
||||
bvlc_dest.sin_port = bip_get_port();
|
||||
memset(&(bvlc_dest.sin_zero), '\0', 8);
|
||||
mtu[1] = BVLC_ORIGINAL_BROADCAST_NPDU;
|
||||
} else if (dest->mac_len == 6) {
|
||||
/* valid unicast */
|
||||
(void) decode_unsigned32(&dest->mac[0],
|
||||
&(bvlc_dest.sin_addr.s_addr));
|
||||
(void) decode_unsigned32(&dest->mac[0], &raw_address);
|
||||
bvlc_dest.sin_addr.s_addr = raw_address;
|
||||
(void) decode_unsigned16(&dest->mac[4], &(bvlc_dest.sin_port));
|
||||
memset(&(bvlc_dest.sin_zero), '\0', 8);
|
||||
mtu[1] = BVLC_ORIGINAL_UNICAST_NPDU;
|
||||
@@ -1103,7 +1118,7 @@ int bvlc_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
mtu_len += pdu_len;
|
||||
|
||||
/* Send the packet */
|
||||
bytes_sent = sendto(BIP_Socket, (char *) mtu, mtu_len, 0,
|
||||
bytes_sent = sendto(bip_socket(), (char *) mtu, mtu_len, 0,
|
||||
(struct sockaddr *) &bvlc_dest, sizeof(struct sockaddr));
|
||||
|
||||
return bytes_sent;
|
||||
@@ -1113,7 +1128,7 @@ int bvlc_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include "ctest.h"
|
||||
|
||||
|
||||
void testBIPAddress(Test * pTest)
|
||||
{
|
||||
uint8_t apdu[50] = { 0 };
|
||||
@@ -1149,7 +1164,7 @@ void testInternetAddress(Test * pTest)
|
||||
}
|
||||
|
||||
#ifdef TEST_BVLC
|
||||
int main(void)
|
||||
int main(void)
|
||||
{
|
||||
Test * pTest;
|
||||
bool rc;
|
||||
|
||||
Reference in New Issue
Block a user