- implemented setFile service

- prepared for release 1.0.0
pull/6/head
Michael Zillgith 9 years ago
parent 940bcee6fc
commit 46575aeb68

@ -10,9 +10,9 @@ endif()
project(libiec61850) project(libiec61850)
ENABLE_TESTING() ENABLE_TESTING()
set(LIB_VERSION_MAJOR "0") set(LIB_VERSION_MAJOR "1")
set(LIB_VERSION_MINOR "9") set(LIB_VERSION_MINOR "0")
set(LIB_VERSION_PATCH "3") set(LIB_VERSION_PATCH "0")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/")

@ -159,7 +159,7 @@
/* overwrite default results for MMS identify service */ /* overwrite default results for MMS identify service */
//#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" //#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com"
//#define CONFIG_DEFAULT_MMS_MODEL_NAME "LIBIEC61850" //#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 */ /* MMS virtual file store base path - where MMS file services are looking for files */
#define CONFIG_VIRTUAL_FILESTORE_BASEPATH "./vmd-filestore/" #define CONFIG_VIRTUAL_FILESTORE_BASEPATH "./vmd-filestore/"

@ -15,7 +15,7 @@
#include "platform_endian.h" #include "platform_endian.h"
#define LIBIEC61850_VERSION "0.9.3" #define LIBIEC61850_VERSION "1.0.0"
#ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME #ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME
#define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com"

@ -18,7 +18,7 @@ DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "libIEC61850" 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" PROJECT_BRIEF = "Open-source IEC 61850 MMS/GOOSE/SV server and client library"

@ -84,6 +84,12 @@ iedConnection_mapMmsErrorToIedError(MmsError mmsError)
case MMS_ERROR_FILE_FILE_NON_EXISTENT: case MMS_ERROR_FILE_FILE_NON_EXISTENT:
return IED_ERROR_OBJECT_DOES_NOT_EXIST; 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: case MMS_ERROR_CONNECTION_REJECTED:
return IED_ERROR_CONNECTION_REJECTED; return IED_ERROR_CONNECTION_REJECTED;
@ -1172,6 +1178,24 @@ IedConnection_getFile(IedConnection self, IedClientError* error, const char* fil
return clientFileReadHandler.byteReceived; 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 void
IedConnection_deleteFile(IedConnection self, IedClientError* error, const char* fileName) IedConnection_deleteFile(IedConnection self, IedClientError* error, const char* fileName)
{ {

@ -156,7 +156,10 @@ typedef enum {
/** The object is invalidated (returned by server) */ /** The object is invalidated (returned by server) */
IED_ERROR_OBJECT_INVALIDATED = 33, IED_ERROR_OBJECT_INVALIDATED = 33,
/* unknown error */ /** Service not implemented */
IED_ERROR_SERVICE_NOT_IMPLEMENTED = 98,
/** unknown error */
IED_ERROR_UNKNOWN = 99 IED_ERROR_UNKNOWN = 99
} IedClientError; } IedClientError;
@ -1886,6 +1889,20 @@ uint32_t
IedConnection_getFile(IedConnection self, IedClientError* error, const char* fileName, IedClientGetFileHandler handler, IedConnection_getFile(IedConnection self, IedClientError* error, const char* fileName, IedClientGetFileHandler handler,
void* handlerParameter); 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 * \brief Implementation of the DeleteFile ACSI service
* *

@ -294,12 +294,11 @@ mmsClient_handleFileReadRequest(
ByteBuffer* response); ByteBuffer* response);
void void
mmsClient_handleFileReadRequest( mmsClient_handleFileCloseRequest(
MmsConnection connection, MmsConnection connection,
uint8_t* buffer, int bufPos, int maxBufPos, uint8_t* buffer, int bufPos, int maxBufPos,
uint32_t invokeId, uint32_t invokeId,
ByteBuffer* response); ByteBuffer* response);
#endif /* MMS_MSG_INTERNAL_H_ */ #endif /* MMS_MSG_INTERNAL_H_ */

@ -60,6 +60,10 @@ mmsMsg_createFileReadResponse(int maxPduSize, uint32_t invokeId, ByteBuffer* res
void void
mmsMsg_createFileCloseResponse(uint32_t invokeId, ByteBuffer* response); mmsMsg_createFileCloseResponse(uint32_t invokeId, ByteBuffer* response);
void
mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm);
#endif /* (MMS_FILE_SERVICE == 1) */ #endif /* (MMS_FILE_SERVICE == 1) */
typedef struct sMmsServiceError typedef struct sMmsServiceError
@ -68,6 +72,13 @@ typedef struct sMmsServiceError
int errorCode; int errorCode;
} MmsServiceError; } 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 int
mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, MmsServiceError* serviceError); mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, MmsServiceError* serviceError);

