diff --git a/CMakeLists.txt b/CMakeLists.txt index e4e7cfd1..36100119 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,9 +10,9 @@ endif() project(libiec61850) ENABLE_TESTING() -set(LIB_VERSION_MAJOR "0") -set(LIB_VERSION_MINOR "9") -set(LIB_VERSION_PATCH "3") +set(LIB_VERSION_MAJOR "1") +set(LIB_VERSION_MINOR "0") +set(LIB_VERSION_PATCH "0") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/") diff --git a/config/stack_config.h b/config/stack_config.h index 003dae30..abe95158 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -159,7 +159,7 @@ /* overwrite default results for MMS identify service */ //#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" //#define CONFIG_DEFAULT_MMS_MODEL_NAME "LIBIEC61850" -//#define CONFIG_DEFAULT_MMS_REVISION "0.9.3" +//#define CONFIG_DEFAULT_MMS_REVISION "1.0.0" /* MMS virtual file store base path - where MMS file services are looking for files */ #define CONFIG_VIRTUAL_FILESTORE_BASEPATH "./vmd-filestore/" diff --git a/src/common/inc/libiec61850_platform_includes.h b/src/common/inc/libiec61850_platform_includes.h index 7c2452fe..9ae9bd8e 100644 --- a/src/common/inc/libiec61850_platform_includes.h +++ b/src/common/inc/libiec61850_platform_includes.h @@ -15,7 +15,7 @@ #include "platform_endian.h" -#define LIBIEC61850_VERSION "0.9.3" +#define LIBIEC61850_VERSION "1.0.0" #ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" diff --git a/src/doxygen.config b/src/doxygen.config index b5d5f595..c53fdd75 100644 --- a/src/doxygen.config +++ b/src/doxygen.config @@ -18,7 +18,7 @@ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "libIEC61850" -PROJECT_NUMBER = 0.9.3 +PROJECT_NUMBER = 1.0.0 PROJECT_BRIEF = "Open-source IEC 61850 MMS/GOOSE/SV server and client library" diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index da745847..fd7f79cd 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -84,6 +84,12 @@ iedConnection_mapMmsErrorToIedError(MmsError mmsError) case MMS_ERROR_FILE_FILE_NON_EXISTENT: return IED_ERROR_OBJECT_DOES_NOT_EXIST; + case MMS_ERROR_FILE_DUPLICATE_FILENAME: + return IED_ERROR_OBJECT_EXISTS; + + case MMS_ERROR_FILE_FILE_ACCESS_DENIED: + return IED_ERROR_ACCESS_DENIED; + case MMS_ERROR_CONNECTION_REJECTED: return IED_ERROR_CONNECTION_REJECTED; @@ -1172,6 +1178,24 @@ IedConnection_getFile(IedConnection self, IedClientError* error, const char* fil return clientFileReadHandler.byteReceived; } +void +IedConnection_setFile(IedConnection self, IedClientError* error, const char* sourceFilename, const char* destinationFilename) +{ +#if (MMS_OBTAIN_FILE_SERVICE == 1) + *error = IED_ERROR_OK; + + MmsError mmsError; + + MmsConnection_obtainFile(self->connection, &mmsError, sourceFilename, destinationFilename); + + if (mmsError != MMS_ERROR_NONE) { + *error = iedConnection_mapMmsErrorToIedError(mmsError); + } +#else + *error = IED_ERROR_SERVICE_NOT_IMPLEMENTED; +#endif /* (MMS_OBTAIN_FILE_SERVICE == 1) */ +} + void IedConnection_deleteFile(IedConnection self, IedClientError* error, const char* fileName) { diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 7ce06ee9..5cda0448 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -156,7 +156,10 @@ typedef enum { /** The object is invalidated (returned by server) */ IED_ERROR_OBJECT_INVALIDATED = 33, - /* unknown error */ + /** Service not implemented */ + IED_ERROR_SERVICE_NOT_IMPLEMENTED = 98, + + /** unknown error */ IED_ERROR_UNKNOWN = 99 } IedClientError; @@ -1886,6 +1889,20 @@ uint32_t IedConnection_getFile(IedConnection self, IedClientError* error, const char* fileName, IedClientGetFileHandler handler, void* handlerParameter); +/** + * \brief Implementation of the SetFile ACSI service + * + * Upload a file to the server. The file has to be available in the local VMD filestore. + * + * \param self the connection object + * \param error the error code if an error occurs + * \param sourceFilename the filename of the local (client side) file + * \param destinationFilename the filename of the remote (service side) file + */ +void +IedConnection_setFile(IedConnection self, IedClientError* error, const char* sourceFilename, const char* destinationFilename); + + /** * \brief Implementation of the DeleteFile ACSI service * diff --git a/src/mms/inc_private/mms_client_internal.h b/src/mms/inc_private/mms_client_internal.h index 147825b7..af992ad1 100644 --- a/src/mms/inc_private/mms_client_internal.h +++ b/src/mms/inc_private/mms_client_internal.h @@ -294,12 +294,11 @@ mmsClient_handleFileReadRequest( ByteBuffer* response); void -mmsClient_handleFileReadRequest( - MmsConnection connection, - uint8_t* buffer, int bufPos, int maxBufPos, - uint32_t invokeId, - ByteBuffer* response); - +mmsClient_handleFileCloseRequest( +MmsConnection connection, +uint8_t* buffer, int bufPos, int maxBufPos, +uint32_t invokeId, +ByteBuffer* response); #endif /* MMS_MSG_INTERNAL_H_ */ diff --git a/src/mms/inc_private/mms_common_internal.h b/src/mms/inc_private/mms_common_internal.h index f30eede1..9552d13f 100644 --- a/src/mms/inc_private/mms_common_internal.h +++ b/src/mms/inc_private/mms_common_internal.h @@ -60,6 +60,10 @@ mmsMsg_createFileReadResponse(int maxPduSize, uint32_t invokeId, ByteBuffer* res void mmsMsg_createFileCloseResponse(uint32_t invokeId, ByteBuffer* response); +void +mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm); + + #endif /* (MMS_FILE_SERVICE == 1) */ typedef struct sMmsServiceError @@ -68,6 +72,13 @@ typedef struct sMmsServiceError int errorCode; } MmsServiceError; + +void /* Confirmed service error (ServiceError) */ +mmsMsg_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType); + +void +mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response); + int mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, MmsServiceError* serviceError); diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index c4add8e5..a95579a8 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -184,6 +184,9 @@ struct sMmsServerConnection { #if (MMS_OBTAIN_FILE_SERVICE == 1) MmsObtainFileTask MmsServer_getObtainFileTask(MmsServer self); + +void +mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task); #endif ByteBuffer* @@ -222,7 +225,7 @@ MmsPdu_t* mmsServer_createConfirmedResponse(uint32_t invokeId); void -mmsServer_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType); +mmsMsg_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType); void mmsServer_createServiceErrorPduWithServiceSpecificInfo(uint32_t invokeId, ByteBuffer* response, @@ -363,7 +366,7 @@ mmsServer_createMmsWriteResponse(MmsServerConnection connection, int invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults); void -mmsServer_writeMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response); +mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response); MmsError mmsServer_callVariableListChangedHandler(bool create, MmsVariableListType listType, MmsDomain* domain, diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 36775725..711571d5 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -450,9 +450,33 @@ convertServiceErrorToMmsError(MmsServiceError serviceError) case 11: /* class: file */ switch (serviceError.errorCode) { + case 1: + mmsError = MMS_ERROR_FILE_FILENAME_AMBIGUOUS; + break; + case 2: + mmsError = MMS_ERROR_FILE_FILE_BUSY; + break; + case 3: + mmsError = MMS_ERROR_FILE_FILENAME_SYNTAX_ERROR; + break; + case 4: + mmsError = MMS_ERROR_FILE_CONTENT_TYPE_INVALID; + break; + case 5: + mmsError = MMS_ERROR_FILE_POSITION_INVALID; + break; + case 6: + mmsError = MMS_ERROR_FILE_FILE_ACCESS_DENIED; + break; case 7: mmsError = MMS_ERROR_FILE_FILE_NON_EXISTENT; break; + case 8: + mmsError = MMS_ERROR_FILE_DUPLICATE_FILENAME; + break; + case 9: + mmsError = MMS_ERROR_FILE_INSUFFICIENT_SPACE_IN_FILESTORE; + break; default: mmsError = MMS_ERROR_FILE_OTHER; break; @@ -739,7 +763,6 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) if (DEBUG_MMS_CLIENT) printf("MMS_CLIENT: received confirmed request PDU (size=%i)\n", payload->size); - // TODO handle confirmed request PDU only when obtainFile service is enabled // TODO extract function int bufPos = 1; @@ -750,20 +773,19 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) while (bufPos < payload->size) { - uint8_t tag = buf[bufPos++]; - + uint8_t nestedTag = buf[bufPos++]; bool extendedTag = false; - if ((tag & 0x1f) == 0x1f) { + if ((nestedTag & 0x1f) == 0x1f) { extendedTag = true; - tag = buf[bufPos++]; + nestedTag = buf[bufPos++]; } bufPos = BerDecoder_decodeLength(buf, &length, bufPos, payload->size); if (extendedTag) { - switch(tag) { + switch(nestedTag) { #if (MMS_FILE_SERVICE == 1) case 0x48: /* file-open-request */ @@ -823,7 +845,7 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) } } else { - switch(tag) { + switch(nestedTag) { case 0x02: /* invoke Id */ invokeId = BerDecoder_decodeUint32(buf, length, bufPos); if (DEBUG_MMS_CLIENT) @@ -2089,7 +2111,7 @@ MmsConnection_obtainFile(MmsConnection self, MmsError* mmsError, const char* sou mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + sendRequestAndWaitForResponse(self, invokeId, payload); if (self->lastResponseError != MMS_ERROR_NONE) *mmsError = self->lastResponseError; diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index 38dff428..a6603ebc 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -107,19 +107,19 @@ parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint int length; if (tag != 0x19) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); if (*bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } if (length > 255) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return false; } @@ -182,14 +182,14 @@ mmsClient_handleFileOpenRequest( frsm->readPosition = filePosition; frsm->frsmId = getNextFrsmId(connection); - mmsServer_createFileOpenResponse(invokeId, response, filename, frsm); + mmsMsg_createFileOpenResponse(invokeId, response, filename, frsm); } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER); } else goto exit_invalid_parameter; @@ -197,11 +197,11 @@ mmsClient_handleFileOpenRequest( return; exit_invalid_parameter: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; exit_reject_invalid_pdu: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); } @@ -222,7 +222,7 @@ mmsClient_handleFileReadRequest( if (frsm != NULL) mmsMsg_createFileReadResponse(connection->parameters.maxPduSize, invokeId, response, frsm); else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); } void diff --git a/src/mms/iso_mms/server/mms_association_service.c b/src/mms/iso_mms/server/mms_association_service.c index 7065d557..7a5245c7 100644 --- a/src/mms/iso_mms/server/mms_association_service.c +++ b/src/mms/iso_mms/server/mms_association_service.c @@ -46,6 +46,8 @@ #define MMS_SERVICE_DEFINE_NAMED_TYPE 0x02 #define MMS_SERVICE_GET_NAMED_TYPE_ATTRIBUTES 0x01 +#define MMS_SERVICE_OBTAIN_FILE 0x02 + #define MMS_SERVICE_READ_JOURNAL 0x40 #define MMS_SERVICE_FILE_OPEN 0x80 @@ -84,7 +86,11 @@ static uint8_t servicesSupported[] = 0x00, 0x00, 0x00, - 0x00, + 0x00 +#if (MMS_OBTAIN_FILE_SERVICE == 1) + | MMS_SERVICE_OBTAIN_FILE +#endif + , 0x00, 0x00, 0x00 diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 7c5b63ba..9894e9a6 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -23,6 +23,7 @@ #include "libiec61850_platform_includes.h" #include "mms_server_internal.h" +#include "mms_client_internal.h" #if (MMS_FILE_SERVICE == 1) @@ -179,7 +180,7 @@ deleteFile(char* fileName) { } void -mmsServer_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm) +mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm) { uint64_t msTime; @@ -225,19 +226,19 @@ parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint int length; if (tag != 0x19) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); if (*bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } if (length > 255) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return false; } @@ -274,7 +275,7 @@ mmsServer_handleFileDeleteRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: mms_file_service.c: File (%s) not found\n", filename); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); return; } @@ -282,7 +283,7 @@ mmsServer_handleFileDeleteRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: mms_file_service.c: Delete file (%s) failed\n", filename); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_ACCESS_DENIED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_ACCESS_DENIED); return; } @@ -290,7 +291,7 @@ mmsServer_handleFileDeleteRequest( return; exit_reject_invalid_pdu: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); } void @@ -345,15 +346,15 @@ mmsServer_handleFileOpenRequest( frsm->readPosition = filePosition; frsm->frsmId = getNextFrsmId(connection); - mmsServer_createFileOpenResponse(invokeId, response, filename, frsm); + mmsMsg_createFileOpenResponse(invokeId, response, filename, frsm); } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER); } else goto exit_invalid_parameter; @@ -361,15 +362,29 @@ mmsServer_handleFileOpenRequest( return; exit_invalid_parameter: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; exit_reject_invalid_pdu: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); } #if (MMS_OBTAIN_FILE_SERVICE == 1) + +static void /* Confirmed service error (ServiceError) */ +createServiceErrorObtainFileError(uint32_t invokeId, ByteBuffer* response, + MmsError errorType, uint32_t value) +{ + uint8_t buffer[8]; + + int size = BerEncoder_encodeUInt32WithTL(0x80, value, buffer, 0); + + mmsServer_createServiceErrorPduWithServiceSpecificInfo(invokeId, response, errorType, + buffer, size); +} + + static void createObtainFileResponse(uint32_t invokeId, ByteBuffer* response) { @@ -379,6 +394,9 @@ createObtainFileResponse(uint32_t invokeId, ByteBuffer* response) void mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) { + + //printf("mmsServer_fileUploadTask: state: %i\n", task->state); + switch (task->state) { case MMS_FILE_UPLOAD_STATE_NOT_USED: @@ -468,21 +486,41 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) case MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE: - // TODO send ObtainFileError + { + /* send ObtainFileError */ - printf("MMS_SERVER: ObtainFile service: failed to open file from client\n"); + ByteBuffer* response = MmsServer_reserveTransmitBuffer(self); - task->state = MMS_FILE_UPLOAD_STATE_NOT_USED; + createServiceErrorObtainFileError(task->obtainFileRequestInvokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT, 0); + + IsoConnection_sendMessage(task->connection->isoConnection, response, false); + + MmsServer_releaseTransmitBuffer(self); + + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: ObtainFile service: failed to open file from client\n"); + task->state = MMS_FILE_UPLOAD_STATE_NOT_USED; + } break; case MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_DESTINATION: + { + /* send ObtainFileError */ - //TODO send ObtainFileError - printf("MMS_SERVER: ObtainFile service: failed to create local file\n"); + ByteBuffer* response = MmsServer_reserveTransmitBuffer(self); + createServiceErrorObtainFileError(task->obtainFileRequestInvokeId, response, MMS_ERROR_FILE_OTHER, 1); - task->state = MMS_FILE_UPLOAD_STATE_NOT_USED; + IsoConnection_sendMessage(task->connection->isoConnection, response, false); + + MmsServer_releaseTransmitBuffer(self); + + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: ObtainFile service: failed to create local file\n"); + + task->state = MMS_FILE_UPLOAD_STATE_NOT_USED; + } break; @@ -559,7 +597,15 @@ mmsServer_handleObtainFileRequest( if (connection->server->obtainFileHandler(connection->server->obtainFileHandlerParameter, connection, sourceFilename, destinationFilename) == false) goto exit_access_denied; - //TODO check if destination file already exists. If exists return error message + /* check if destination file already exists. If exists return error message */ + char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; + createExtendedFilename(extendedFileName, destinationFilename); + + if (FileSystem_getFileInfo(extendedFileName, NULL, NULL)) { + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: obtainFile - file already exists on server\n"); + goto exit_file_already_exists; + } if (DEBUG_MMS_SERVER) printf("MMS_SERVER: Start download file %s from client to local file %s...\n", sourceFilename, destinationFilename); @@ -604,19 +650,23 @@ mmsServer_handleObtainFileRequest( return; exit_invalid_parameter: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; exit_access_denied: - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); + createServiceErrorObtainFileError(invokeId, response, MMS_ERROR_FILE_FILE_ACCESS_DENIED, 1); + return; + +exit_file_already_exists: + createServiceErrorObtainFileError(invokeId, response, MMS_ERROR_FILE_DUPLICATE_FILENAME, 1); return; exit_unavailable: - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_TEMPORARILY_UNAVAILABLE); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_TEMPORARILY_UNAVAILABLE); return; exit_reject_invalid_pdu: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); } #endif /* (MMS_OBTAIN_FILE_SERVICE == 1) */ @@ -694,7 +744,7 @@ mmsServer_handleFileReadRequest( if (frsm != NULL) mmsMsg_createFileReadResponse(connection->maxPduSize, invokeId, response, frsm); else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); } void @@ -846,7 +896,7 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduS if (DEBUG_MMS_SERVER) printf("MMS_SERVER: Error opening directory!\n"); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); return; } @@ -909,7 +959,7 @@ mmsServer_handleFileRenameRequest( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -950,11 +1000,11 @@ mmsServer_handleFileRenameRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: rename file failed!\n"); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); } } else - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); } @@ -981,7 +1031,7 @@ mmsServer_handleFileDirectoryRequest( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -1007,7 +1057,7 @@ mmsServer_handleFileDirectoryRequest( default: /* unrecognized parameter */ if (DEBUG_MMS_SERVER) printf("MMS_SERVER: handleFileDirectoryRequest: unrecognized parameter\n"); - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } 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 6204e247..fc6ccc28 100644 --- a/src/mms/iso_mms/server/mms_get_namelist_service.c +++ b/src/mms/iso_mms/server/mms_get_namelist_service.c @@ -348,7 +348,7 @@ createNameListResponse( } if (startElement == NULL) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); return; } } @@ -455,7 +455,7 @@ mmsServer_handleGetNameListRequest( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -485,7 +485,7 @@ mmsServer_handleGetNameListRequest( objectScope = OBJECT_SCOPE_ASSOCIATION; break; default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); return; } } @@ -529,7 +529,7 @@ mmsServer_handleGetNameListRequest( LinkedList nameList = getNameListDomainSpecific(connection, domainSpecificName); if (nameList == NULL) - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); else { createNameListResponse(connection, invokeId, nameList, response, continueAfterId); LinkedList_destroy(nameList); @@ -539,7 +539,7 @@ mmsServer_handleGetNameListRequest( LinkedList nameList = getJournalListDomainSpecific(connection, domainSpecificName); if (nameList == NULL) - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); else { #if (CONFIG_MMS_SORT_NAME_LIST == 1) StringUtils_sortList(nameList); @@ -554,7 +554,7 @@ mmsServer_handleGetNameListRequest( LinkedList nameList = getNamedVariableListsDomainSpecific(connection, domainSpecificName); if (nameList == NULL) - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); else { #if (CONFIG_MMS_SORT_NAME_LIST == 1) @@ -570,7 +570,7 @@ mmsServer_handleGetNameListRequest( else { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: getNameList domain specific objectClass %i not supported!\n", objectClass); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } } @@ -628,7 +628,7 @@ mmsServer_handleGetNameListRequest( else { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: getNameList VMD specific objectClass %i not supported!\n", objectClass); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } } @@ -648,14 +648,14 @@ mmsServer_handleGetNameListRequest( LinkedList_destroy(nameList); } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ #endif /* (MMS_DATA_SET_SERVICE == 1) */ else { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: getNameList(%i) not supported!\n", objectScope); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } } diff --git a/src/mms/iso_mms/server/mms_get_var_access_service.c b/src/mms/iso_mms/server/mms_get_var_access_service.c index b1c813ea..4d0efe18 100644 --- a/src/mms/iso_mms/server/mms_get_var_access_service.c +++ b/src/mms/iso_mms/server/mms_get_var_access_service.c @@ -221,7 +221,7 @@ createVariableAccessAttributesResponse( if (domain == NULL) { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: domain %s not known\n", domainId); - mmsServer_createServiceErrorPdu(invokeId, response, + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_function; } @@ -237,7 +237,7 @@ createVariableAccessAttributesResponse( if (namedVariable == NULL) { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: named variable %s not known\n", nameId); - mmsServer_createServiceErrorPdu(invokeId, response, + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_function; @@ -266,7 +266,7 @@ createVariableAccessAttributesResponse( if (DEBUG_MMS_SERVER) printf("MMS getVariableAccessAttributes: message to large! send error PDU!\n"); - mmsServer_createServiceErrorPdu(invokeId, response, + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_SERVICE_OTHER); goto exit_function; diff --git a/src/mms/iso_mms/server/mms_journal_service.c b/src/mms/iso_mms/server/mms_journal_service.c index 74d69a77..890adce8 100644 --- a/src/mms/iso_mms/server/mms_journal_service.c +++ b/src/mms/iso_mms/server/mms_journal_service.c @@ -202,19 +202,19 @@ parseStringWithMaxLength(char* filename, int maxLength, uint8_t* buffer, int* bu int length; if (tag != 0x1a) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); if (*bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } if (length > maxLength) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return false; } @@ -260,7 +260,7 @@ mmsServer_handleReadJournalRequest( bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -287,7 +287,7 @@ mmsServer_handleReadJournalRequest( break; default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); return; } @@ -301,7 +301,7 @@ mmsServer_handleReadJournalRequest( bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos); if (subTag != 0x80) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); return; } @@ -316,7 +316,7 @@ mmsServer_handleReadJournalRequest( hasRangeStartSpec = true; } else { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; // forward request to implementation class } @@ -331,7 +331,7 @@ mmsServer_handleReadJournalRequest( bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos); if (subTag != 0x80) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); return; } @@ -344,7 +344,7 @@ mmsServer_handleReadJournalRequest( hasRangeStopSpec = true; } else { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; // forward request to implementation class } @@ -373,7 +373,7 @@ mmsServer_handleReadJournalRequest( hasTimeSpec = true; } else { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } @@ -388,14 +388,14 @@ mmsServer_handleReadJournalRequest( hasEntrySpec = true; } else { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } break; default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); return; } @@ -406,7 +406,7 @@ mmsServer_handleReadJournalRequest( break; default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } } @@ -416,7 +416,7 @@ mmsServer_handleReadJournalRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: readJournal missing journal name\n"); - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } @@ -431,7 +431,7 @@ mmsServer_handleReadJournalRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: readJournal domain %s not found\n", domainId); - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } @@ -441,7 +441,7 @@ mmsServer_handleReadJournalRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: readJournal journal %s not found\n", logName); - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } @@ -471,7 +471,7 @@ mmsServer_handleReadJournalRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: readJournal missing valid argument combination\n"); - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } diff --git a/src/mms/iso_mms/server/mms_named_variable_list_service.c b/src/mms/iso_mms/server/mms_named_variable_list_service.c index 1c730454..01eed4f8 100644 --- a/src/mms/iso_mms/server/mms_named_variable_list_service.c +++ b/src/mms/iso_mms/server/mms_named_variable_list_service.c @@ -124,7 +124,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection, asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, maxBufPos); if (rval.code != RC_OK) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); goto exit_function; } @@ -230,7 +230,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection, createServiceErrorDeleteVariableLists(invokeId, response, serviceError, numberDeleted); } else { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); @@ -419,7 +419,7 @@ mmsServer_handleDefineNamedVariableListRequest( asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, maxBufPos); if (rval.code != RC_OK) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); goto exit_function; } @@ -432,7 +432,7 @@ mmsServer_handleDefineNamedVariableListRequest( char domainName[65]; if (request->variableListName.choice.domainspecific.domainId.size > 64) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_free_struct; } @@ -443,7 +443,7 @@ mmsServer_handleDefineNamedVariableListRequest( MmsDomain* domain = MmsDevice_getDomain(device, domainName); if (domain == NULL) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_free_struct; } @@ -451,7 +451,7 @@ mmsServer_handleDefineNamedVariableListRequest( char variableListName[65]; if (request->variableListName.choice.domainspecific.itemId.size > 64) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_free_struct; } @@ -460,7 +460,7 @@ mmsServer_handleDefineNamedVariableListRequest( request->variableListName.choice.domainspecific.itemId.size); if (MmsDomain_getNamedVariableList(domain, variableListName) != NULL) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); } else { MmsError mmsError; @@ -478,15 +478,15 @@ mmsServer_handleDefineNamedVariableListRequest( } else { MmsNamedVariableList_destroy(namedVariableList); - mmsServer_createServiceErrorPdu(invokeId, response, mmsError); + mmsMsg_createServiceErrorPdu(invokeId, response, mmsError); } } else - mmsServer_createServiceErrorPdu(invokeId, response, mmsError); + mmsMsg_createServiceErrorPdu(invokeId, response, mmsError); } } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_CAPABILITY_UNAVAILABLE); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_CAPABILITY_UNAVAILABLE); } @@ -498,7 +498,7 @@ mmsServer_handleDefineNamedVariableListRequest( if (request->variableListName.choice.aaspecific.size > 64) { //TODO send reject PDU instead? - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_free_struct; } @@ -507,7 +507,7 @@ mmsServer_handleDefineNamedVariableListRequest( request->variableListName.choice.aaspecific.size); if (MmsServerConnection_getNamedVariableList(connection, variableListName) != NULL) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); } else { MmsError mmsError; @@ -523,16 +523,16 @@ mmsServer_handleDefineNamedVariableListRequest( } else { MmsNamedVariableList_destroy(namedVariableList); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); } } else - mmsServer_createServiceErrorPdu(invokeId, response, mmsError); + mmsMsg_createServiceErrorPdu(invokeId, response, mmsError); } } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_CAPABILITY_UNAVAILABLE); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_CAPABILITY_UNAVAILABLE); } else if (request->variableListName.present == ObjectName_PR_vmdspecific) { LinkedList vmdScopeNVLs = MmsDevice_getNamedVariableLists(connection->server->device); @@ -543,7 +543,7 @@ mmsServer_handleDefineNamedVariableListRequest( if (request->variableListName.choice.vmdspecific.size > 64) { //TODO send reject PDU instead? - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); goto exit_free_struct; } @@ -552,7 +552,7 @@ mmsServer_handleDefineNamedVariableListRequest( request->variableListName.choice.vmdspecific.size); if (mmsServer_getNamedVariableListWithName(MmsDevice_getNamedVariableLists(connection->server->device), variableListName) != NULL) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_OBJECT_EXISTS); } else { MmsError mmsError; @@ -569,7 +569,7 @@ mmsServer_handleDefineNamedVariableListRequest( } else { MmsNamedVariableList_destroy(namedVariableList); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); } } @@ -577,7 +577,7 @@ mmsServer_handleDefineNamedVariableListRequest( } } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_TYPE_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_TYPE_UNSUPPORTED); exit_free_struct: asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); @@ -665,7 +665,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest( (void**) &request, buffer + bufPos, maxBufPos - bufPos); if (rval.code != RC_OK) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -676,7 +676,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest( if ((request->choice.domainspecific.domainId.size > 64) || (request->choice.domainspecific.itemId.size > 64)) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); goto exit_function; } @@ -697,10 +697,10 @@ mmsServer_handleGetNamedVariableListAttributesRequest( if (variableList != NULL) createGetNamedVariableListAttributesResponse(invokeId, response, variableList); else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } #if (MMS_DYNAMIC_DATA_SETS == 1) @@ -709,7 +709,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest( char listName[65]; if (request->choice.aaspecific.size > 64) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); goto exit_function; } @@ -721,14 +721,14 @@ mmsServer_handleGetNamedVariableListAttributesRequest( if (varList != NULL) createGetNamedVariableListAttributesResponse(invokeId, response, varList); else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ else if (request->present == ObjectName_PR_vmdspecific) { char listName[65]; if (request->choice.vmdspecific.size > 64) { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OTHER); goto exit_function; } @@ -742,10 +742,10 @@ mmsServer_handleGetNamedVariableListAttributesRequest( if (varList != NULL) createGetNamedVariableListAttributesResponse(invokeId, response, varList); else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } else { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } exit_function: diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index 3ad46abb..2840ff5b 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -431,7 +431,7 @@ encodeReadResponse(MmsServerConnection connection, if (DEBUG_MMS_SERVER) printf("MMS read: message to large! send error PDU!\n"); - mmsServer_createServiceErrorPdu(invokeId, response, + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_SERVICE_OTHER); goto exit_function; @@ -565,7 +565,7 @@ handleReadListOfVariablesRequest( } else { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ varspec type not supported!\n"); - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); goto exit; } } @@ -647,7 +647,7 @@ handleReadNamedVariableListRequest( if (domain == NULL) { if (DEBUG_MMS_SERVER) printf("MMS read: domain %s not found!\n", domainIdStr); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } else { MmsNamedVariableList namedList = MmsDomain_getNamedVariableList(domain, nameIdStr); @@ -658,7 +658,7 @@ handleReadNamedVariableListRequest( } else { if (DEBUG_MMS_SERVER) printf("MMS read: named variable list %s not found!\n", nameIdStr); - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); } } } @@ -672,7 +672,7 @@ handleReadNamedVariableListRequest( MmsNamedVariableList namedList = mmsServer_getNamedVariableListWithName(connection->server->device->namedVariableLists, listName); if (namedList == NULL) - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); else { VarAccessSpec accessSpec; @@ -697,7 +697,7 @@ handleReadNamedVariableListRequest( MmsNamedVariableList namedList = MmsServerConnection_getNamedVariableList(connection, listName); if (namedList == NULL) - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); else { VarAccessSpec accessSpec; @@ -711,7 +711,7 @@ handleReadNamedVariableListRequest( } #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ else - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } #endif /* MMS_DATA_SET_SERVICE == 1 */ @@ -730,7 +730,7 @@ mmsServer_handleReadRequest( asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, CONFIG_MMS_MAXIMUM_PDU_SIZE); if (rval.code != RC_OK) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -745,7 +745,7 @@ mmsServer_handleReadRequest( } #endif else { - mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); diff --git a/src/mms/iso_mms/server/mms_server.c b/src/mms/iso_mms/server/mms_server.c index 1007e8f8..efb7dbbf 100644 --- a/src/mms/iso_mms/server/mms_server.c +++ b/src/mms/iso_mms/server/mms_server.c @@ -104,6 +104,7 @@ MmsServer_releaseTransmitBuffer(MmsServer self) #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_post(self->transmitBufferMutex); #endif + self->transmitBuffer->size = 0; } #if (MMS_OBTAIN_FILE_SERVICE == 1) @@ -168,6 +169,21 @@ MmsServer_setClientAuthenticator(MmsServer self, AcseAuthenticator authenticator IsoServer_setAuthenticator(self->isoServer, authenticator, authenticatorParameter); } +#if (MMS_OBTAIN_FILE_SERVICE == 1) +void +MmsServer_installObtainFileHandler(MmsServer self, MmsObtainFileHandler handler, void* parameter) +{ + self->obtainFileHandler = handler; + self->obtainFileHandlerParameter = parameter; +} + +void +MmsServer_installGetFileCompleteHandler(MmsServer self, MmsGetFileCompleteHandler handler, void* parameter) +{ + self->getFileCompleteHandler = handler; + self->getFileCompleteHandlerParameter = parameter; +} +#endif /* (MMS_OBTAIN_FILE_SERVICE == 1) */ static void closeConnection(void* con) diff --git a/src/mms/iso_mms/server/mms_server_common.c b/src/mms/iso_mms/server/mms_server_common.c index ba277499..bfdbedf8 100644 --- a/src/mms/iso_mms/server/mms_server_common.c +++ b/src/mms/iso_mms/server/mms_server_common.c @@ -100,11 +100,36 @@ mapErrorTypeToErrorClass(MmsError errorType, uint8_t* tag, uint8_t* value) *value = 0; break; + case MMS_ERROR_FILE_FILENAME_AMBIGUOUS: + *tag = 0x8b; /* file */ + *value = 1; + break; + + case MMS_ERROR_FILE_POSITION_INVALID: + *tag = 0x8b; /* file */ + *value = 5; + break; + + case MMS_ERROR_FILE_FILE_ACCESS_DENIED: + *tag = 0x8b; /* file */ + *value = 6; + break; + case MMS_ERROR_FILE_FILE_NON_EXISTENT: *tag = 0x8b; /* file */ *value = 7; break; + case MMS_ERROR_FILE_DUPLICATE_FILENAME: + *tag = 0x8b; /* file */ + *value = 8; + break; + + case MMS_ERROR_FILE_INSUFFICIENT_SPACE_IN_FILESTORE: + *tag = 0x8b; /* file */ + *value = 9; + break; + case MMS_ERROR_RESOURCE_OTHER: *tag = 0x83; /* resource */ *value = 0; @@ -178,7 +203,7 @@ mmsServer_createServiceErrorPduWithServiceSpecificInfo(uint32_t invokeId, ByteBu } void /* Confirmed service error (ServiceError) */ -mmsServer_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType) +mmsMsg_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType) { mmsServer_createServiceErrorPduWithServiceSpecificInfo(invokeId, response, errorType, NULL, 0); } diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 87b7f6af..87249e72 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -37,7 +37,8 @@ *********************************************************************************************/ void -mmsServer_writeMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response) { +mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response) +{ MmsPdu_t* mmsPdu = (MmsPdu_t*) GLOBAL_CALLOC(1, sizeof(MmsPdu_t)); mmsPdu->present = MmsPdu_PR_rejectPDU; @@ -104,7 +105,7 @@ handleConfirmedRequestPdu( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; } @@ -150,7 +151,7 @@ handleConfirmedRequestPdu( #endif /* MMS_FILE_SERVICE == 1 */ default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; break; } @@ -230,7 +231,7 @@ handleConfirmedRequestPdu( #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; break; } @@ -255,21 +256,27 @@ handleConfirmedErrorPdu( if (mmsMsg_parseConfirmedErrorPDU(buffer, bufPos, maxBufPos, &invokeId, &serviceError)) { - printf("MMS_SERVER: Handle confirmed error PDU: invokeID: %i\n", invokeId); + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: Handle confirmed error PDU: invokeID: %i\n", invokeId); /* check if message is related to an existing file upload task */ int i; for (i = 0; i < CONFIG_MMS_SERVER_MAX_GET_FILE_TASKS; i++) { - if (self->server->fileUploadTasks[i].lastRequestInvokeId == invokeId) { + if (self->server->fileUploadTasks[i].state != MMS_FILE_UPLOAD_STATE_NOT_USED) { + + if (self->server->fileUploadTasks[i].lastRequestInvokeId == invokeId) { + + self->server->fileUploadTasks[i].state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; + return; + } - self->server->fileUploadTasks[i].state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; - return; } } } else { - printf("MMS_SERVER: error parsing confirmed error PDU\n"); + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: error parsing confirmed error PDU\n"); } } @@ -321,7 +328,7 @@ handleConfirmedResponsePdu( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; } @@ -420,7 +427,7 @@ handleConfirmedResponsePdu( #endif /* MMS_FILE_SERVICE == 1 */ default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; break; } @@ -435,7 +442,7 @@ handleConfirmedResponsePdu( break; default: - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; break; } @@ -499,7 +506,7 @@ MmsServerConnection_parseMessage(MmsServerConnection self, ByteBuffer* message, retVal = MMS_OK; break; default: - mmsServer_writeMmsRejectPdu(NULL, MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE, response); + mmsMsg_createMmsRejectPdu(NULL, MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE, response); retVal = MMS_ERROR; break; } diff --git a/src/mms/iso_mms/server/mms_write_service.c b/src/mms/iso_mms/server/mms_write_service.c index 614aef9d..d156f973 100644 --- a/src/mms/iso_mms/server/mms_write_service.c +++ b/src/mms/iso_mms/server/mms_write_service.c @@ -103,7 +103,7 @@ mmsServer_handleWriteRequest( rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, CONFIG_MMS_MAXIMUM_PDU_SIZE); if (rval.code != RC_OK) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -112,17 +112,17 @@ mmsServer_handleWriteRequest( int numberOfWriteItems = writeRequest->variableAccessSpecification.choice.listOfVariable.list.count; if (numberOfWriteItems < 1) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } if (numberOfWriteItems > CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_OTHER, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_OTHER, response); return; } if (writeRequest->listOfData.list.count != numberOfWriteItems) { - mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); return; } diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index c8c5be1d..039b7e6b 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -555,3 +555,5 @@ EXPORTS MmsServer_installGetFileCompleteHandler MmsServer_handleBackgroundTasks FileSystem_writeFile + MmsConnection_obtainFile + IedConnection_setFile diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index f0e70d8f..b0a1025b 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -633,3 +633,5 @@ EXPORTS MmsServer_installGetFileCompleteHandler MmsServer_handleBackgroundTasks FileSystem_writeFile + MmsConnection_obtainFile + IedConnection_setFile