Started cleanup of BVLC module.
This commit is contained in:
+60
-19
@@ -127,8 +127,8 @@ int bvlc_decode_bip_address(
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (pdu) {
|
if (pdu) {
|
||||||
(void) decode_unsigned32(&pdu[0], &(address.s_addr));
|
(void) decode_unsigned32(&pdu[0], &(address->s_addr));
|
||||||
(void) decode_unsigned16(&pdu[4], &port);
|
(void) decode_unsigned16(&pdu[4], port);
|
||||||
len = 6;
|
len = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,21 +405,24 @@ int bvlc_encode_original_broadcast_npdu(uint8_t * pdu,
|
|||||||
|
|
||||||
/* copy the source internet address to the BACnet address */
|
/* copy the source internet address to the BACnet address */
|
||||||
/* FIXME: IPv6? */
|
/* FIXME: IPv6? */
|
||||||
/* FIXME: is sockaddr_in host or network order? */
|
|
||||||
void bvlc_internet_to_bacnet_address(
|
void bvlc_internet_to_bacnet_address(
|
||||||
BACNET_ADDRESS * src, /* returns the BACnet source address */
|
BACNET_ADDRESS * src, /* returns the BACnet source address */
|
||||||
struct sockaddr_in *sin)
|
struct sockaddr_in *sin)
|
||||||
{ /* source internet address */
|
{ /* source internet address */
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
uint32_t address;
|
||||||
|
uint16_t port;
|
||||||
|
|
||||||
if (src && sin) {
|
if (src && sin) {
|
||||||
len = encode_unsigned32(&src->mac[0], sin->sin_addr.s_addr);
|
address = ntohl(sin->sin_addr.s_addr);
|
||||||
len += encode_unsigned16(&src->mac[4], sin->sin_port);
|
len = encode_unsigned32(&src->mac[0], address);
|
||||||
|
port = ntohs(sin->sin_port);
|
||||||
|
len += encode_unsigned16(&src->mac[4], port);
|
||||||
src->mac_len = len;
|
src->mac_len = len;
|
||||||
src->net = 0;
|
src->net = 0;
|
||||||
src->len = 0;
|
src->len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,16 +432,20 @@ void bvlc_internet_to_bacnet_address(
|
|||||||
void bvlc_bacnet_to_internet_address(
|
void bvlc_bacnet_to_internet_address(
|
||||||
struct sockaddr_in *sin, /* source internet address */
|
struct sockaddr_in *sin, /* source internet address */
|
||||||
BACNET_ADDRESS * src) /* returns the BACnet source address */
|
BACNET_ADDRESS * src) /* returns the BACnet source address */
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
uint32_t address;
|
||||||
|
uint16_t port;
|
||||||
|
|
||||||
if (src && sin) {
|
if (src && sin) {
|
||||||
if (src->mac_len == 6) {
|
if (src->mac_len == 6) {
|
||||||
len = decode_unsigned32(&src->mac[0], &sin->sin_addr.s_addr);
|
len = decode_unsigned32(&src->mac[0], &address);
|
||||||
len += decode_unsigned16(&src->mac[4], &sin->sin_port);
|
len += decode_unsigned16(&src->mac[4], &port );
|
||||||
|
sin->sin_addr.s_addr = htonl(address);
|
||||||
|
sin->sin_port = htons(port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,14 +459,16 @@ void bvlc_bdt_forward_npdu(
|
|||||||
int bytes_sent = 0;
|
int bytes_sent = 0;
|
||||||
unsigned i = 0; /* loop counter */
|
unsigned i = 0; /* loop counter */
|
||||||
struct sockaddr_in bip_dest;
|
struct sockaddr_in bip_dest;
|
||||||
|
BACNET_ADDRESS src;
|
||||||
|
|
||||||
/* assumes that the driver has already been initialized */
|
/* assumes that the driver has already been initialized */
|
||||||
if (bip_socket() < 0) {
|
if (bip_socket() < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
bvlc_internet_to_bacnet_address(&src, sin);
|
||||||
mtu_len = bvlc_encode_forwarded_npdu(
|
mtu_len = bvlc_encode_forwarded_npdu(
|
||||||
&mtu[0],
|
&mtu[0],
|
||||||
sin,
|
&src,
|
||||||
npdu,
|
npdu,
|
||||||
npdu_length);
|
npdu_length);
|
||||||
/* load destination IP address */
|
/* load destination IP address */
|
||||||
@@ -478,12 +487,12 @@ void bvlc_bdt_forward_npdu(
|
|||||||
/* Send the packet */
|
/* Send the packet */
|
||||||
bytes_sent =
|
bytes_sent =
|
||||||
sendto(bip_socket(), (char *) mtu, mtu_len, 0,
|
sendto(bip_socket(), (char *) mtu, mtu_len, 0,
|
||||||
(struct sockaddr *) bip_dest,
|
(struct sockaddr *) &bip_dest,
|
||||||
sizeof(struct sockaddr));
|
sizeof(struct sockaddr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes_sent;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bvlc_fdt_forward_npdu(
|
void bvlc_fdt_forward_npdu(
|
||||||
@@ -500,7 +509,6 @@ uint16_t bvlc_handler(
|
|||||||
uint8_t * npdu, /* returns the NPDU */
|
uint8_t * npdu, /* returns the NPDU */
|
||||||
uint16_t max_npdu, /* amount of space available in the NPDU */
|
uint16_t max_npdu, /* amount of space available in the NPDU */
|
||||||
unsigned timeout) /* number of milliseconds to wait for a packet */
|
unsigned timeout) /* number of milliseconds to wait for a packet */
|
||||||
int received_bytes;
|
|
||||||
{
|
{
|
||||||
uint8_t buf[MAX_MPDU] = {0}; /* data */
|
uint8_t buf[MAX_MPDU] = {0}; /* data */
|
||||||
uint16_t pdu_len = 0; /* return value */
|
uint16_t pdu_len = 0; /* return value */
|
||||||
@@ -510,6 +518,7 @@ uint16_t bvlc_handler(
|
|||||||
struct sockaddr_in sin = { -1 };
|
struct sockaddr_in sin = { -1 };
|
||||||
socklen_t sin_len = sizeof(sin);
|
socklen_t sin_len = sizeof(sin);
|
||||||
int function_type = 0;
|
int function_type = 0;
|
||||||
|
int received_bytes;
|
||||||
|
|
||||||
/* Make sure the socket is open */
|
/* Make sure the socket is open */
|
||||||
if (BIP_Socket < 0) {
|
if (BIP_Socket < 0) {
|
||||||
@@ -663,11 +672,41 @@ uint16_t bvlc_handler(
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
void testBVLC(Test * pTest)
|
void testBIPAddress(Test * pTest)
|
||||||
{
|
{
|
||||||
(void) pTest;
|
uint8_t apdu[50] = { 0 };
|
||||||
|
uint32_t value = 0, test_value = 0;
|
||||||
|
int len = 0, test_len = 0;
|
||||||
|
struct in_addr address;
|
||||||
|
struct in_addr test_address;
|
||||||
|
uint16_t port = 0, test_port = 0;
|
||||||
|
|
||||||
|
address.s_addr = 42;
|
||||||
|
len = bvlc_encode_bip_address(&apdu[0],
|
||||||
|
&address, port);
|
||||||
|
test_len = bvlc_decode_bip_address(&apdu[0],
|
||||||
|
&test_address, &test_port);
|
||||||
|
ct_test(pTest, len == test_len);
|
||||||
|
ct_test(pTest, address.s_addr == test_address.s_addr);
|
||||||
|
ct_test(pTest, port == test_port);
|
||||||
}
|
}
|
||||||
#ifdef TEST_BBMD
|
|
||||||
|
void testInternetAddress(Test * pTest)
|
||||||
|
{
|
||||||
|
BACNET_ADDRESS src;
|
||||||
|
BACNET_ADDRESS test_src;
|
||||||
|
struct sockaddr_in sin;
|
||||||
|
struct sockaddr_in test_sin;
|
||||||
|
|
||||||
|
sin.sin_port = htons(0xBAC0);
|
||||||
|
sin.sin_addr.s_addr = inet_addr("192.168.0.1");
|
||||||
|
bvlc_internet_to_bacnet_address(&src, &sin);
|
||||||
|
bvlc_bacnet_to_internet_address(&test_sin, &src);
|
||||||
|
ct_test(pTest, sin.sin_port == test_sin.sin_port);
|
||||||
|
ct_test(pTest, sin.sin_addr.s_addr == test_sin.sin_addr.s_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TEST_BVLC
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
Test * pTest;
|
Test * pTest;
|
||||||
@@ -675,7 +714,9 @@ int main(void)
|
|||||||
|
|
||||||
pTest = ct_create("BACnet Virtual Link Control", NULL);
|
pTest = ct_create("BACnet Virtual Link Control", NULL);
|
||||||
/* individual tests */
|
/* individual tests */
|
||||||
rc = ct_addTestFunction(pTest, testBVLC);
|
rc = ct_addTestFunction(pTest, testBIPAddress);
|
||||||
|
assert(rc);
|
||||||
|
rc = ct_addTestFunction(pTest, testInternetAddress);
|
||||||
assert(rc);
|
assert(rc);
|
||||||
/* configure output */
|
/* configure output */
|
||||||
ct_setStream(pTest, stdout);
|
ct_setStream(pTest, stdout);
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ For this release, here are some things to do:
|
|||||||
4. Change demos main file to main.c (done, STK)
|
4. Change demos main file to main.c (done, STK)
|
||||||
5. Add parameter passing for IP address or interface for multi homed systems. (done, STK)
|
5. Add parameter passing for IP address or interface for multi homed systems. (done, STK)
|
||||||
6. Validate the unit tests compile after BIG_ENDIAN change. (done,STK)
|
6. Validate the unit tests compile after BIG_ENDIAN change. (done,STK)
|
||||||
7. Add arcnet.c and ethernet.c to all the linux Makefiles
|
7. Add arcnet.c and ethernet.c to all the linux Makefiles (done, STK)
|
||||||
8. Refactor Makefile DEFINES like demo/server/Makefile.
|
8. Refactor Makefile DEFINES like demo/server/Makefile. (done, STK)
|
||||||
9. Finish subscribe COV support in server demo.
|
9. Finish subscribe COV support in server demo.
|
||||||
|
|
||||||
For a later release, here are some things to do:
|
For a later release, here are some things to do:
|
||||||
|
|||||||
Reference in New Issue
Block a user