@ -184,6 +184,9 @@ struct sMmsServerConnection {
#if (MMS_OBTAIN_FILE_SERVICE == 1) #if (MMS_OBTAIN_FILE_SERVICE == 1)
MmsObtainFileTask MmsObtainFileTask
MmsServer_getObtainFileTask(MmsServer self); MmsServer_getObtainFileTask(MmsServer self);
void
mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task);
#endif #endif
ByteBuffer* ByteBuffer*
@ -222,7 +225,7 @@ MmsPdu_t*
mmsServer_createConfirmedResponse(uint32_t invokeId); mmsServer_createConfirmedResponse(uint32_t invokeId);
void void
mmsServer_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType); mmsMsg_createServiceErrorPdu(uint32_t invokeId, ByteBuffer* response, MmsError errorType);
void void
mmsServer_createServiceErrorPduWithServiceSpecificInfo(uint32_t invokeId, ByteBuffer* response, mmsServer_createServiceErrorPduWithServiceSpecificInfo(uint32_t invokeId, ByteBuffer* response,
@ -363,7 +366,7 @@ mmsServer_createMmsWriteResponse(MmsServerConnection connection,
int invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults); int invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults);
void void
mmsServer_writeMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response); mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response);
MmsError MmsError
mmsServer_callVariableListChangedHandler(bool create, MmsVariableListType listType, MmsDomain* domain, mmsServer_callVariableListChangedHandler(bool create, MmsVariableListType listType, MmsDomain* domain,

@ -450,9 +450,33 @@ convertServiceErrorToMmsError(MmsServiceError serviceError)
case 11: /* class: file */ case 11: /* class: file */
switch (serviceError.errorCode) { 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: case 7:
mmsError = MMS_ERROR_FILE_FILE_NON_EXISTENT; mmsError = MMS_ERROR_FILE_FILE_NON_EXISTENT;
break; break;
case 8:
mmsError = MMS_ERROR_FILE_DUPLICATE_FILENAME;
break;
case 9:
mmsError = MMS_ERROR_FILE_INSUFFICIENT_SPACE_IN_FILESTORE;
break;
default: default:
mmsError = MMS_ERROR_FILE_OTHER; mmsError = MMS_ERROR_FILE_OTHER;
break; break;
@ -739,7 +763,6 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload)
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: received confirmed request PDU (size=%i)\n", payload->size); 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 // TODO extract function
int bufPos = 1; int bufPos = 1;
@ -750,20 +773,19 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload)
while (bufPos < payload->size) { while (bufPos < payload->size) {
uint8_t tag = buf[bufPos++]; uint8_t nestedTag = buf[bufPos++];
bool extendedTag = false; bool extendedTag = false;
if ((tag & 0x1f) == 0x1f) { if ((nestedTag & 0x1f) == 0x1f) {
extendedTag = true; extendedTag = true;
tag = buf[bufPos++]; nestedTag = buf[bufPos++];
} }
bufPos = BerDecoder_decodeLength(buf, &length, bufPos, payload->size); bufPos = BerDecoder_decodeLength(buf, &length, bufPos, payload->size);
if (extendedTag) { if (extendedTag) {
switch(tag) { switch(nestedTag) {
#if (MMS_FILE_SERVICE == 1) #if (MMS_FILE_SERVICE == 1)
case 0x48: /* file-open-request */ case 0x48: /* file-open-request */
@ -823,7 +845,7 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload)
} }
} }
else { else {
switch(tag) { switch(nestedTag) {
case 0x02: /* invoke Id */ case 0x02: /* invoke Id */
invokeId = BerDecoder_decodeUint32(buf, length, bufPos); invokeId = BerDecoder_decodeUint32(buf, length, bufPos);
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
@ -2089,7 +2111,7 @@ MmsConnection_obtainFile(MmsConnection self, MmsError* mmsError, const char* sou
mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile); mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); sendRequestAndWaitForResponse(self, invokeId, payload);
if (self->lastResponseError != MMS_ERROR_NONE) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError; *mmsError = self->lastResponseError;

@ -107,19 +107,19 @@ parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint
int length; int length;
if (tag != 0x19) { if (tag != 0x19) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
*bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos);
if (*bufPos < 0) { if (*bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
if (length > 255) { 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; return false;
} }
@ -182,14 +182,14 @@ mmsClient_handleFileOpenRequest(
frsm->readPosition = filePosition; frsm->readPosition = filePosition;
frsm->frsmId = getNextFrsmId(connection); frsm->frsmId = getNextFrsmId(connection);
mmsServer_createFileOpenResponse(invokeId, response, filename, frsm); mmsMsg_createFileOpenResponse(invokeId, response, filename, frsm);
} }
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT);
} }
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER);
} }
else else
goto exit_invalid_parameter; goto exit_invalid_parameter;
@ -197,11 +197,11 @@ mmsClient_handleFileOpenRequest(
return; return;
exit_invalid_parameter: exit_invalid_parameter:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return; return;
exit_reject_invalid_pdu: 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) if (frsm != NULL)
mmsMsg_createFileReadResponse(connection->parameters.maxPduSize, invokeId, response, frsm); mmsMsg_createFileReadResponse(connection->parameters.maxPduSize, invokeId, response, frsm);
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER);
} }
void void

