From 2d45c2d6792d51a87d495fef2b66238d3d0389f3 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 13 May 2016 17:41:04 +0200 Subject: [PATCH] - add client side code to create read journals requests required for IEC 61850 logging services --- examples/mms_utility/mms_utility.c | 25 ++- src/CMakeLists.txt | 1 + src/mms/inc/mms_client_connection.h | 7 + src/mms/inc/mms_common.h | 2 + src/mms/inc_private/mms_client_internal.h | 8 + .../iso_mms/client/mms_client_connection.c | 64 +++++- src/mms/iso_mms/client/mms_client_files.c | 43 ---- src/mms/iso_mms/client/mms_client_journals.c | 212 ++++++++++++++++++ .../iso_mms/server/mms_get_namelist_service.c | 2 +- src/mms/iso_mms/server/mms_journal_service.c | 4 +- .../iso_mms/server/mms_server_connection.c | 12 +- 11 files changed, 313 insertions(+), 67 deletions(-) create mode 100644 src/mms/iso_mms/client/mms_client_journals.c diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index b56ea13..d34172d 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -170,7 +170,30 @@ int main(int argc, char** argv) { printf(" %s\n", name); printf(" read journal...\n"); - MmsConnection_readJournal(con, &error, domainName, name); + // MmsConnection_readJournal(con, &error, domainName, name); + +#if 1 + uint64_t timestamp = Hal_getTimeInMs(); + + MmsValue* startTime = MmsValue_newBinaryTime(false); + MmsValue_setBinaryTime(startTime, timestamp - 60000); + + MmsValue* endTime = MmsValue_newBinaryTime(false); + MmsValue_setBinaryTime(endTime, timestamp); + + MmsConnection_readJournalTimeRange(con, &error, domainName, name, startTime, endTime); +#endif + +#if 0 + uint64_t timestamp = Hal_getTimeInMs(); + + MmsValue* startTime = MmsValue_newBinaryTime(false); + MmsValue_setBinaryTime(startTime, timestamp - 60000); + + MmsValue* entrySpec = MmsValue_newOctetString(8, 8); + + MmsConnection_readJournalStartAfter(con, &error, domainName, name, startTime, entrySpec); +#endif } } } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8f5319..d68865a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,7 @@ set (lib_common_SRCS ./mms/iso_mms/client/mms_client_get_var_access.c ./mms/iso_mms/client/mms_client_common.c ./mms/iso_mms/client/mms_client_read.c +./mms/iso_mms/client/mms_client_journals.c ./mms/iso_mms/server/mms_read_service.c ./mms/iso_mms/server/mms_file_service.c ./mms/iso_mms/server/mms_association_service.c diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 5dfa60d..4275c23 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -724,6 +724,13 @@ MmsConnection_getFileDirectory(MmsConnection self, MmsError* mmsError, const cha LinkedList MmsConnection_readJournal(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId); +LinkedList +MmsConnection_readJournalTimeRange(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId, + MmsValue* startingTime, MmsValue* endingTime); + +LinkedList +MmsConnection_readJournalStartAfter(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId, + MmsValue* timeSpecification, MmsValue* entrySpecification); /** * \brief Destroy (free) an MmsServerIdentity object diff --git a/src/mms/inc/mms_common.h b/src/mms/inc/mms_common.h index 50d6b12..b8bf944 100644 --- a/src/mms/inc/mms_common.h +++ b/src/mms/inc/mms_common.h @@ -45,6 +45,8 @@ typedef enum MMS_ERROR_PARSING_RESPONSE = 4, MMS_ERROR_HARDWARE_FAULT = 5, MMS_ERROR_CONCLUDE_REJECTED = 6, + MMS_ERROR_INVALID_ARGUMENTS = 7, + MMS_ERROR_OTHER = 9, /* confirmed error PDU codes */ diff --git a/src/mms/inc_private/mms_client_internal.h b/src/mms/inc_private/mms_client_internal.h index 95f4a8b..c96cfc3 100644 --- a/src/mms/inc_private/mms_client_internal.h +++ b/src/mms/inc_private/mms_client_internal.h @@ -263,4 +263,12 @@ mmsClient_createMmsGetNameListRequestAssociationSpecific(long invokeId, ByteBuff void mmsClient_createReadJournalRequest(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId); +void +mmsClient_createReadJournalRequestWithTimeRange(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId, + MmsValue* startingTime, MmsValue* endingTime); + +void +mmsClient_createReadJournalRequestStartAfter(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId, + MmsValue* timeSpecification, MmsValue* entrySpecification); + #endif /* MMS_MSG_INTERNAL_H_ */ diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 9a50fe1..930ed6f 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -1642,18 +1642,11 @@ MmsConnection_getServerStatus(MmsConnection self, MmsError* mmsError, int* vmdLo } - -LinkedList -MmsConnection_readJournal(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId) +static LinkedList +readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuffer* payload) { - ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); - - mmsClient_createReadJournalRequest(invokeId, payload, domainId, itemId); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); if (self->lastResponseError != MMS_ERROR_NONE) @@ -1671,6 +1664,59 @@ MmsConnection_readJournal(MmsConnection self, MmsError* mmsError, const char* do return NULL; } +LinkedList +MmsConnection_readJournal(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId) +{ + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); + + uint32_t invokeId = getNextInvokeId(self); + + mmsClient_createReadJournalRequest(invokeId, payload, domainId, itemId); + + return readJournal(self, mmsError, invokeId, payload); +} + +LinkedList +MmsConnection_readJournalTimeRange(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId, + MmsValue* startingTime, MmsValue* endingTime) +{ + if ((MmsValue_getType(startingTime) != MMS_BINARY_TIME) || + (MmsValue_getType(endingTime) != MMS_BINARY_TIME)) { + + *mmsError = MMS_ERROR_INVALID_ARGUMENTS; + return NULL; + } + + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); + + uint32_t invokeId = getNextInvokeId(self); + + mmsClient_createReadJournalRequestWithTimeRange(invokeId, payload, domainId, itemId, startingTime, endingTime); + + return readJournal(self, mmsError, invokeId, payload); +} + +LinkedList +MmsConnection_readJournalStartAfter(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId, + MmsValue* timeSpecification, MmsValue* entrySpecification) +{ + + if ((MmsValue_getType(timeSpecification) != MMS_BINARY_TIME) || + (MmsValue_getType(entrySpecification) != MMS_OCTET_STRING)) { + + *mmsError = MMS_ERROR_INVALID_ARGUMENTS; + return NULL; + } + + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); + + uint32_t invokeId = getNextInvokeId(self); + + mmsClient_createReadJournalRequestStartAfter(invokeId, payload, domainId, itemId, timeSpecification, entrySpecification); + + return readJournal(self, mmsError, invokeId, payload); +} + int32_t MmsConnection_fileOpen(MmsConnection self, MmsError* mmsError, const char* filename, uint32_t initialPosition, uint32_t* fileSize, uint64_t* lastModified) diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index fcc7de1..81b18bb 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -32,49 +32,6 @@ #include "ber_decode.h" #include "conversions.h" -void -mmsClient_createReadJournalRequest(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId) -{ - /* calculate sizes */ - uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); - - uint32_t domainIdStringSize = strlen(domainId); - uint32_t domainIdSize = 1 + BerEncoder_determineLengthSize(domainIdStringSize) + domainIdStringSize; - - uint32_t itemIdStringSize = strlen(itemId); - uint32_t itemIdSize = 1 + BerEncoder_determineLengthSize(itemIdStringSize) + itemIdStringSize; - - uint32_t objectIdSize = domainIdSize + itemIdSize; - - uint32_t journalNameSize = 1 + BerEncoder_determineLengthSize(objectIdSize) + (objectIdSize); - - uint32_t journalReadSize = 1 + BerEncoder_determineLengthSize(journalNameSize) + (journalNameSize); - - uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + journalReadSize; - - /* encode to buffer */ - int bufPos = 0; - uint8_t* buffer = request->buffer; - - bufPos = BerEncoder_encodeTL(0xa0, confirmedRequestPduSize, buffer, bufPos); - bufPos = BerEncoder_encodeTL(0x02, invokeIdSize, buffer, bufPos); - bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); - - /* Encode read journal tag (context | structured ) [65 = 41h] */ - buffer[bufPos++] = 0xbf; - buffer[bufPos++] = 0x41; - - bufPos = BerEncoder_encodeLength(journalReadSize, buffer, bufPos); - bufPos = BerEncoder_encodeTL(0xa0, journalNameSize, buffer, bufPos); - - bufPos = BerEncoder_encodeTL(0xa1, objectIdSize, buffer, bufPos); - - bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) domainId, domainIdStringSize, buffer, bufPos); - bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) itemId, itemIdStringSize, buffer, bufPos); - - request->size = bufPos; -} - void mmsClient_createFileOpenRequest(uint32_t invokeId, ByteBuffer* request, const char* fileName, uint32_t initialPosition) { diff --git a/src/mms/iso_mms/client/mms_client_journals.c b/src/mms/iso_mms/client/mms_client_journals.c new file mode 100644 index 0000000..0099f41 --- /dev/null +++ b/src/mms/iso_mms/client/mms_client_journals.c @@ -0,0 +1,212 @@ +/* + * mms_client_journals.c + * + * Copyright 2016 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +#include "libiec61850_platform_includes.h" +#include "stack_config.h" +#include "mms_common.h" +#include "mms_client_connection.h" +#include "byte_buffer.h" + +#include "mms_client_internal.h" +#include "ber_encoder.h" +#include "ber_decode.h" +#include "conversions.h" +#include "mms_value_internal.h" + +void +mmsClient_createReadJournalRequest(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId) +{ + /* calculate sizes */ + uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); + + uint32_t domainIdStringSize = strlen(domainId); + uint32_t domainIdSize = 1 + BerEncoder_determineLengthSize(domainIdStringSize) + domainIdStringSize; + + uint32_t itemIdStringSize = strlen(itemId); + uint32_t itemIdSize = 1 + BerEncoder_determineLengthSize(itemIdStringSize) + itemIdStringSize; + + uint32_t objectIdSize = domainIdSize + itemIdSize; + + uint32_t journalNameSize = 1 + BerEncoder_determineLengthSize(objectIdSize) + (objectIdSize); + + uint32_t journalReadSize = 1 + BerEncoder_determineLengthSize(journalNameSize) + (journalNameSize); + + uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + journalReadSize; + + /* encode to buffer */ + int bufPos = 0; + uint8_t* buffer = request->buffer; + + bufPos = BerEncoder_encodeTL(0xa0, confirmedRequestPduSize, buffer, bufPos); + bufPos = BerEncoder_encodeTL(0x02, invokeIdSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); + + /* Encode read journal tag (context | structured ) [65 = 41h] */ + buffer[bufPos++] = 0xbf; + buffer[bufPos++] = 0x41; + + bufPos = BerEncoder_encodeLength(journalReadSize, buffer, bufPos); + bufPos = BerEncoder_encodeTL(0xa0, journalNameSize, buffer, bufPos); + + bufPos = BerEncoder_encodeTL(0xa1, objectIdSize, buffer, bufPos); + + bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) domainId, domainIdStringSize, buffer, bufPos); + bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) itemId, itemIdStringSize, buffer, bufPos); + + request->size = bufPos; +} + +void +mmsClient_createReadJournalRequestWithTimeRange(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId, + MmsValue* startingTime, MmsValue* endingTime) +{ + /* calculate sizes */ + uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); + + uint32_t domainIdStringSize = strlen(domainId); + uint32_t domainIdSize = 1 + BerEncoder_determineLengthSize(domainIdStringSize) + domainIdStringSize; + + uint32_t itemIdStringSize = strlen(itemId); + uint32_t itemIdSize = 1 + BerEncoder_determineLengthSize(itemIdStringSize) + itemIdStringSize; + + uint32_t objectIdSize = domainIdSize + itemIdSize; + + uint32_t journalNameSize = 1 + BerEncoder_determineLengthSize(objectIdSize) + (objectIdSize); + + uint32_t startingTimeSize = 2 + startingTime->value.binaryTime.size; + + uint32_t rangeStartSpecSize = 2 + startingTimeSize; + + uint32_t endingTimeSize = 2 + endingTime->value.binaryTime.size; + + uint32_t rangeEndSpecSize = 2 + endingTimeSize; + + uint32_t journalReadContentSize = journalNameSize + rangeStartSpecSize + rangeEndSpecSize; + + uint32_t journalReadSize = 1 + BerEncoder_determineLengthSize(journalReadContentSize) + (journalReadContentSize); + + uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + journalReadSize; + + /* encode to buffer */ + int bufPos = 0; + uint8_t* buffer = request->buffer; + + bufPos = BerEncoder_encodeTL(0xa0, confirmedRequestPduSize, buffer, bufPos); + bufPos = BerEncoder_encodeTL(0x02, invokeIdSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); + + /* encode read journal tag (context | structured ) [65 = 41h] */ + buffer[bufPos++] = 0xbf; + buffer[bufPos++] = 0x41; + + bufPos = BerEncoder_encodeLength(journalReadSize, buffer, bufPos); + + /* encode journalName */ + bufPos = BerEncoder_encodeTL(0xa0, journalNameSize, buffer, bufPos); + + bufPos = BerEncoder_encodeTL(0xa1, objectIdSize, buffer, bufPos); + + bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) domainId, domainIdStringSize, buffer, bufPos); + bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) itemId, itemIdStringSize, buffer, bufPos); + + /* encode rangeStartSpecification|startingTime */ + bufPos = BerEncoder_encodeTL(0xa1, startingTimeSize, buffer, bufPos); + bufPos = BerEncoder_encodeOctetString(0x80, startingTime->value.binaryTime.buf, + startingTime->value.binaryTime.size, buffer, bufPos); + + /* encode rangeStopSpecification|endingTime */ + bufPos = BerEncoder_encodeTL(0xa2, endingTimeSize, buffer, bufPos); + bufPos = BerEncoder_encodeOctetString(0x80, endingTime->value.binaryTime.buf, + endingTime->value.binaryTime.size, buffer, bufPos); + + request->size = bufPos; +} + +void +mmsClient_createReadJournalRequestStartAfter(uint32_t invokeId, ByteBuffer* request, const char* domainId, const char* itemId, + MmsValue* timeSpecification, MmsValue* entrySpecification) +{ + /* calculate sizes */ + uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); + + uint32_t domainIdStringSize = strlen(domainId); + uint32_t domainIdSize = 1 + BerEncoder_determineLengthSize(domainIdStringSize) + domainIdStringSize; + + uint32_t itemIdStringSize = strlen(itemId); + uint32_t itemIdSize = 1 + BerEncoder_determineLengthSize(itemIdStringSize) + itemIdStringSize; + + uint32_t objectIdSize = domainIdSize + itemIdSize; + + uint32_t journalNameSize = 1 + BerEncoder_determineLengthSize(objectIdSize) + (objectIdSize); + + uint32_t timeSpecificationSize = 2 + timeSpecification->value.binaryTime.size; + + uint32_t entrySpecificationSize = 2 + entrySpecification->value.octetString.size; + + uint32_t entryToStartAfterContentSize = timeSpecificationSize + entrySpecificationSize; + + uint32_t entryToStartAfterSize = 1 + BerEncoder_determineLengthSize(entryToStartAfterContentSize) + + entryToStartAfterContentSize; + + uint32_t journalReadContentSize = journalNameSize + entryToStartAfterSize; + + uint32_t journalReadSize = 1 + BerEncoder_determineLengthSize(journalReadContentSize) + (journalReadContentSize); + + uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + journalReadSize; + + /* encode to buffer */ + int bufPos = 0; + uint8_t* buffer = request->buffer; + + bufPos = BerEncoder_encodeTL(0xa0, confirmedRequestPduSize, buffer, bufPos); + bufPos = BerEncoder_encodeTL(0x02, invokeIdSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); + + /* encode read journal tag (context | structured ) [65 = 41h] */ + buffer[bufPos++] = 0xbf; + buffer[bufPos++] = 0x41; + + bufPos = BerEncoder_encodeLength(journalReadSize, buffer, bufPos); + + /* encode journalName */ + bufPos = BerEncoder_encodeTL(0xa0, journalNameSize, buffer, bufPos); + + bufPos = BerEncoder_encodeTL(0xa1, objectIdSize, buffer, bufPos); + + bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) domainId, domainIdStringSize, buffer, bufPos); + bufPos = BerEncoder_encodeOctetString(0x1a, (uint8_t*) itemId, itemIdStringSize, buffer, bufPos); + + /* encode entryToStartAfter */ + bufPos = BerEncoder_encodeTL(0xa5, entryToStartAfterContentSize, buffer, bufPos); + + /* encode entryToStartAfter|timeSpecification */ + bufPos = BerEncoder_encodeOctetString(0x80, timeSpecification->value.binaryTime.buf, + timeSpecification->value.binaryTime.size, buffer, bufPos); + + /* encode entryToStartAfter|entrySpecification */ + bufPos = BerEncoder_encodeOctetString(0x81, entrySpecification->value.octetString.buf, + entrySpecification->value.octetString.size, buffer, bufPos); + + request->size = bufPos; +} + diff --git a/src/mms/iso_mms/server/mms_get_namelist_service.c b/src/mms/iso_mms/server/mms_get_namelist_service.c index fe93737..7ce55af 100644 --- a/src/mms/iso_mms/server/mms_get_namelist_service.c +++ b/src/mms/iso_mms/server/mms_get_namelist_service.c @@ -539,7 +539,7 @@ mmsServer_handleGetNameListRequest( mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); else { createNameListResponse(connection, invokeId, nameList, response, continueAfterId); - LinkedList_destroy(nameList); + LinkedList_destroyStatic(nameList); } } #if (MMS_DATA_SET_SERVICE == 1) diff --git a/src/mms/iso_mms/server/mms_journal_service.c b/src/mms/iso_mms/server/mms_journal_service.c index 6e8135d..a9ef4ad 100644 --- a/src/mms/iso_mms/server/mms_journal_service.c +++ b/src/mms/iso_mms/server/mms_journal_service.c @@ -32,7 +32,7 @@ parseStringWithMaxLength(char* filename, int maxLength, uint8_t* buffer, int* bu uint8_t tag = buffer[(*bufPos)++]; int length; - if (tag != 0x19) { /* TODO 0x1a */ + if (tag != 0x1a) { mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } @@ -96,12 +96,10 @@ mmsServer_handleReadJournalRequest( printf(" domain-specific-log\n"); if (!parseStringWithMaxLength(domainId, 64, requestBuffer, &bufPos, bufPos + length, invokeId, response)) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } if (!parseStringWithMaxLength(logName, 64, requestBuffer, &bufPos, bufPos + length, invokeId, response)) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 10b5790..d405762 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -47,8 +47,6 @@ mmsServer_writeMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response asn_long2INTEGER(mmsPdu->choice.rejectPDU.originalInvokeID, *invokeId); } - printf("invokeId %p originalInvokeID: %p\n", invokeId, mmsPdu->choice.rejectPDU.originalInvokeID); - if (reason == MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE) { mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_confirmedRequestPDU; mmsPdu->choice.rejectPDU.rejectReason.choice.confirmedResponsePDU = @@ -66,8 +64,8 @@ mmsServer_writeMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response } else if (reason == MMS_ERROR_REJECT_INVALID_PDU) { mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_pduError; - mmsPdu->choice.rejectPDU.rejectReason.choice.confirmedResponsePDU = - RejectPDU__rejectReason__pduError_invalidPdu; + asn_long2INTEGER(&mmsPdu->choice.rejectPDU.rejectReason.choice.pduError, + RejectPDU__rejectReason__pduError_invalidPdu); } else { mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_confirmedRequestPDU; @@ -77,12 +75,6 @@ mmsServer_writeMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); - if (mmsPdu->choice.rejectPDU.originalInvokeID != NULL) { - GLOBAL_FREEMEM(mmsPdu->choice.rejectPDU.originalInvokeID); - mmsPdu->choice.rejectPDU.originalInvokeID = NULL; - } - - asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); }