corrected AtomicReadFileAck.
This commit is contained in:
+8
-10
@@ -207,11 +207,10 @@ int arf_ack_encode_apdu(
|
|||||||
|
|
||||||
if (apdu)
|
if (apdu)
|
||||||
{
|
{
|
||||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
apdu[0] = PDU_TYPE_COMPLEX_ACK;
|
||||||
apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
apdu[1] = invoke_id;
|
||||||
apdu[2] = invoke_id;
|
apdu[2] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; // service choice
|
||||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; // service choice
|
apdu_len = 3;
|
||||||
apdu_len = 4;
|
|
||||||
// endOfFile
|
// endOfFile
|
||||||
apdu_len += encode_tagged_boolean(&apdu[apdu_len], data->endOfFile);
|
apdu_len += encode_tagged_boolean(&apdu[apdu_len], data->endOfFile);
|
||||||
switch (data->access)
|
switch (data->access)
|
||||||
@@ -348,13 +347,12 @@ int arf_ack_decode_apdu(
|
|||||||
if (!apdu)
|
if (!apdu)
|
||||||
return -1;
|
return -1;
|
||||||
// optional checking - most likely was already done prior to this call
|
// optional checking - most likely was already done prior to this call
|
||||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
if (apdu[0] != PDU_TYPE_COMPLEX_ACK)
|
||||||
return -1;
|
return -1;
|
||||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
*invoke_id = apdu[1]; /* invoke id - filled in by net layer */
|
||||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
if (apdu[2] != SERVICE_CONFIRMED_ATOMIC_READ_FILE)
|
||||||
if (apdu[3] != SERVICE_CONFIRMED_ATOMIC_READ_FILE)
|
|
||||||
return -1;
|
return -1;
|
||||||
offset = 4;
|
offset = 3;
|
||||||
|
|
||||||
if (apdu_len > offset)
|
if (apdu_len > offset)
|
||||||
{
|
{
|
||||||
|
|||||||
+8
-10
@@ -221,11 +221,10 @@ int awf_ack_encode_apdu(
|
|||||||
|
|
||||||
if (apdu)
|
if (apdu)
|
||||||
{
|
{
|
||||||
apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST;
|
apdu[0] = PDU_TYPE_COMPLEX_ACK;
|
||||||
apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
apdu[1] = invoke_id;
|
||||||
apdu[2] = invoke_id;
|
apdu[2] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; // service choice
|
||||||
apdu[3] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; // service choice
|
apdu_len = 3;
|
||||||
apdu_len = 4;
|
|
||||||
switch (data->access)
|
switch (data->access)
|
||||||
{
|
{
|
||||||
case FILE_STREAM_ACCESS:
|
case FILE_STREAM_ACCESS:
|
||||||
@@ -291,13 +290,12 @@ int awf_ack_decode_apdu(
|
|||||||
if (!apdu)
|
if (!apdu)
|
||||||
return -1;
|
return -1;
|
||||||
// optional checking - most likely was already done prior to this call
|
// optional checking - most likely was already done prior to this call
|
||||||
if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
|
if (apdu[0] != PDU_TYPE_COMPLEX_ACK)
|
||||||
return -1;
|
return -1;
|
||||||
// apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted());
|
*invoke_id = apdu[1]; /* invoke id - filled in by net layer */
|
||||||
*invoke_id = apdu[2]; /* invoke id - filled in by net layer */
|
if (apdu[2] != SERVICE_CONFIRMED_ATOMIC_WRITE_FILE)
|
||||||
if (apdu[3] != SERVICE_CONFIRMED_ATOMIC_WRITE_FILE)
|
|
||||||
return -1;
|
return -1;
|
||||||
offset = 4;
|
offset = 3;
|
||||||
|
|
||||||
if (apdu_len > offset)
|
if (apdu_len > offset)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -304,6 +304,7 @@ bool bacfile_read_data(BACNET_ATOMIC_READ_FILE_DATA *data)
|
|||||||
pFilename = bacfile_name(data->object_instance);
|
pFilename = bacfile_name(data->object_instance);
|
||||||
if (pFilename)
|
if (pFilename)
|
||||||
{
|
{
|
||||||
|
found = true;
|
||||||
pFile = fopen(pFilename,"rb");
|
pFile = fopen(pFilename,"rb");
|
||||||
if (pFile)
|
if (pFile)
|
||||||
{
|
{
|
||||||
@@ -315,10 +316,16 @@ bool bacfile_read_data(BACNET_ATOMIC_READ_FILE_DATA *data)
|
|||||||
fclose(pFile);
|
fclose(pFile);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
data->fileDataLength = 0;
|
data->fileDataLength = 0;
|
||||||
|
data->endOfFile = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
data->fileDataLength = 0;
|
data->fileDataLength = 0;
|
||||||
|
data->endOfFile = true;
|
||||||
|
}
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -685,7 +685,9 @@ void AtomicReadFileHandler(
|
|||||||
&Tx_Buf[pdu_len],
|
&Tx_Buf[pdu_len],
|
||||||
service_data->invoke_id,
|
service_data->invoke_id,
|
||||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
||||||
fprintf(stderr,"Sending Abort!\n");
|
fprintf(stderr,"Sending Abort! %u octets requested. Only able to send %u octets.\n",
|
||||||
|
data.type.stream.requestedOctetCount,
|
||||||
|
data.fileDataLength);
|
||||||
send = true;
|
send = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user