@ -46,6 +46,8 @@
#define MMS_SERVICE_DEFINE_NAMED_TYPE 0x02 #define MMS_SERVICE_DEFINE_NAMED_TYPE 0x02
#define MMS_SERVICE_GET_NAMED_TYPE_ATTRIBUTES 0x01 #define MMS_SERVICE_GET_NAMED_TYPE_ATTRIBUTES 0x01
#define MMS_SERVICE_OBTAIN_FILE 0x02
#define MMS_SERVICE_READ_JOURNAL 0x40 #define MMS_SERVICE_READ_JOURNAL 0x40
#define MMS_SERVICE_FILE_OPEN 0x80 #define MMS_SERVICE_FILE_OPEN 0x80
@ -84,7 +86,11 @@ static uint8_t servicesSupported[] =
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00
#if (MMS_OBTAIN_FILE_SERVICE == 1)
| MMS_SERVICE_OBTAIN_FILE
#endif
,
0x00, 0x00,
0x00, 0x00,
0x00 0x00

@ -23,6 +23,7 @@
#include "libiec61850_platform_includes.h" #include "libiec61850_platform_includes.h"
#include "mms_server_internal.h" #include "mms_server_internal.h"
#include "mms_client_internal.h"
#if (MMS_FILE_SERVICE == 1) #if (MMS_FILE_SERVICE == 1)
@ -179,7 +180,7 @@ deleteFile(char* fileName) {
} }
void 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; uint64_t msTime;
@ -225,19 +226,19 @@ parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint
int length; int length;
if (tag != 0x19) { if (tag != 0x19) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
*bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos);
if (*bufPos < 0) { if (*bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
if (length > 255) { 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; return false;
} }
@ -274,7 +275,7 @@ mmsServer_handleFileDeleteRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: mms_file_service.c: File (%s) not found\n", filename); 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; return;
} }
@ -282,7 +283,7 @@ mmsServer_handleFileDeleteRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: mms_file_service.c: Delete file (%s) failed\n", filename); 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; return;
} }
@ -290,7 +291,7 @@ mmsServer_handleFileDeleteRequest(
return; return;
exit_reject_invalid_pdu: exit_reject_invalid_pdu:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
} }
void void
@ -345,15 +346,15 @@ mmsServer_handleFileOpenRequest(
frsm->readPosition = filePosition; frsm->readPosition = filePosition;
frsm->frsmId = getNextFrsmId(connection); frsm->frsmId = getNextFrsmId(connection);
mmsServer_createFileOpenResponse(invokeId, response, filename, frsm); mmsMsg_createFileOpenResponse(invokeId, response, filename, frsm);
} }
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT);
} }
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_RESOURCE_OTHER);
} }
else else
goto exit_invalid_parameter; goto exit_invalid_parameter;
@ -361,15 +362,29 @@ mmsServer_handleFileOpenRequest(
return; return;
exit_invalid_parameter: exit_invalid_parameter:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return; return;
exit_reject_invalid_pdu: 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) #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 static void
createObtainFileResponse(uint32_t invokeId, ByteBuffer* response) createObtainFileResponse(uint32_t invokeId, ByteBuffer* response)
{ {
@ -379,6 +394,9 @@ createObtainFileResponse(uint32_t invokeId, ByteBuffer* response)
void void
mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
{ {
//printf("mmsServer_fileUploadTask: state: %i\n", task->state);
switch (task->state) { switch (task->state) {
case MMS_FILE_UPLOAD_STATE_NOT_USED: 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: 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; break;
case MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_DESTINATION: case MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_DESTINATION:
{
/* send ObtainFileError */
//TODO send ObtainFileError ByteBuffer* response = MmsServer_reserveTransmitBuffer(self);
printf("MMS_SERVER: ObtainFile service: failed to create local file\n");
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; break;
@ -559,7 +597,15 @@ mmsServer_handleObtainFileRequest(
if (connection->server->obtainFileHandler(connection->server->obtainFileHandlerParameter, connection, sourceFilename, destinationFilename) == false) if (connection->server->obtainFileHandler(connection->server->obtainFileHandlerParameter, connection, sourceFilename, destinationFilename) == false)
goto exit_access_denied; 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) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: Start download file %s from client to local file %s...\n", sourceFilename, destinationFilename); printf("MMS_SERVER: Start download file %s from client to local file %s...\n", sourceFilename, destinationFilename);
@ -604,19 +650,23 @@ mmsServer_handleObtainFileRequest(
return; return;
exit_invalid_parameter: exit_invalid_parameter:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return; return;
exit_access_denied: 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; return;
exit_unavailable: exit_unavailable:
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_TEMPORARILY_UNAVAILABLE); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_TEMPORARILY_UNAVAILABLE);
return; return;
exit_reject_invalid_pdu: 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) */ #endif /* (MMS_OBTAIN_FILE_SERVICE == 1) */
@ -694,7 +744,7 @@ mmsServer_handleFileReadRequest(
if (frsm != NULL) if (frsm != NULL)
mmsMsg_createFileReadResponse(connection->maxPduSize, invokeId, response, frsm); mmsMsg_createFileReadResponse(connection->maxPduSize, invokeId, response, frsm);
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER);
} }
void void
@ -846,7 +896,7 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduS
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: Error opening directory!\n"); 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; return;
} }
@ -909,7 +959,7 @@ mmsServer_handleFileRenameRequest(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -950,11 +1000,11 @@ mmsServer_handleFileRenameRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: rename file failed!\n"); printf("MMS_SERVER: rename file failed!\n");
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_OTHER);
} }
} }
else 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); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -1007,7 +1057,7 @@ mmsServer_handleFileDirectoryRequest(
default: /* unrecognized parameter */ default: /* unrecognized parameter */
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: handleFileDirectoryRequest: unrecognized parameter\n"); 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; return;
} }

