diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 15b57642..b4e2246f 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1134,8 +1134,8 @@ MmsMapping_create(IedModel* model) #endif #if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) - self->gseControls = LinkedList_create(); - self->gooseInterfaceId = NULL; + self->gseControls = LinkedList_create(); + self->gooseInterfaceId = NULL; #endif #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) 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 ef8116b2..7d47609b 100644 --- a/src/mms/iso_mms/server/mms_get_namelist_service.c +++ b/src/mms/iso_mms/server/mms_get_namelist_service.c @@ -80,6 +80,23 @@ getNameListVMDSpecific(MmsServerConnection connection) } #endif /* (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) */ +static void +sortIndex(int* index, int size, MmsVariableSpecification** namedVariables) +{ + int n; + int i; + + for (n = size; n > 1; n = n - 1) { + for (i = 0; i < n - 1; i = i + 1) { + if (StringUtils_compareStrings(namedVariables[index[i]]->name, namedVariables[index[i + 1]]->name) > 0) { + int storedIndex = index[i]; + index[i] = index[i + 1]; + index[i + 1] = storedIndex; + } + } + } +} + #if (CONFIG_MMS_SUPPORT_FLATTED_NAME_SPACE == 1) static char* appendMmsSubVariable(char* name, char* child) @@ -116,14 +133,22 @@ addSubNamedVaribleNamesToList(LinkedList nameList, char* prefix, MmsVariableSpec int i; - MmsVariableSpecification** variables = variable->typeSpec.structure.elements; + int* index = GLOBAL_MALLOC(sizeof(int) * variable->typeSpec.structure.elementCount); + + for (i = 0; i < variable->typeSpec.structure.elementCount; i++) + index[i] = i; + + MmsVariableSpecification** variables = variable->typeSpec.structure.elements; + + sortIndex(index, variable->typeSpec.structure.elementCount, variables); + for (i = 0; i < variable->typeSpec.structure.elementCount; i++) { - char* variableName = appendMmsSubVariable(prefix, variables[i]->name); + char* variableName = appendMmsSubVariable(prefix, variables[index[i]]->name); listElement = LinkedList_insertAfter(listElement, variableName); - listElement = addSubNamedVaribleNamesToList(listElement, variableName, variables[i]); + listElement = addSubNamedVaribleNamesToList(listElement, variableName, variables[index[i]]); } } @@ -132,6 +157,7 @@ addSubNamedVaribleNamesToList(LinkedList nameList, char* prefix, MmsVariableSpec #endif /* (CONFIG_MMS_SUPPORT_FLATTED_NAME_SPACE == 1) */ + static LinkedList getNameListDomainSpecific(MmsServerConnection connection, char* domainName) { @@ -149,15 +175,26 @@ getNameListDomainSpecific(MmsServerConnection connection, char* domainName) LinkedList element = nameList; + int* index = GLOBAL_MALLOC(sizeof(int) * domain->namedVariablesCount); + + for (i = 0; i < domain->namedVariablesCount; i++) + index[i] = i; + + sortIndex(index, domain->namedVariablesCount, domain->namedVariables); + for (i = 0; i < domain->namedVariablesCount; i++) { - element = LinkedList_insertAfter(element, copyString(variables[i]->name)); + + + element = LinkedList_insertAfter(element, copyString(variables[index[i]]->name)); #if (CONFIG_MMS_SUPPORT_FLATTED_NAME_SPACE == 1) - char* prefix = variables[i]->name; - element = addSubNamedVaribleNamesToList(element, prefix, variables[i]); + char* prefix = variables[index[i]]->name; + element = addSubNamedVaribleNamesToList(element, prefix, variables[index[i]]); #endif } + + GLOBAL_FREEMEM(index); } return nameList; @@ -437,7 +474,7 @@ mmsServer_handleGetNameListRequest( else { #if (CONFIG_MMS_SORT_NAME_LIST == 1) - StringUtils_sortList(nameList); + // StringUtils_sortList(nameList); #endif createNameListResponse(connection, invokeId, nameList, response, continueAfterId); 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 dd4f4951..954da06a 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 @@ -251,7 +251,7 @@ createNamedVariableList(MmsDomain* domain, MmsDevice* device, int variableCount = request->listOfVariable.list.count; - if (variableCount > CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS) { + if ((variableCount == 0 ) || (variableCount > CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS)) { *mmsError = MMS_ERROR_DEFINITION_OTHER; goto exit_function; }