correcting the npdu encoding for handlers.
This commit is contained in:
+7
-4
@@ -275,7 +275,8 @@ int cov_notify_decode_service_request(uint8_t * apdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ucov_notify_send(uint8_t * buffer, BACNET_COV_DATA * data)
|
int ucov_notify_send(uint8_t * buffer, BACNET_COV_DATA * data)
|
||||||
{
|
{
|
||||||
|
int len = 0;
|
||||||
int pdu_len = 0;
|
int pdu_len = 0;
|
||||||
BACNET_ADDRESS dest;
|
BACNET_ADDRESS dest;
|
||||||
int bytes_sent = 0;
|
int bytes_sent = 0;
|
||||||
@@ -283,10 +284,12 @@ int ucov_notify_send(uint8_t * buffer, BACNET_COV_DATA * data)
|
|||||||
|
|
||||||
/* unconfirmed is a broadcast */
|
/* unconfirmed is a broadcast */
|
||||||
datalink_get_broadcast_address(&dest);
|
datalink_get_broadcast_address(&dest);
|
||||||
|
/* encode the NPDU portion of the packet */
|
||||||
|
npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
|
||||||
|
pdu_len = npdu_encode_pdu(&buffer[0], &dest, NULL, &npdu_data);
|
||||||
/* encode the APDU portion of the packet */
|
/* encode the APDU portion of the packet */
|
||||||
pdu_len = ucov_notify_encode_apdu(&buffer[0], data);
|
len = ucov_notify_encode_apdu(&buffer[pdu_len], data);
|
||||||
/* encode the NPDU portion of the packet */
|
pdu_len += len;
|
||||||
npdu_encode_unconfirmed_apdu(&npdu_data, MESSAGE_PRIORITY_NORMAL);
|
|
||||||
/* send the data */
|
/* send the data */
|
||||||
bytes_sent = datalink_send_pdu(&dest, &npdu_data, &buffer[0], pdu_len);
|
bytes_sent = datalink_send_pdu(&dest, &npdu_data, &buffer[0], pdu_len);
|
||||||
|
|
||||||
|
|||||||
@@ -59,33 +59,37 @@ void handler_read_property(uint8_t * service_request,
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
int pdu_len = 0;
|
int pdu_len = 0;
|
||||||
BACNET_NPDU_DATA npdu_data;
|
BACNET_NPDU_DATA npdu_data;
|
||||||
bool send = false;
|
bool error = true;
|
||||||
bool error = false;
|
|
||||||
int bytes_sent = 0;
|
int bytes_sent = 0;
|
||||||
BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT;
|
BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT;
|
||||||
BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
||||||
|
BACNET_ADDRESS my_address;
|
||||||
|
|
||||||
len = rp_decode_service_request(service_request, service_len, &data);
|
len = rp_decode_service_request(service_request, service_len, &data);
|
||||||
|
/* encode the NPDU portion of the packet */
|
||||||
|
datalink_get_my_address(&my_address);
|
||||||
|
npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
|
||||||
|
pdu_len = npdu_encode_pdu(&Handler_Transmit_Buffer[0], src,
|
||||||
|
&my_address, &npdu_data);
|
||||||
|
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
fprintf(stderr, "Unable to decode Read-Property Request!\n");
|
fprintf(stderr, "Unable to decode Read-Property Request!\n");
|
||||||
#endif
|
#endif
|
||||||
/* bad decoding - send an abort */
|
/* bad decoding - send an abort */
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
pdu_len = abort_encode_apdu(&Handler_Transmit_Buffer[0],
|
len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||||
service_data->invoke_id, ABORT_REASON_OTHER);
|
service_data->invoke_id, ABORT_REASON_OTHER);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "Sending Abort!\n");
|
fprintf(stderr, "Sending Abort!\n");
|
||||||
#endif
|
#endif
|
||||||
send = true;
|
|
||||||
} else if (service_data->segmented_message) {
|
} else if (service_data->segmented_message) {
|
||||||
pdu_len = abort_encode_apdu(&Handler_Transmit_Buffer[0],
|
len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "Sending Abort!\n");
|
fprintf(stderr, "Sending Abort!\n");
|
||||||
#endif
|
#endif
|
||||||
send = true;
|
|
||||||
} else {
|
} else {
|
||||||
switch (data.object_type) {
|
switch (data.object_type) {
|
||||||
case OBJECT_DEVICE:
|
case OBJECT_DEVICE:
|
||||||
@@ -99,8 +103,8 @@ void handler_read_property(uint8_t * service_request,
|
|||||||
data.application_data = &Temp_Buf[0];
|
data.application_data = &Temp_Buf[0];
|
||||||
data.application_data_len = len;
|
data.application_data_len = len;
|
||||||
/* FIXME: probably need a length limitation sent with encode */
|
/* FIXME: probably need a length limitation sent with encode */
|
||||||
pdu_len =
|
len =
|
||||||
rp_ack_encode_apdu(&Handler_Transmit_Buffer[0],
|
rp_ack_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||||
service_data->invoke_id, &data);
|
service_data->invoke_id, &data);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
|||||||
+2
-2
@@ -145,8 +145,8 @@ int iam_send(uint8_t * buffer)
|
|||||||
/* I-Am is a global broadcast */
|
/* I-Am is a global broadcast */
|
||||||
datalink_get_broadcast_address(&dest);
|
datalink_get_broadcast_address(&dest);
|
||||||
/* encode the NPDU portion of the packet */
|
/* encode the NPDU portion of the packet */
|
||||||
npdu_encode_apdu(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
|
npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
|
||||||
len = npdu_encode_pdu(&buffer[0], &dest, NULL, &npdu_data);
|
pdu_len = npdu_encode_pdu(&buffer[0], &dest, NULL, &npdu_data);
|
||||||
/* encode the APDU portion of the packet */
|
/* encode the APDU portion of the packet */
|
||||||
len = iam_encode_apdu(&buffer[pdu_len],
|
len = iam_encode_apdu(&buffer[pdu_len],
|
||||||
Device_Object_Instance_Number(),
|
Device_Object_Instance_Number(),
|
||||||
|
|||||||
+3
-3
@@ -189,7 +189,7 @@ int npdu_encode_pdu(uint8_t * npdu,
|
|||||||
|
|
||||||
/* Configure the NPDU portion of the packet for an APDU */
|
/* Configure the NPDU portion of the packet for an APDU */
|
||||||
/* This function does not handle the network messages, just APDUs. */
|
/* This function does not handle the network messages, just APDUs. */
|
||||||
void npdu_encode_apdu(BACNET_NPDU_DATA * npdu_data,
|
void npdu_encode_npdu_data(BACNET_NPDU_DATA * npdu_data,
|
||||||
bool data_expecting_reply,
|
bool data_expecting_reply,
|
||||||
BACNET_MESSAGE_PRIORITY priority)
|
BACNET_MESSAGE_PRIORITY priority)
|
||||||
{
|
{
|
||||||
@@ -388,7 +388,7 @@ void testNPDU2(Test * pTest)
|
|||||||
for (i = 0; i < src.len; i++) {
|
for (i = 0; i < src.len; i++) {
|
||||||
src.adr[i] = 0x40;
|
src.adr[i] = 0x40;
|
||||||
}
|
}
|
||||||
npdu_encode_apdu(&npdu_data, true, priority);
|
npdu_encode_npdu_data(&npdu_data, true, priority);
|
||||||
len = npdu_encode_pdu(&pdu[0], &dest, &src, &npdu_data);
|
len = npdu_encode_pdu(&pdu[0], &dest, &src, &npdu_data);
|
||||||
ct_test(pTest, len != 0);
|
ct_test(pTest, len != 0);
|
||||||
/* can we get the info back? */
|
/* can we get the info back? */
|
||||||
@@ -452,7 +452,7 @@ void testNPDU1(Test * pTest)
|
|||||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||||
src.adr[i] = 0;
|
src.adr[i] = 0;
|
||||||
}
|
}
|
||||||
npdu_encode_apdu(&npdu_data, false, priority);
|
npdu_encode_npdu_data(&npdu_data, false, priority);
|
||||||
len = npdu_encode_pdu(&pdu[0], &dest, &src, &npdu_data);
|
len = npdu_encode_pdu(&pdu[0], &dest, &src, &npdu_data);
|
||||||
ct_test(pTest, len != 0);
|
ct_test(pTest, len != 0);
|
||||||
/* can we get the info back? */
|
/* can we get the info back? */
|
||||||
|
|||||||
+1
-1
@@ -62,7 +62,7 @@ extern "C" {
|
|||||||
BACNET_ADDRESS * dest,
|
BACNET_ADDRESS * dest,
|
||||||
BACNET_ADDRESS * src, BACNET_NPDU_DATA * npdu_data);
|
BACNET_ADDRESS * src, BACNET_NPDU_DATA * npdu_data);
|
||||||
|
|
||||||
void npdu_encode_apdu(BACNET_NPDU_DATA * npdu,
|
void npdu_encode_npdu_data(BACNET_NPDU_DATA * npdu,
|
||||||
bool data_expecting_reply,
|
bool data_expecting_reply,
|
||||||
BACNET_MESSAGE_PRIORITY priority);
|
BACNET_MESSAGE_PRIORITY priority);
|
||||||
|
|
||||||
|
|||||||
@@ -194,9 +194,9 @@ int arcnet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
int bytes = 0;
|
int bytes = 0;
|
||||||
uint8_t mtu[512] = { 0 };
|
uint8_t mtu[512] = { 0 };
|
||||||
int mtu_len = 0;
|
int mtu_len = 0;
|
||||||
int npdu_len = 0;
|
|
||||||
struct archdr *pkt = (struct archdr *) mtu;
|
struct archdr *pkt = (struct archdr *) mtu;
|
||||||
|
|
||||||
|
(void)npdu_data;
|
||||||
src.mac[0] = ARCNET_MAC_Address;
|
src.mac[0] = ARCNET_MAC_Address;
|
||||||
src.mac_len = 1;
|
src.mac_len = 1;
|
||||||
|
|
||||||
@@ -223,14 +223,13 @@ int arcnet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
pkt->soft.raw[1] = 0x82; /* DSAP for BACnet */
|
pkt->soft.raw[1] = 0x82; /* DSAP for BACnet */
|
||||||
pkt->soft.raw[2] = 0x82; /* SSAP for BACnet */
|
pkt->soft.raw[2] = 0x82; /* SSAP for BACnet */
|
||||||
pkt->soft.raw[3] = 0x03; /* LLC Control byte in header */
|
pkt->soft.raw[3] = 0x03; /* LLC Control byte in header */
|
||||||
npdu_len = npdu_encode_pdu(&pkt->soft.raw[4], dest, &src, npdu_data);
|
|
||||||
/* packet length */
|
/* packet length */
|
||||||
mtu_len = ARC_HDR_SIZE + 4 /*SC,DSAP,SSAP,LLC */ + npdu_len + pdu_len;
|
mtu_len = ARC_HDR_SIZE + 4 /*SC,DSAP,SSAP,LLC */ + pdu_len;
|
||||||
if (mtu_len > 512) {
|
if (mtu_len > 512) {
|
||||||
fprintf(stderr, "arcnet: PDU is too big to send!\n");
|
fprintf(stderr, "arcnet: PDU is too big to send!\n");
|
||||||
return -4;
|
return -4;
|
||||||
}
|
}
|
||||||
memcpy(&pkt->soft.raw[4 + npdu_len], pdu, pdu_len);
|
memcpy(&pkt->soft.raw[4], pdu, pdu_len);
|
||||||
/* Send the packet */
|
/* Send the packet */
|
||||||
bytes =
|
bytes =
|
||||||
sendto(ARCNET_Sock_FD, &mtu, mtu_len, 0,
|
sendto(ARCNET_Sock_FD, &mtu, mtu_len, 0,
|
||||||
|
|||||||
@@ -188,8 +188,8 @@ int ethernet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
BACNET_ADDRESS src = { 0 }; /* source address for npdu */
|
BACNET_ADDRESS src = { 0 }; /* source address for npdu */
|
||||||
uint8_t mtu[MAX_MPDU] = { 0 }; /* our buffer */
|
uint8_t mtu[MAX_MPDU] = { 0 }; /* our buffer */
|
||||||
int mtu_len = 0;
|
int mtu_len = 0;
|
||||||
int npdu_len = 0;
|
|
||||||
|
|
||||||
|
(void)ndpu_data;
|
||||||
/* load the BACnet address for NPDU data */
|
/* load the BACnet address for NPDU data */
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
src.mac[i] = Ethernet_MAC_Address[i];
|
src.mac[i] = Ethernet_MAC_Address[i];
|
||||||
@@ -224,8 +224,7 @@ int ethernet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
mtu[14] = 0x82; /* DSAP for BACnet */
|
mtu[14] = 0x82; /* DSAP for BACnet */
|
||||||
mtu[15] = 0x82; /* SSAP for BACnet */
|
mtu[15] = 0x82; /* SSAP for BACnet */
|
||||||
mtu[16] = 0x03; /* Control byte in header */
|
mtu[16] = 0x03; /* Control byte in header */
|
||||||
npdu_len = npdu_encode_pdu(&mtu[17], dest, &src, npdu_data);
|
mtu_len = 17;
|
||||||
mtu_len = 17 + npdu_len;
|
|
||||||
if ((mtu_len + pdu_len) > MAX_MPDU) {
|
if ((mtu_len + pdu_len) > MAX_MPDU) {
|
||||||
fprintf(stderr, "ethernet: PDU is too big to send!\n");
|
fprintf(stderr, "ethernet: PDU is too big to send!\n");
|
||||||
return -4;
|
return -4;
|
||||||
@@ -233,7 +232,7 @@ int ethernet_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
memcpy(&mtu[mtu_len], pdu, pdu_len);
|
memcpy(&mtu[mtu_len], pdu, pdu_len);
|
||||||
mtu_len += pdu_len;
|
mtu_len += pdu_len;
|
||||||
/* packet length - only the logical portion, not the address */
|
/* packet length - only the logical portion, not the address */
|
||||||
encode_unsigned16(&mtu[12], 3 + npdu_len + pdu_len);
|
encode_unsigned16(&mtu[12], 3 + pdu_len);
|
||||||
|
|
||||||
/* Send the packet */
|
/* Send the packet */
|
||||||
bytes =
|
bytes =
|
||||||
|
|||||||
@@ -64,10 +64,10 @@ int dlmstp_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
unsigned pdu_len)
|
unsigned pdu_len)
|
||||||
{ /* number of bytes of data */
|
{ /* number of bytes of data */
|
||||||
int bytes_sent = 0;
|
int bytes_sent = 0;
|
||||||
unsigned npdu_len = 0;
|
|
||||||
uint8_t frame_type = 0;
|
uint8_t frame_type = 0;
|
||||||
uint8_t destination = 0; /* destination address */
|
uint8_t destination = 0; /* destination address */
|
||||||
BACNET_ADDRESS src;
|
BACNET_ADDRESS src;
|
||||||
|
unsigned mtu_len = 0;
|
||||||
|
|
||||||
if (MSTP_Port.TxReady == false) {
|
if (MSTP_Port.TxReady == false) {
|
||||||
if (npdu_data->confirmed_message)
|
if (npdu_data->confirmed_message)
|
||||||
@@ -84,22 +84,23 @@ int dlmstp_send_pdu(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
fprintf(stderr, "mstp: invalid destination MAC address!\n");
|
fprintf(stderr, "mstp: invalid destination MAC address!\n");
|
||||||
#endif
|
#endif
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
dlmstp_get_my_address(&src);
|
/* header len */
|
||||||
npdu_len = npdu_encode_pdu(&PDU_Buffer[0], dest, &src, npdu_data);
|
mtu_len = 8;
|
||||||
if ((8 /* header len */ + npdu_len + pdu_len) > MAX_MPDU) {
|
if ((mtu_len + pdu_len) > MAX_MPDU) {
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "mstp: PDU is too big to send!\n");
|
fprintf(stderr, "mstp: PDU is too big to send!\n");
|
||||||
#endif
|
#endif
|
||||||
return -4;
|
return -4;
|
||||||
}
|
}
|
||||||
memmove(&PDU_Buffer[npdu_len], pdu, pdu_len);
|
memmove(&PDU_Buffer[mtu_len], pdu, pdu_len);
|
||||||
|
mtu_len += pdu_len;
|
||||||
bytes_sent = MSTP_Create_Frame(
|
bytes_sent = MSTP_Create_Frame(
|
||||||
(uint8_t *) & MSTP_Port.TxBuffer[0],
|
(uint8_t *) & MSTP_Port.TxBuffer[0],
|
||||||
sizeof(MSTP_Port.TxBuffer),
|
sizeof(MSTP_Port.TxBuffer),
|
||||||
MSTP_Port.TxFrameType,
|
MSTP_Port.TxFrameType,
|
||||||
destination,
|
destination,
|
||||||
MSTP_Port.This_Station, &PDU_Buffer[0], npdu_len + pdu_len);
|
MSTP_Port.This_Station, &PDU_Buffer[0], mtu_len);
|
||||||
MSTP_Port.TxLength = bytes_sent;
|
MSTP_Port.TxLength = bytes_sent;
|
||||||
MSTP_Port.TxReady = true;
|
MSTP_Port.TxReady = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,9 +94,9 @@ int ethernet_send(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
int bytes = 0;
|
int bytes = 0;
|
||||||
uint8_t mtu[MAX_MPDU] = { 0 };
|
uint8_t mtu[MAX_MPDU] = { 0 };
|
||||||
int mtu_len = 0;
|
int mtu_len = 0;
|
||||||
int npdu_len = 0;
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
(void)npdu_data;
|
||||||
/* don't waste time if the socket is not valid */
|
/* don't waste time if the socket is not valid */
|
||||||
if (Ethernet_Socket < 0) {
|
if (Ethernet_Socket < 0) {
|
||||||
fprintf(stderr, "ethernet: 802.2 socket is invalid!\n");
|
fprintf(stderr, "ethernet: 802.2 socket is invalid!\n");
|
||||||
@@ -134,8 +134,7 @@ int ethernet_send(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
mtu[mtu_len++] = 0x82; /* DSAP for BACnet */
|
mtu[mtu_len++] = 0x82; /* DSAP for BACnet */
|
||||||
mtu[mtu_len++] = 0x82; /* SSAP for BACnet */
|
mtu[mtu_len++] = 0x82; /* SSAP for BACnet */
|
||||||
mtu[mtu_len++] = 0x03; /* Control byte in header */
|
mtu[mtu_len++] = 0x03; /* Control byte in header */
|
||||||
npdu_len = npdu_encode_pdu(&mtu[17], dest, src, npdu_data);
|
mtu_len = 17;
|
||||||
mtu_len = 17 + npdu_len;
|
|
||||||
if ((mtu_len + pdu_len) > MAX_MPDU) {
|
if ((mtu_len + pdu_len) > MAX_MPDU) {
|
||||||
fprintf(stderr, "ethernet: PDU is too big to send!\n");
|
fprintf(stderr, "ethernet: PDU is too big to send!\n");
|
||||||
return -4;
|
return -4;
|
||||||
@@ -143,7 +142,7 @@ int ethernet_send(BACNET_ADDRESS * dest, /* destination address */
|
|||||||
memcpy(&mtu[mtu_len], pdu, pdu_len);
|
memcpy(&mtu[mtu_len], pdu, pdu_len);
|
||||||
mtu_len += pdu_len;
|
mtu_len += pdu_len;
|
||||||
/* packet length - only the logical portion, not the address */
|
/* packet length - only the logical portion, not the address */
|
||||||
encode_unsigned16(&mtu[12], 3 + npdu_len + pdu_len);
|
encode_unsigned16(&mtu[12], 3 + pdu_len);
|
||||||
|
|
||||||
/* Send the packet */
|
/* Send the packet */
|
||||||
bytes = send(Ethernet_Socket, (const char *) &mtu, mtu_len, 0);
|
bytes = send(Ethernet_Socket, (const char *) &mtu, mtu_len, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user