@ -348,7 +348,7 @@ createNameListResponse(
} }
if (startElement == NULL) { if (startElement == NULL) {
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED);
return; return;
} }
} }
@ -455,7 +455,7 @@ mmsServer_handleGetNameListRequest(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -485,7 +485,7 @@ mmsServer_handleGetNameListRequest(
objectScope = OBJECT_SCOPE_ASSOCIATION; objectScope = OBJECT_SCOPE_ASSOCIATION;
break; break;
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response);
return; return;
} }
} }
@ -529,7 +529,7 @@ mmsServer_handleGetNameListRequest(
LinkedList nameList = getNameListDomainSpecific(connection, domainSpecificName); LinkedList nameList = getNameListDomainSpecific(connection, domainSpecificName);
if (nameList == NULL) if (nameList == NULL)
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
createNameListResponse(connection, invokeId, nameList, response, continueAfterId); createNameListResponse(connection, invokeId, nameList, response, continueAfterId);
LinkedList_destroy(nameList); LinkedList_destroy(nameList);
@ -539,7 +539,7 @@ mmsServer_handleGetNameListRequest(
LinkedList nameList = getJournalListDomainSpecific(connection, domainSpecificName); LinkedList nameList = getJournalListDomainSpecific(connection, domainSpecificName);
if (nameList == NULL) if (nameList == NULL)
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
#if (CONFIG_MMS_SORT_NAME_LIST == 1) #if (CONFIG_MMS_SORT_NAME_LIST == 1)
StringUtils_sortList(nameList); StringUtils_sortList(nameList);
@ -554,7 +554,7 @@ mmsServer_handleGetNameListRequest(
LinkedList nameList = getNamedVariableListsDomainSpecific(connection, domainSpecificName); LinkedList nameList = getNamedVariableListsDomainSpecific(connection, domainSpecificName);
if (nameList == NULL) if (nameList == NULL)
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
#if (CONFIG_MMS_SORT_NAME_LIST == 1) #if (CONFIG_MMS_SORT_NAME_LIST == 1)
@ -570,7 +570,7 @@ mmsServer_handleGetNameListRequest(
else { else {
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: getNameList domain specific objectClass %i not supported!\n", objectClass); 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 { else {
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: getNameList VMD specific objectClass %i not supported!\n", objectClass); 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); LinkedList_destroy(nameList);
} }
else 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_DYNAMIC_DATA_SETS == 1) */
#endif /* (MMS_DATA_SET_SERVICE == 1) */ #endif /* (MMS_DATA_SET_SERVICE == 1) */
else { else {
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: getNameList(%i) not supported!\n", objectScope); 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);
} }
} }

@ -221,7 +221,7 @@ createVariableAccessAttributesResponse(
if (domain == NULL) { if (domain == NULL) {
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: domain %s not known\n", domainId); 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); MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
goto exit_function; goto exit_function;
} }
@ -237,7 +237,7 @@ createVariableAccessAttributesResponse(
if (namedVariable == NULL) { if (namedVariable == NULL) {
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: named variable %s not known\n", nameId); 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); MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
goto exit_function; goto exit_function;
@ -266,7 +266,7 @@ createVariableAccessAttributesResponse(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS getVariableAccessAttributes: message to large! send error PDU!\n"); printf("MMS getVariableAccessAttributes: message to large! send error PDU!\n");
mmsServer_createServiceErrorPdu(invokeId, response, mmsMsg_createServiceErrorPdu(invokeId, response,
MMS_ERROR_SERVICE_OTHER); MMS_ERROR_SERVICE_OTHER);
goto exit_function; goto exit_function;

@ -202,19 +202,19 @@ parseStringWithMaxLength(char* filename, int maxLength, uint8_t* buffer, int* bu
int length; int length;
if (tag != 0x1a) { if (tag != 0x1a) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
*bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos);
if (*bufPos < 0) { if (*bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
if (length > maxLength) { 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; return false;
} }
@ -260,7 +260,7 @@ mmsServer_handleReadJournalRequest(
bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -287,7 +287,7 @@ mmsServer_handleReadJournalRequest(
break; break;
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response);
return; return;
} }
@ -301,7 +301,7 @@ mmsServer_handleReadJournalRequest(
bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos);
if (subTag != 0x80) { if (subTag != 0x80) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response);
return; return;
} }
@ -316,7 +316,7 @@ mmsServer_handleReadJournalRequest(
hasRangeStartSpec = true; hasRangeStartSpec = true;
} }
else { 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 return; // forward request to implementation class
} }
@ -331,7 +331,7 @@ mmsServer_handleReadJournalRequest(
bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(requestBuffer, &length, bufPos, maxBufPos);
if (subTag != 0x80) { if (subTag != 0x80) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response);
return; return;
} }
@ -344,7 +344,7 @@ mmsServer_handleReadJournalRequest(
hasRangeStopSpec = true; hasRangeStopSpec = true;
} }
else { 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 return; // forward request to implementation class
} }
@ -373,7 +373,7 @@ mmsServer_handleReadJournalRequest(
hasTimeSpec = true; hasTimeSpec = true;
} }
else { else {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return; return;
} }
@ -388,14 +388,14 @@ mmsServer_handleReadJournalRequest(
hasEntrySpec = true; hasEntrySpec = true;
} }
else { else {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return; return;
} }
break; break;
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_MODIFIER, response);
return; return;
} }
@ -406,7 +406,7 @@ mmsServer_handleReadJournalRequest(
break; break;
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
} }
@ -416,7 +416,7 @@ mmsServer_handleReadJournalRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: readJournal missing journal name\n"); 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; return;
} }
@ -431,7 +431,7 @@ mmsServer_handleReadJournalRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: readJournal domain %s not found\n", domainId); 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; return;
} }
@ -441,7 +441,7 @@ mmsServer_handleReadJournalRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: readJournal journal %s not found\n", logName); 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; return;
} }
@ -471,7 +471,7 @@ mmsServer_handleReadJournalRequest(
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: readJournal missing valid argument combination\n"); 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; return;
} }

