corrected defects
This commit is contained in:
+4
-8
@@ -98,32 +98,28 @@ int npdu_encode_raw(
|
|||||||
if (dest && dest->net)
|
if (dest && dest->net)
|
||||||
{
|
{
|
||||||
len += encode_unsigned16(&npdu[len], dest->net);
|
len += encode_unsigned16(&npdu[len], dest->net);
|
||||||
|
npdu[len++] = dest->len;
|
||||||
// DLEN = 0 denotes broadcast MAC DADR and DADR field is absent
|
// DLEN = 0 denotes broadcast MAC DADR and DADR field is absent
|
||||||
// DLEN > 0 specifies length of DADR field
|
// DLEN > 0 specifies length of DADR field
|
||||||
if (dest->len)
|
if (dest->len)
|
||||||
{
|
{
|
||||||
npdu[len] = dest->len;
|
|
||||||
len++;
|
|
||||||
for (i = 0; i < dest->len; i++)
|
for (i = 0; i < dest->len; i++)
|
||||||
{
|
{
|
||||||
npdu[len] = dest->adr[i];
|
npdu[len++] = dest->adr[i];
|
||||||
len++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (src && src->net)
|
if (src && src->net)
|
||||||
{
|
{
|
||||||
len += encode_unsigned16(&npdu[len], src->net);
|
len += encode_unsigned16(&npdu[len], src->net);
|
||||||
|
npdu[len++] = src->len;
|
||||||
// SLEN = 0 denotes broadcast MAC SADR and SADR field is absent
|
// SLEN = 0 denotes broadcast MAC SADR and SADR field is absent
|
||||||
// SLEN > 0 specifies length of SADR field
|
// SLEN > 0 specifies length of SADR field
|
||||||
if (src->len)
|
if (src->len)
|
||||||
{
|
{
|
||||||
npdu[len] = src->len;
|
|
||||||
len++;
|
|
||||||
for (i = 0; i < src->len; i++)
|
for (i = 0; i < src->len; i++)
|
||||||
{
|
{
|
||||||
npdu[len] = src->adr[i];
|
npdu[len++] = src->adr[i];
|
||||||
len++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ static int ethernet_bind(struct sockaddr *eth_addr, char *interface_name)
|
|||||||
strerror(errno));
|
strerror(errno));
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"You might need to add the following to modules.conf\n"
|
"You might need to add the following to modules.conf\n"
|
||||||
"(or in modutils/alias on Debian with update-modules):\n"
|
"(or in /etc/modutils/alias on Debian with update-modules):\n"
|
||||||
"alias net-pf-17 af_packet\n"
|
"alias net-pf-17 af_packet\n"
|
||||||
"Also, add af_packet to /etc/modules.\n"
|
"Also, add af_packet to /etc/modules.\n"
|
||||||
"Then follow it by:\n"
|
"Then follow it by:\n"
|
||||||
@@ -141,7 +141,7 @@ static int ethernet_bind(struct sockaddr *eth_addr, char *interface_name)
|
|||||||
strerror(errno));
|
strerror(errno));
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"You might need to add the following to modules.conf\n"
|
"You might need to add the following to modules.conf\n"
|
||||||
"(or in modutils/alias on Debian with update-modules):\n"
|
"(or in /etc/modutils/alias on Debian with update-modules):\n"
|
||||||
"alias net-pf-17 af_packet\n"
|
"alias net-pf-17 af_packet\n"
|
||||||
"Also, add af_packet to /etc/modules.\n"
|
"Also, add af_packet to /etc/modules.\n"
|
||||||
"Then follow it by:\n"
|
"Then follow it by:\n"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
// buffers used for transmit and receive
|
// buffers used for transmit and receive
|
||||||
static uint8_t Tx_Buf[MAX_MPDU] = {0};
|
static uint8_t Tx_Buf[MAX_MPDU] = {0};
|
||||||
static uint8_t Rx_Buf[MAX_MPDU] = {0};
|
static uint8_t Rx_Buf[MAX_MPDU] = {0};
|
||||||
static uint8_t Temp_Buf[MAX_MPDU] = {0};
|
static uint8_t Temp_Buf[MAX_APDU] = {0};
|
||||||
|
|
||||||
// flag to send an I-Am
|
// flag to send an I-Am
|
||||||
bool I_Am_Request = true;
|
bool I_Am_Request = true;
|
||||||
@@ -66,17 +66,15 @@ void Send_IAm(void)
|
|||||||
{
|
{
|
||||||
int pdu_len = 0;
|
int pdu_len = 0;
|
||||||
BACNET_ADDRESS dest;
|
BACNET_ADDRESS dest;
|
||||||
BACNET_ADDRESS src;
|
|
||||||
|
|
||||||
// I-Am is a global broadcast
|
// I-Am is a global broadcast
|
||||||
ethernet_set_broadcast_address(&dest);
|
ethernet_set_broadcast_address(&dest);
|
||||||
ethernet_get_my_address(&src);
|
|
||||||
|
|
||||||
// encode the NPDU portion of the packet
|
// encode the NPDU portion of the packet
|
||||||
pdu_len = npdu_encode_apdu(
|
pdu_len = npdu_encode_apdu(
|
||||||
&Tx_Buf[0],
|
&Tx_Buf[0],
|
||||||
&dest,
|
&dest,
|
||||||
&src,
|
NULL,
|
||||||
false, // true for confirmed messages
|
false, // true for confirmed messages
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
|
|
||||||
@@ -135,6 +133,7 @@ void ReadPropertyHandler(
|
|||||||
uint32_t object_instance;
|
uint32_t object_instance;
|
||||||
BACNET_PROPERTY_ID object_property;
|
BACNET_PROPERTY_ID object_property;
|
||||||
int32_t array_index;
|
int32_t array_index;
|
||||||
|
BACNET_ADDRESS my_address;
|
||||||
|
|
||||||
fprintf(stderr,"Received Read-Property Request!\n");
|
fprintf(stderr,"Received Read-Property Request!\n");
|
||||||
len = rp_decode_service_request(
|
len = rp_decode_service_request(
|
||||||
@@ -144,11 +143,20 @@ void ReadPropertyHandler(
|
|||||||
&object_instance,
|
&object_instance,
|
||||||
&object_property,
|
&object_property,
|
||||||
&array_index);
|
&array_index);
|
||||||
|
// prepare a reply
|
||||||
|
ethernet_get_my_address(&my_address);
|
||||||
|
// encode the NPDU portion of the packet
|
||||||
|
pdu_len = npdu_encode_apdu(
|
||||||
|
&Tx_Buf[0],
|
||||||
|
src,
|
||||||
|
&my_address,
|
||||||
|
false, // true for confirmed messages
|
||||||
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
// bad encoding - send an abort
|
// bad encoding - send an abort
|
||||||
if (len == -1)
|
if (len == -1)
|
||||||
{
|
{
|
||||||
pdu_len = abort_encode_apdu(
|
pdu_len += abort_encode_apdu(
|
||||||
&Tx_Buf[0],
|
&Tx_Buf[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
ABORT_REASON_OTHER);
|
ABORT_REASON_OTHER);
|
||||||
(void)ethernet_send_pdu(
|
(void)ethernet_send_pdu(
|
||||||
@@ -159,8 +167,8 @@ void ReadPropertyHandler(
|
|||||||
}
|
}
|
||||||
else if (service_data->segmented_message)
|
else if (service_data->segmented_message)
|
||||||
{
|
{
|
||||||
pdu_len = abort_encode_apdu(
|
pdu_len += abort_encode_apdu(
|
||||||
&Tx_Buf[0],
|
&Tx_Buf[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
||||||
(void)ethernet_send_pdu(
|
(void)ethernet_send_pdu(
|
||||||
@@ -181,6 +189,7 @@ void ReadPropertyHandler(
|
|||||||
array_index);
|
array_index);
|
||||||
if (len > 0)
|
if (len > 0)
|
||||||
{
|
{
|
||||||
|
// encode the APDU portion of the packet
|
||||||
rp_data.object_type = object_type;
|
rp_data.object_type = object_type;
|
||||||
rp_data.object_instance = object_instance;
|
rp_data.object_instance = object_instance;
|
||||||
rp_data.object_property = object_property;
|
rp_data.object_property = object_property;
|
||||||
@@ -188,8 +197,8 @@ void ReadPropertyHandler(
|
|||||||
rp_data.application_data = &Temp_Buf[0];
|
rp_data.application_data = &Temp_Buf[0];
|
||||||
rp_data.application_data_len = len;
|
rp_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 = rp_ack_encode_apdu(
|
pdu_len += rp_ack_encode_apdu(
|
||||||
&Tx_Buf[0],
|
&Tx_Buf[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
&rp_data);
|
&rp_data);
|
||||||
(void)ethernet_send_pdu(
|
(void)ethernet_send_pdu(
|
||||||
@@ -200,8 +209,8 @@ void ReadPropertyHandler(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pdu_len = bacerror_encode_apdu(
|
pdu_len += bacerror_encode_apdu(
|
||||||
&Tx_Buf[0],
|
&Tx_Buf[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
SERVICE_CONFIRMED_READ_PROPERTY,
|
SERVICE_CONFIRMED_READ_PROPERTY,
|
||||||
ERROR_CLASS_PROPERTY,
|
ERROR_CLASS_PROPERTY,
|
||||||
@@ -214,8 +223,8 @@ void ReadPropertyHandler(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pdu_len = bacerror_encode_apdu(
|
pdu_len += bacerror_encode_apdu(
|
||||||
&Tx_Buf[0],
|
&Tx_Buf[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
SERVICE_CONFIRMED_READ_PROPERTY,
|
SERVICE_CONFIRMED_READ_PROPERTY,
|
||||||
ERROR_CLASS_OBJECT,
|
ERROR_CLASS_OBJECT,
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ int rp_decode_service_request(
|
|||||||
else
|
else
|
||||||
*array_index = BACNET_ARRAY_ALL;
|
*array_index = BACNET_ARRAY_ALL;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
*array_index = BACNET_ARRAY_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
@@ -190,6 +192,7 @@ int rp_ack_encode_apdu(
|
|||||||
{
|
{
|
||||||
apdu[apdu_len++] = data->application_data[len];
|
apdu[apdu_len++] = data->application_data[len];
|
||||||
}
|
}
|
||||||
|
apdu_len += encode_closing_tag(&apdu[apdu_len], 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
return apdu_len;
|
return apdu_len;
|
||||||
|
|||||||
@@ -53,12 +53,14 @@ int whois_encode_apdu(
|
|||||||
if ((low_limit >= 0) && (low_limit <= BACNET_MAX_INSTANCE) &&
|
if ((low_limit >= 0) && (low_limit <= BACNET_MAX_INSTANCE) &&
|
||||||
(high_limit >= 0) && (high_limit <= BACNET_MAX_INSTANCE))
|
(high_limit >= 0) && (high_limit <= BACNET_MAX_INSTANCE))
|
||||||
{
|
{
|
||||||
len = encode_tagged_unsigned(
|
len = encode_context_unsigned(
|
||||||
&apdu[apdu_len],
|
&apdu[apdu_len],
|
||||||
|
0,
|
||||||
low_limit);
|
low_limit);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
len = encode_tagged_unsigned(
|
len = encode_context_unsigned(
|
||||||
&apdu[apdu_len],
|
&apdu[apdu_len],
|
||||||
|
1,
|
||||||
high_limit);
|
high_limit);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
}
|
}
|
||||||
@@ -83,7 +85,7 @@ int whois_decode_service_request(
|
|||||||
if (apdu_len)
|
if (apdu_len)
|
||||||
{
|
{
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
len += decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
if (tag_number != BACNET_APPLICATION_TAG_UNSIGNED_INT)
|
if (tag_number != 0)
|
||||||
return -1;
|
return -1;
|
||||||
len += decode_unsigned(&apdu[len], len_value, &decoded_value);
|
len += decode_unsigned(&apdu[len], len_value, &decoded_value);
|
||||||
if ((decoded_value >= 0) && (decoded_value <= BACNET_MAX_INSTANCE))
|
if ((decoded_value >= 0) && (decoded_value <= BACNET_MAX_INSTANCE))
|
||||||
@@ -92,7 +94,7 @@ int whois_decode_service_request(
|
|||||||
*pLow_limit = decoded_value;
|
*pLow_limit = decoded_value;
|
||||||
}
|
}
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
len += decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
if (tag_number != BACNET_APPLICATION_TAG_UNSIGNED_INT)
|
if (tag_number != 1)
|
||||||
return -1;
|
return -1;
|
||||||
len += decode_unsigned(&apdu[len],
|
len += decode_unsigned(&apdu[len],
|
||||||
len_value, &decoded_value);
|
len_value, &decoded_value);
|
||||||
|
|||||||
Reference in New Issue
Block a user