@ -124,7 +124,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection,
asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, maxBufPos); asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, maxBufPos);
if (rval.code != RC_OK) { 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; goto exit_function;
} }
@ -230,7 +230,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection,
createServiceErrorDeleteVariableLists(invokeId, response, serviceError, numberDeleted); createServiceErrorDeleteVariableLists(invokeId, response, serviceError, numberDeleted);
} }
else { 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); 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); asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, maxBufPos);
if (rval.code != RC_OK) { 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; goto exit_function;
} }
@ -432,7 +432,7 @@ mmsServer_handleDefineNamedVariableListRequest(
char domainName[65]; char domainName[65];
if (request->variableListName.choice.domainspecific.domainId.size > 64) { 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; goto exit_free_struct;
} }
@ -443,7 +443,7 @@ mmsServer_handleDefineNamedVariableListRequest(
MmsDomain* domain = MmsDevice_getDomain(device, domainName); MmsDomain* domain = MmsDevice_getDomain(device, domainName);
if (domain == NULL) { 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; goto exit_free_struct;
} }
@ -451,7 +451,7 @@ mmsServer_handleDefineNamedVariableListRequest(
char variableListName[65]; char variableListName[65];
if (request->variableListName.choice.domainspecific.itemId.size > 64) { 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; goto exit_free_struct;
} }
@ -460,7 +460,7 @@ mmsServer_handleDefineNamedVariableListRequest(
request->variableListName.choice.domainspecific.itemId.size); request->variableListName.choice.domainspecific.itemId.size);
if (MmsDomain_getNamedVariableList(domain, variableListName) != NULL) { 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 { else {
MmsError mmsError; MmsError mmsError;
@ -478,15 +478,15 @@ mmsServer_handleDefineNamedVariableListRequest(
} }
else { else {
MmsNamedVariableList_destroy(namedVariableList); MmsNamedVariableList_destroy(namedVariableList);
mmsServer_createServiceErrorPdu(invokeId, response, mmsError); mmsMsg_createServiceErrorPdu(invokeId, response, mmsError);
} }
} }
else else
mmsServer_createServiceErrorPdu(invokeId, response, mmsError); mmsMsg_createServiceErrorPdu(invokeId, response, mmsError);
} }
} }
else 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) { if (request->variableListName.choice.aaspecific.size > 64) {
//TODO send reject PDU instead? //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; goto exit_free_struct;
} }
@ -507,7 +507,7 @@ mmsServer_handleDefineNamedVariableListRequest(
request->variableListName.choice.aaspecific.size); request->variableListName.choice.aaspecific.size);
if (MmsServerConnection_getNamedVariableList(connection, variableListName) != NULL) { 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 { else {
MmsError mmsError; MmsError mmsError;
@ -523,16 +523,16 @@ mmsServer_handleDefineNamedVariableListRequest(
} }
else { else {
MmsNamedVariableList_destroy(namedVariableList); MmsNamedVariableList_destroy(namedVariableList);
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED);
} }
} }
else else
mmsServer_createServiceErrorPdu(invokeId, response, mmsError); mmsMsg_createServiceErrorPdu(invokeId, response, mmsError);
} }
} }
else 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) { else if (request->variableListName.present == ObjectName_PR_vmdspecific) {
LinkedList vmdScopeNVLs = MmsDevice_getNamedVariableLists(connection->server->device); LinkedList vmdScopeNVLs = MmsDevice_getNamedVariableLists(connection->server->device);
@ -543,7 +543,7 @@ mmsServer_handleDefineNamedVariableListRequest(
if (request->variableListName.choice.vmdspecific.size > 64) { if (request->variableListName.choice.vmdspecific.size > 64) {
//TODO send reject PDU instead? //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; goto exit_free_struct;
} }
@ -552,7 +552,7 @@ mmsServer_handleDefineNamedVariableListRequest(
request->variableListName.choice.vmdspecific.size); request->variableListName.choice.vmdspecific.size);
if (mmsServer_getNamedVariableListWithName(MmsDevice_getNamedVariableLists(connection->server->device), variableListName) != NULL) { 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 { else {
MmsError mmsError; MmsError mmsError;
@ -569,7 +569,7 @@ mmsServer_handleDefineNamedVariableListRequest(
} }
else { else {
MmsNamedVariableList_destroy(namedVariableList); 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 else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_TYPE_UNSUPPORTED); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_DEFINITION_TYPE_UNSUPPORTED);
exit_free_struct: exit_free_struct:
asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);
@ -665,7 +665,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
(void**) &request, buffer + bufPos, maxBufPos - bufPos); (void**) &request, buffer + bufPos, maxBufPos - bufPos);
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -676,7 +676,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
if ((request->choice.domainspecific.domainId.size > 64) || if ((request->choice.domainspecific.domainId.size > 64) ||
(request->choice.domainspecific.itemId.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; goto exit_function;
} }
@ -697,10 +697,10 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
if (variableList != NULL) if (variableList != NULL)
createGetNamedVariableListAttributesResponse(invokeId, response, variableList); createGetNamedVariableListAttributesResponse(invokeId, response, variableList);
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
} }
else 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) #if (MMS_DYNAMIC_DATA_SETS == 1)
@ -709,7 +709,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
char listName[65]; char listName[65];
if (request->choice.aaspecific.size > 64) { 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; goto exit_function;
} }
@ -721,14 +721,14 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
if (varList != NULL) if (varList != NULL)
createGetNamedVariableListAttributesResponse(invokeId, response, varList); createGetNamedVariableListAttributesResponse(invokeId, response, varList);
else 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) */ #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */
else if (request->present == ObjectName_PR_vmdspecific) { else if (request->present == ObjectName_PR_vmdspecific) {
char listName[65]; char listName[65];
if (request->choice.vmdspecific.size > 64) { 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; goto exit_function;
} }
@ -742,10 +742,10 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
if (varList != NULL) if (varList != NULL)
createGetNamedVariableListAttributesResponse(invokeId, response, varList); createGetNamedVariableListAttributesResponse(invokeId, response, varList);
else else
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
} }
else { else {
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED);
} }
exit_function: exit_function:

@ -431,7 +431,7 @@ encodeReadResponse(MmsServerConnection connection,
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS read: message to large! send error PDU!\n"); printf("MMS read: message to large! send error PDU!\n");
mmsServer_createServiceErrorPdu(invokeId, response, mmsMsg_createServiceErrorPdu(invokeId, response,
MMS_ERROR_SERVICE_OTHER); MMS_ERROR_SERVICE_OTHER);
goto exit_function; goto exit_function;
@ -565,7 +565,7 @@ handleReadListOfVariablesRequest(
} }
else { else {
if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ varspec type not supported!\n"); 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; goto exit;
} }
} }
@ -647,7 +647,7 @@ handleReadNamedVariableListRequest(
if (domain == NULL) { if (domain == NULL) {
if (DEBUG_MMS_SERVER) printf("MMS read: domain %s not found!\n", domainIdStr); 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 { else {
MmsNamedVariableList namedList = MmsDomain_getNamedVariableList(domain, nameIdStr); MmsNamedVariableList namedList = MmsDomain_getNamedVariableList(domain, nameIdStr);
@ -658,7 +658,7 @@ handleReadNamedVariableListRequest(
} }
else { else {
if (DEBUG_MMS_SERVER) printf("MMS read: named variable list %s not found!\n", nameIdStr); 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); MmsNamedVariableList namedList = mmsServer_getNamedVariableListWithName(connection->server->device->namedVariableLists, listName);
if (namedList == NULL) if (namedList == NULL)
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
VarAccessSpec accessSpec; VarAccessSpec accessSpec;
@ -697,7 +697,7 @@ handleReadNamedVariableListRequest(
MmsNamedVariableList namedList = MmsServerConnection_getNamedVariableList(connection, listName); MmsNamedVariableList namedList = MmsServerConnection_getNamedVariableList(connection, listName);
if (namedList == NULL) if (namedList == NULL)
mmsServer_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
VarAccessSpec accessSpec; VarAccessSpec accessSpec;
@ -711,7 +711,7 @@ handleReadNamedVariableListRequest(
} }
#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */
else 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 */ #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); asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, CONFIG_MMS_MAXIMUM_PDU_SIZE);
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -745,7 +745,7 @@ mmsServer_handleReadRequest(
} }
#endif #endif
else { 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); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);

@ -104,6 +104,7 @@ MmsServer_releaseTransmitBuffer(MmsServer self)
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->transmitBufferMutex); Semaphore_post(self->transmitBufferMutex);
#endif #endif
self->transmitBuffer->size = 0;
} }
#if (MMS_OBTAIN_FILE_SERVICE == 1) #if (MMS_OBTAIN_FILE_SERVICE == 1)
@ -168,6 +169,21 @@ MmsServer_setClientAuthenticator(MmsServer self, AcseAuthenticator authenticator
IsoServer_setAuthenticator(self->isoServer, authenticator, authenticatorParameter); 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 static void
closeConnection(void* con) closeConnection(void* con)

@ -100,11 +100,36 @@ mapErrorTypeToErrorClass(MmsError errorType, uint8_t* tag, uint8_t* value)
*value = 0; *value = 0;
break; 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: case MMS_ERROR_FILE_FILE_NON_EXISTENT:
*tag = 0x8b; /* file */ *tag = 0x8b; /* file */
*value = 7; *value = 7;
break; 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: case MMS_ERROR_RESOURCE_OTHER:
*tag = 0x83; /* resource */ *tag = 0x83; /* resource */
*value = 0; *value = 0;
@ -178,7 +203,7 @@ mmsServer_createServiceErrorPduWithServiceSpecificInfo(uint32_t invokeId, ByteBu
} }
void /* Confirmed service error (ServiceError) */ 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); mmsServer_createServiceErrorPduWithServiceSpecificInfo(invokeId, response, errorType, NULL, 0);
} }

@ -37,7 +37,8 @@
*********************************************************************************************/ *********************************************************************************************/
void 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_t* mmsPdu = (MmsPdu_t*) GLOBAL_CALLOC(1, sizeof(MmsPdu_t));
mmsPdu->present = MmsPdu_PR_rejectPDU; mmsPdu->present = MmsPdu_PR_rejectPDU;
@ -104,7 +105,7 @@ handleConfirmedRequestPdu(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
} }
@ -150,7 +151,7 @@ handleConfirmedRequestPdu(
#endif /* MMS_FILE_SERVICE == 1 */ #endif /* MMS_FILE_SERVICE == 1 */
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
break; break;
} }
@ -230,7 +231,7 @@ handleConfirmedRequestPdu(
#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
break; break;
} }
@ -255,21 +256,27 @@ handleConfirmedErrorPdu(
if (mmsMsg_parseConfirmedErrorPDU(buffer, bufPos, maxBufPos, &invokeId, &serviceError)) { 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 */ /* check if message is related to an existing file upload task */
int i; int i;
for (i = 0; i < CONFIG_MMS_SERVER_MAX_GET_FILE_TASKS; 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 { 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); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
} }
@ -420,7 +427,7 @@ handleConfirmedResponsePdu(
#endif /* MMS_FILE_SERVICE == 1 */ #endif /* MMS_FILE_SERVICE == 1 */
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
break; break;
} }
@ -435,7 +442,7 @@ handleConfirmedResponsePdu(
break; break;
default: default:
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
break; break;
} }
@ -499,7 +506,7 @@ MmsServerConnection_parseMessage(MmsServerConnection self, ByteBuffer* message,
retVal = MMS_OK; retVal = MMS_OK;
break; break;
default: default:
mmsServer_writeMmsRejectPdu(NULL, MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE, response); mmsMsg_createMmsRejectPdu(NULL, MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE, response);
retVal = MMS_ERROR; retVal = MMS_ERROR;
break; break;
} }

@ -103,7 +103,7 @@ mmsServer_handleWriteRequest(
rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, CONFIG_MMS_MAXIMUM_PDU_SIZE); rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, CONFIG_MMS_MAXIMUM_PDU_SIZE);
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -112,17 +112,17 @@ mmsServer_handleWriteRequest(
int numberOfWriteItems = writeRequest->variableAccessSpecification.choice.listOfVariable.list.count; int numberOfWriteItems = writeRequest->variableAccessSpecification.choice.listOfVariable.list.count;
if (numberOfWriteItems < 1) { if (numberOfWriteItems < 1) {
mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return; return;
} }
if (numberOfWriteItems > CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS) { 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; return;
} }
if (writeRequest->listOfData.list.count != numberOfWriteItems) { 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; return;
} }

@ -555,3 +555,5 @@ EXPORTS
MmsServer_installGetFileCompleteHandler MmsServer_installGetFileCompleteHandler
MmsServer_handleBackgroundTasks MmsServer_handleBackgroundTasks
FileSystem_writeFile FileSystem_writeFile
MmsConnection_obtainFile
IedConnection_setFile

@ -633,3 +633,5 @@ EXPORTS
MmsServer_installGetFileCompleteHandler MmsServer_installGetFileCompleteHandler
MmsServer_handleBackgroundTasks MmsServer_handleBackgroundTasks
FileSystem_writeFile FileSystem_writeFile
MmsConnection_obtainFile
IedConnection_setFile

Loading…
Cancel
Save