Compare commits

..

No commits in common. "master" and "v1.1" have entirely different histories.
master ... v1.1

91 changed files with 5999 additions and 710 deletions

View file

@ -62,7 +62,7 @@ option(DEBUG_MMS_CLIENT "Enable MMS CLIENT printf debugging" OFF)
# DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT) # DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT)
include_directories( include_directories(
${CMAKE_CURRENT_BINARY_DIR}/config ${CMAKE_CURRENT_LIST_DIR}/config
${CMAKE_CURRENT_LIST_DIR}/src/common/inc ${CMAKE_CURRENT_LIST_DIR}/src/common/inc
${CMAKE_CURRENT_LIST_DIR}/src/goose ${CMAKE_CURRENT_LIST_DIR}/src/goose
${CMAKE_CURRENT_LIST_DIR}/src/sampled_values ${CMAKE_CURRENT_LIST_DIR}/src/sampled_values

View file

@ -104,7 +104,7 @@ namespace IEC61850
/// <summary> /// <summary>
/// Control object. /// Control object.
/// </summary> /// </summary>
public class ControlObject : IDisposable public class ControlObject
{ {
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
private static extern LastApplErrorInternal ControlObjectClient_getLastApplError(IntPtr self); private static extern LastApplErrorInternal ControlObjectClient_getLastApplError(IntPtr self);
@ -183,6 +183,12 @@ namespace IEC61850
ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject); ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject);
} }
~ControlObject ()
{
if (this.controlObject != System.IntPtr.Zero)
ControlObjectClient_destroy(controlObject);
}
/// <summary> /// <summary>
/// Gets the control model. /// Gets the control model.
/// </summary> /// </summary>
@ -437,18 +443,6 @@ namespace IEC61850
this.commandTerminationHandlerParameter = parameter; this.commandTerminationHandlerParameter = parameter;
} }
protected virtual void Dispose(bool disposing) {
if (this.controlObject != System.IntPtr.Zero) {
ControlObjectClient_destroy (controlObject);
this.controlObject = System.IntPtr.Zero;
}
}
public void Dispose() {
Dispose (true);
}
} }
} }

View file

@ -86,10 +86,7 @@ namespace control
Thread.Sleep(1000); Thread.Sleep(1000);
} }
// has to be called before IedConnection dispose method! con.Abort();
control.Dispose();
con.Abort();
} }
catch (IedConnectionException e) catch (IedConnectionException e)
{ {

View file

@ -1,7 +1,8 @@
add_subdirectory(server_example_simple) add_subdirectory(server_example1)
add_subdirectory(server_example_basic_io) add_subdirectory(server_example2)
add_subdirectory(server_example_password_auth) add_subdirectory(server_example3)
add_subdirectory(server_example_write_handler) add_subdirectory(server_example4)
add_subdirectory(server_example5)
add_subdirectory(server_example_control) add_subdirectory(server_example_control)
add_subdirectory(server_example_dynamic) add_subdirectory(server_example_dynamic)
add_subdirectory(server_example_config_file) add_subdirectory(server_example_config_file)
@ -22,6 +23,10 @@ add_subdirectory(iec61850_client_example_files)
endif() endif()
add_subdirectory(iec61850_client_example_reporting) add_subdirectory(iec61850_client_example_reporting)
add_subdirectory(iec61850_client_example_log) add_subdirectory(iec61850_client_example_log)
add_subdirectory(mms_client_example1)
add_subdirectory(mms_client_example2)
add_subdirectory(mms_client_example3)
add_subdirectory(mms_client_example4)
IF(WIN32) IF(WIN32)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib") if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib")

View file

@ -1,15 +1,21 @@
EXAMPLE_DIRS = iec61850_client_example1 EXAMPLE_DIRS = mms_client_example1
EXAMPLE_DIRS += mms_client_example2
EXAMPLE_DIRS += mms_client_example3
EXAMPLE_DIRS += mms_client_example4
EXAMPLE_DIRS += mms_client_example5
EXAMPLE_DIRS += iec61850_client_example1
EXAMPLE_DIRS += iec61850_client_example2 EXAMPLE_DIRS += iec61850_client_example2
EXAMPLE_DIRS += iec61850_client_example3 EXAMPLE_DIRS += iec61850_client_example3
EXAMPLE_DIRS += iec61850_client_example4 EXAMPLE_DIRS += iec61850_client_example4
EXAMPLE_DIRS += iec61850_client_example5 EXAMPLE_DIRS += iec61850_client_example5
EXAMPLE_DIRS += iec61850_client_example_reporting EXAMPLE_DIRS += iec61850_client_example_reporting
EXAMPLE_DIRS += iec61850_client_example_log EXAMPLE_DIRS += iec61850_client_example_log
EXAMPLE_DIRS += server_example_simple EXAMPLE_DIRS += server_example1
EXAMPLE_DIRS += server_example_basic_io EXAMPLE_DIRS += server_example2
EXAMPLE_DIRS += server_example_password_auth EXAMPLE_DIRS += server_example3
EXAMPLE_DIRS += server_example_write_handler EXAMPLE_DIRS += server_example4
EXAMPLE_DIRS += server_example5
EXAMPLE_DIRS += server_example_goose EXAMPLE_DIRS += server_example_goose
EXAMPLE_DIRS += server_example_control EXAMPLE_DIRS += server_example_control
EXAMPLE_DIRS += server_example_config_file EXAMPLE_DIRS += server_example_config_file
@ -29,10 +35,11 @@ EXAMPLE_DIRS += iec61850_sv_client_example
EXAMPLE_DIRS += sv_publisher EXAMPLE_DIRS += sv_publisher
EXAMPLE_DIRS += sv_subscriber EXAMPLE_DIRS += sv_subscriber
MODEL_DIRS += server_example_simple MODEL_DIRS += server_example1
MODEL_DIRS += server_example_basic_io MODEL_DIRS += server_example2
MODEL_DIRS += server_example_password_auth MODEL_DIRS += server_example3
MODEL_DIRS += server_example_write_handler MODEL_DIRS += server_example4
MODEL_DIRS += server_example5
MODEL_DIRS += server_example_goose MODEL_DIRS += server_example_goose
MODEL_DIRS += server_example_control MODEL_DIRS += server_example_control
MODEL_DIRS += server_example_config_file MODEL_DIRS += server_example_config_file

View file

@ -0,0 +1,17 @@
set(mms_client_example1_SRCS
mms_client_example1.c
)
IF(WIN32)
set_source_files_properties(${mms_client_example1_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(mms_client_example1
${mms_client_example1_SRCS}
)
target_link_libraries(mms_client_example1
iec61850
)

View file

@ -0,0 +1,17 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example1
PROJECT_SOURCES = mms_client_example1.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -0,0 +1,51 @@
/*
* mms_client_example.c
*
* This is the most simple example. It illustrates how to create an MmsConnection
* object and connect to a MMS server.
*
* Copyright 2013 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libIEC61850 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#include <stdlib.h>
#include <stdio.h>
#include "mms_client_connection.h"
#include "hal_thread.h"
int main(int argc, char** argv) {
MmsConnection con = MmsConnection_create();
MmsError mmsError;
if (MmsConnection_connect(con, &mmsError, "localhost", 102)) {
// add application code here
Thread_sleep(1000);
printf("Send abort\n");
MmsConnection_abort(con, &mmsError);
}
else
printf("Connect to server failed!\n");
MmsConnection_destroy(con);
}

View file

@ -0,0 +1,17 @@
set(mms_client_example2_SRCS
mms_client_example2.c
)
IF(MSVC)
set_source_files_properties(${mms_client_example2_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(mms_client_example2
${mms_client_example2_SRCS}
)
target_link_libraries(mms_client_example2
iec61850
)

View file

@ -0,0 +1,17 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example2
PROJECT_SOURCES = mms_client_example2.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -0,0 +1,64 @@
#include <stdlib.h>
#include <stdio.h>
#include "mms_client_connection.h"
int main(int argc, char** argv) {
char* hostname;
int tcpPort = 102;
if (argc > 1)
hostname = argv[1];
else
hostname = "localhost";
if (argc > 2)
tcpPort = atoi(argv[2]);
MmsConnection con = MmsConnection_create();
MmsError mmsError;
/* Set maximum MMS PDU size (local detail) to 2000 byte */
MmsConnection_setLocalDetail(con, 2000);
if (!MmsConnection_connect(con, &mmsError, hostname, tcpPort)) {
printf("MMS connect failed!\n");
goto exit;
}
else
printf("MMS connected.\n\n");
printf("Domains present on server:\n--------------------------\n");
LinkedList nameList = MmsConnection_getDomainNames(con, &mmsError);
LinkedList_printStringList(nameList);
printf("\n");
LinkedList element = nameList;
while ((element = LinkedList_getNext(element)) != NULL) {
printf("\nNamed variables in domain: %s\n-------------------------------------------------\n", (char*) element->data);
LinkedList variableList = MmsConnection_getDomainVariableNames(con, &mmsError, (char*) element->data);
LinkedList_printStringList(variableList);
LinkedList_destroy(variableList);
printf("\nNamed variable lists (data sets) in domain: %s\n", (char*) element->data);
LinkedList dataSetList = MmsConnection_getDomainVariableListNames(con, &mmsError, (char*) element->data);
LinkedList_printStringList(dataSetList);
LinkedList_destroy(dataSetList);
}
LinkedList_destroy(nameList);
exit:
MmsConnection_destroy(con);
}

View file

@ -0,0 +1,17 @@
set(mms_client_example3_SRCS
mms_client_example3.c
)
IF(MSVC)
set_source_files_properties(${mms_client_example3_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(mms_client_example3
${mms_client_example3_SRCS}
)
target_link_libraries(mms_client_example3
iec61850
)

View file

@ -0,0 +1,17 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example3
PROJECT_SOURCES = mms_client_example3.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -0,0 +1,41 @@
#include <stdlib.h>
#include <stdio.h>
#include "mms_client_connection.h"
int main(int argc, char** argv) {
char* hostname;
int tcpPort = 102;
if (argc > 1)
hostname = argv[1];
else
hostname = "localhost";
if (argc > 2)
tcpPort = atoi(argv[2]);
MmsConnection con = MmsConnection_create();
MmsError error;
if (!MmsConnection_connect(con, &error, hostname, tcpPort)) {
printf("MMS connect failed!\n");
goto exit;
}
else
printf("MMS connected.\n\n");
MmsValue* value =
MmsConnection_readVariable(con, &error, "simpleIOGenericIO", "LLN0$GO");
if (value == NULL)
printf("reading value failed!\n");
else
MmsValue_delete(value);
exit:
MmsConnection_destroy(con);
}

View file

@ -0,0 +1,17 @@
set(mms_client_example4_SRCS
mms_client_example4.c
)
IF(MSVC)
set_source_files_properties(${mms_client_example4_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(MSVC)
add_executable(mms_client_example4
${mms_client_example4_SRCS}
)
target_link_libraries(mms_client_example4
iec61850
)

View file

@ -0,0 +1,17 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example4
PROJECT_SOURCES = mms_client_example4.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -0,0 +1,87 @@
/*
* mms_client_example.c
*
* Copyright 2013 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libIEC61850 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#include <stdlib.h>
#include <stdio.h>
#include "mms_client_connection.h"
int main(int argc, char** argv) {
char* hostname;
int tcpPort = 102;
if (argc > 1)
hostname = argv[1];
else
hostname = "localhost";
if (argc > 2)
tcpPort = atoi(argv[2]);
MmsConnection con = MmsConnection_create();
MmsError mmsError;
char* password = "testpw";
/* use authentication */
AcseAuthenticationParameter auth = (AcseAuthenticationParameter) calloc(1, sizeof(struct sAcseAuthenticationParameter));
auth->mechanism = ACSE_AUTH_PASSWORD;
auth->value.password.octetString= (uint8_t*) password;
auth->value.password.passwordLength = strlen(password);
IsoConnectionParameters connectionParameters =
MmsConnection_getIsoConnectionParameters(con);
IsoConnectionParameters_setAcseAuthenticationParameter(connectionParameters, auth);
if (!MmsConnection_connect(con, &mmsError, hostname, tcpPort)) {
printf("MMS connect failed!\n");
goto exit;
}
else
printf("MMS connected.\n\n");
printf("Domains present on server:\n--------------------------\n");
LinkedList nameList = MmsConnection_getDomainNames(con, &mmsError);
LinkedList_printStringList(nameList);
LinkedList_destroy(nameList);
printf("\n");
printf("Named variables for domain SampleIEDDevice1:\n--------------------------------------------\n");
nameList = MmsConnection_getDomainVariableNames(con, &mmsError, "SampleIEDDevice1");
LinkedList_printStringList(nameList);
LinkedList_destroy(nameList);
printf("\n");
printf("Data sets for domain SampleIEDDevice1:\n--------------------------------------------\n");
nameList = MmsConnection_getDomainVariableListNames(con, &mmsError, "SampleIEDDevice1");
LinkedList_printStringList(nameList);
LinkedList_destroy(nameList);
printf("\n");
exit:
MmsConnection_destroy(con);
}

View file

@ -0,0 +1,17 @@
set(mms_client_example5_SRCS
mms_client_example5.c
)
IF(WIN32)
set_source_files_properties(${mms_client_example5_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(mms_client_example5
${mms_client_example5_SRCS}
)
target_link_libraries(mms_client_example5
iec61850
)

View file

@ -0,0 +1,17 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = mms_client_example5
PROJECT_SOURCES = mms_client_example5.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -0,0 +1,50 @@
#include <stdlib.h>
#include <stdio.h>
#include "mms_client_connection.h"
int main(int argc, char** argv) {
char* hostname;
int tcpPort = 102;
if (argc > 1)
hostname = argv[1];
else
hostname = "localhost";
if (argc > 2)
tcpPort = atoi(argv[2]);
MmsConnection con = MmsConnection_create();
MmsError error;
if (!MmsConnection_connect(con, &error, hostname, tcpPort)) {
printf("MMS connect failed!\n");
goto exit;
}
else
printf("MMS connected.\n\n");
LinkedList dataSetEntries = LinkedList_create();
MmsVariableAccessSpecification* dataSetEntry =
MmsVariableAccessSpecification_create("BayControllerQ", "QA1CSWI1$ST$Pos");
LinkedList_add(dataSetEntries, (void*) dataSetEntry);
dataSetEntry =
MmsVariableAccessSpecification_create("BayControllerQ", "QA1XCBR1$ST$Pos");
LinkedList_add(dataSetEntries, (void*) dataSetEntry);
MmsConnection_defineNamedVariableList(con, &error, "BayControllerQ", "LLN0$LIBIEC61850_CLIENT", dataSetEntries);
/* delete list and all elements */
LinkedList_destroy(dataSetEntries);
exit:
MmsConnection_destroy(con);
}

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example1_SRCS
server_example1.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example1_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example1
${server_example1_SRCS}
)
target_link_libraries(server_example1
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example_simple PROJECT_BINARY_NAME = server_example1
PROJECT_SOURCES = server_example_simple.c PROJECT_SOURCES = server_example1.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = sampleModel_with_dataset.icd PROJECT_ICD_FILE = sampleModel_with_dataset.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example_simple.c * server_example1.c
* *
* Copyright 2013 Michael Zillgith * Copyright 2013 Michael Zillgith
* *
@ -27,7 +27,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "../server_example_simple/static_model.h" #include "static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;

View file

@ -3,7 +3,7 @@
* *
* automatically generated from sampleModel_with_dataset.icd * automatically generated from sampleModel_with_dataset.icd
*/ */
#include "../server_example_simple/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example2_SRCS
server_example2.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example2_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example2
${server_example2_SRCS}
)
target_link_libraries(server_example2
iec61850
)

View file

@ -0,0 +1,24 @@
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example2
PROJECT_SOURCES = server_example2.c
PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = complexModel.icd
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
model: $(PROJECT_ICD_FILE)
java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE)
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDFLAGS) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)

View file

@ -0,0 +1,347 @@
<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
<Header id="" />
<IED name="ied1">
<Services>
<DynAssociation />
<GetDirectory />
<GetDataObjectDefinition />
<GetDataSetValue />
<DataSetDirectory />
<ReadWrite />
<GetCBValues />
<ConfLNs fixPrefix="true" fixLnInst="true" />
</Services>
<AccessPoint name="accessPoint1">
<Server>
<Authentication password="true" />
<LDevice inst="Inverter">
<LN0 lnClass="LLN0" lnType="LLN02" inst="">
<DataSet name="dataset1" desc="">
<FCDA ldInst="Inverter" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Battery" lnClass="LLN0" fc="ST" doName="Mod" daName="q" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="ST" lnInst="1" doName="Mod" daName="q" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="CF" lnInst="1" doName="Mod" daName="ctlModel" />
<FCDA ldInst="Inverter" lnClass="MMXU" fc="MX" lnInst="1" doName="TotW" daName="mag" />
</DataSet>
<ReportControl name="rcb1" confRev="0" datSet="dataset1" rptID="ID" intgPd="0" bufTime="0">
<TrgOps dchg="true" qchg="true" />
<OptFields />
</ReportControl>
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD2" inst="1" prefix="" />
<LN lnClass="ZINV" lnType="ZINV3" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="MMXU" lnType="MMXU1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
<LDevice inst="Battery">
<LN0 lnClass="LLN0" lnType="LLN03" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD3" inst="1" prefix="" />
<LN lnClass="ZBAT" lnType="ZBAT1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
<LN lnClass="ZBTC" lnType="ZBTC1" inst="1" prefix="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN>
</LDevice>
<LDevice inst="Physical_Measurements">
<LN0 lnClass="LLN0" lnType="LLN01" inst="">
<DOI name="Mod">
<DAI name="ctlModel">
<Val>status-only</Val>
</DAI>
</DOI>
</LN0>
<LN lnClass="LPHD" lnType="LPHD1" inst="1" prefix="" />
</LDevice>
</Server>
</AccessPoint>
</IED>
<DataTypeTemplates>
<LNodeType id="MMXU1" lnClass="MMXU" desc="Measurement">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="TotW" type="MV_1_Vol" />
<DO name="TotVAr" type="MV_1_Vol" />
<DO name="TotVA" type="MV_1_Vol" />
<DO name="Hz" type="MV_1_Vol" />
<DO name="PhV" type="WYE_1_PhV" />
<DO name="A" type="WYE_1_PhV" />
<DO name="W" type="WYE_1_W" />
</LNodeType>
<LNodeType id="ZBTC1" lnClass="ZBTC" desc="Battery charger">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="BatChaSt" type="ENG_1_BatChaSt" />
<DO name="BatChaPwr" type="ASG_1_BatChaPwr" />
<DO name="BatChaMod" type="ENG_1_BatChaSt" />
<DO name="ChaV" type="MV_1_Vol" />
<DO name="ChaA" type="MV_1_Vol" />
</LNodeType>
<LNodeType id="ZBAT1" lnClass="ZBAT" desc="Battery">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="Vol" type="MV_1_Vol" />
<DO name="Amp" type="MV_1_Vol" />
</LNodeType>
<LNodeType id="LPHD1" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="LLN01" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LLN02" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD2" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="LLN03" lnClass="LLN0" desc="Logical node zero">
<DO name="Mod" type="INC_1_Mod" />
<DO name="Beh" type="INS_1_Beh" />
<DO name="Health" type="INS_1_Beh" />
<DO name="NamPlt" type="LPL_1_NamPlt" />
</LNodeType>
<LNodeType id="LPHD3" lnClass="LPHD" desc="Physical device information">
<DO name="PhyNam" type="DPL_1_PhyNam" />
<DO name="PhyHealth" type="INS_1_Beh" />
<DO name="Proxy" type="SPS_1_Proxy" />
</LNodeType>
<LNodeType id="ZINV3" lnClass="ZINV" desc="Inverter">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Health" type="ENS_1_Beh" />
<DO name="NamPlt" type="LPL_2_NamPlt" />
<DO name="WRtg" type="ASG_1_WRtg" />
<DO name="VarRtg" type="ASG_1_WRtg" />
<DO name="ACTyp" type="ENG_1_ACTyp" />
<DO name="OutWSet" type="ASG_1_WRtg" />
<DO name="OutVarSet" type="ASG_1_WRtg" />
</LNodeType>
<DOType id="INC_1_Mod" cdc="INC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="INS_1_Beh" cdc="INS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_1_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
<DA name="configRev" bType="VisString255" fc="DC" />
<DA name="ldNs" bType="VisString255" fc="EX" />
</DOType>
<DOType id="DPL_1_PhyNam" cdc="DPL">
<DA name="vendor" bType="VisString255" fc="DC" />
</DOType>
<DOType id="SPS_1_Proxy" cdc="SPS">
<DA name="stVal" bType="BOOLEAN" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="LPL_2_NamPlt" cdc="LPL">
<DA name="vendor" bType="VisString255" fc="DC" />
<DA name="swRev" bType="VisString255" fc="DC" />
<DA name="d" bType="VisString255" fc="DC" />
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
<DA name="ctlModel" type="CtlModels" bType="Enum" fc="CF" />
</DOType>
<DOType id="ENS_1_Beh" cdc="ENS">
<DA name="stVal" bType="INT32" fc="ST" dchg="true" />
<DA name="q" bType="Quality" fc="ST" qchg="true" />
<DA name="t" bType="Timestamp" fc="ST" />
</DOType>
<DOType id="WYE_1_W" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
</DOType>
<DOType id="CMV_1_phsA" cdc="CMV">
<DA name="cVal" type="Vector_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_BatChaPwr" cdc="ASG" />
<DOType id="ENG_1_BatChaSt" cdc="ENG" />
<DOType id="WYE_1_PhV" cdc="WYE">
<SDO name="phsA" type="CMV_1_phsA" />
<SDO name="phsB" type="CMV_1_phsA" />
<SDO name="phsC" type="CMV_1_phsA" />
<SDO name="neut" type="CMV_1_phsA" />
</DOType>
<DOType id="MV_1_Vol" cdc="MV">
<DA name="mag" type="AnalogueValue_1" bType="Struct" fc="MX" dchg="true" />
<DA name="q" bType="Quality" fc="MX" qchg="true" />
<DA name="t" bType="Timestamp" fc="MX" />
</DOType>
<DOType id="ASG_1_WRtg" cdc="ASG">
<DA name="setMag" type="AnalogueValue_1" bType="Struct" fc="SP" />
<DA name="units" type="Unit_1" bType="Struct" fc="CF" />
</DOType>
<DOType id="ENG_1_ACTyp" cdc="ENG">
<DA name="setVal" bType="INT32" fc="SP" />
</DOType>
<DAType id="AnalogueValue_1">
<BDA name="f" bType="FLOAT32" />
</DAType>
<DAType id="Vector_1">
<BDA name="mag" type="AnalogueValue_1" bType="Struct" />
</DAType>
<DAType id="Unit_1">
<BDA name="SIUnit" type="SIUnit" bType="Enum" />
</DAType>
<EnumType id="CtlModels">
<EnumVal ord="0">status-only</EnumVal>
<EnumVal ord="1">direct-with-normal-security</EnumVal>
<EnumVal ord="2">sbo-with-normal-security</EnumVal>
<EnumVal ord="3">direct-with-enhanced-security</EnumVal>
<EnumVal ord="4">sbo-with-enhanced-security</EnumVal>
</EnumType>
<EnumType id="SIUnit">
<EnumVal ord="1">
</EnumVal>
<EnumVal ord="10">rad</EnumVal>
<EnumVal ord="11">sr</EnumVal>
<EnumVal ord="2">m</EnumVal>
<EnumVal ord="21">Gy</EnumVal>
<EnumVal ord="22">q</EnumVal>
<EnumVal ord="23">ðC</EnumVal>
<EnumVal ord="24">Sv</EnumVal>
<EnumVal ord="25">F</EnumVal>
<EnumVal ord="26">C</EnumVal>
<EnumVal ord="27">S</EnumVal>
<EnumVal ord="28">H</EnumVal>
<EnumVal ord="29">V</EnumVal>
<EnumVal ord="3">kg</EnumVal>
<EnumVal ord="30">ohm</EnumVal>
<EnumVal ord="31">J</EnumVal>
<EnumVal ord="32">N</EnumVal>
<EnumVal ord="33">Hz</EnumVal>
<EnumVal ord="34">Ix</EnumVal>
<EnumVal ord="35">Lm</EnumVal>
<EnumVal ord="36">Wb</EnumVal>
<EnumVal ord="37">T</EnumVal>
<EnumVal ord="38">W</EnumVal>
<EnumVal ord="39">Pa</EnumVal>
<EnumVal ord="4">s</EnumVal>
<EnumVal ord="41">mò</EnumVal>
<EnumVal ord="42">mó</EnumVal>
<EnumVal ord="43">m/s</EnumVal>
<EnumVal ord="44">m/sò</EnumVal>
<EnumVal ord="45">mó/s</EnumVal>
<EnumVal ord="46">m/mó</EnumVal>
<EnumVal ord="47">M</EnumVal>
<EnumVal ord="48">kg/mó</EnumVal>
<EnumVal ord="49">mò/s</EnumVal>
<EnumVal ord="5">A</EnumVal>
<EnumVal ord="50">W/m K</EnumVal>
<EnumVal ord="51">J/K</EnumVal>
<EnumVal ord="52">ppm</EnumVal>
<EnumVal ord="53">1/s</EnumVal>
<EnumVal ord="54">rad/s</EnumVal>
<EnumVal ord="6">K</EnumVal>
<EnumVal ord="61">VA</EnumVal>
<EnumVal ord="62">Watts</EnumVal>
<EnumVal ord="63">VAr</EnumVal>
<EnumVal ord="64">theta</EnumVal>
<EnumVal ord="65">cos(theta)</EnumVal>
<EnumVal ord="66">Vs</EnumVal>
<EnumVal ord="67">Vò</EnumVal>
<EnumVal ord="68">As</EnumVal>
<EnumVal ord="69">Aò</EnumVal>
<EnumVal ord="7">mol</EnumVal>
<EnumVal ord="70">Aòt</EnumVal>
<EnumVal ord="71">VAh</EnumVal>
<EnumVal ord="72">Wh</EnumVal>
<EnumVal ord="73">VArh</EnumVal>
<EnumVal ord="74">V/Hz</EnumVal>
<EnumVal ord="8">cd</EnumVal>
<EnumVal ord="9">deg</EnumVal>
</EnumType>
<EnumType id="Multiplier">
<EnumVal ord="-24">Yocto</EnumVal>
<EnumVal ord="-21">Zepto</EnumVal>
<EnumVal ord="-18">Atto</EnumVal>
<EnumVal ord="-15">Femto</EnumVal>
<EnumVal ord="-12">Pico</EnumVal>
<EnumVal ord="-9">Nano</EnumVal>
<EnumVal ord="-6">Micro</EnumVal>
<EnumVal ord="-3">Milli</EnumVal>
<EnumVal ord="-2">Centi</EnumVal>
<EnumVal ord="-1">Deci</EnumVal>
<EnumVal ord="0">zeroNoValue</EnumVal>
<EnumVal ord="1">Deca</EnumVal>
<EnumVal ord="2">Hecto</EnumVal>
<EnumVal ord="3">Kilo</EnumVal>
<EnumVal ord="6">Mega</EnumVal>
<EnumVal ord="9">Giga</EnumVal>
<EnumVal ord="12">Tera</EnumVal>
<EnumVal ord="15">Petra</EnumVal>
<EnumVal ord="18">Exa</EnumVal>
<EnumVal ord="21">Zetta</EnumVal>
<EnumVal ord="24">Yotta</EnumVal>
</EnumType>
<EnumType id="Range">
<EnumVal ord="0">normal</EnumVal>
<EnumVal ord="1">high</EnumVal>
<EnumVal ord="2">low</EnumVal>
<EnumVal ord="3">high-high</EnumVal>
<EnumVal ord="4">low-low</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

View file

@ -0,0 +1,91 @@
/*
* server_example2.c
*
* Copyright 2013 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libIEC61850 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
/* Include the generated header with the model access handles */
#include "static_model.h"
/* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel;
static int running = 0;
void sigint_handler(int signalId)
{
running = 0;
}
int
main(int argc, char** argv)
{
IedServer iedServer = IedServer_create(&iedModel);
// TODO get stored values from persistent storage
// TODO set initial measurement and status values from process
/* MMS server will be instructed to start listening to client connections. */
IedServer_start(iedServer, 102);
if (!IedServer_isRunning(iedServer)) {
printf("Starting server failed! Exit.\n");
IedServer_destroy(iedServer);
exit(-1);
}
running = 1;
signal(SIGINT, sigint_handler);
float power = 500.f;
while (running) {
uint64_t timeval = Hal_getTimeInMs();
IedServer_lockDataModel(iedServer);
IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_t, timeval);
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_mag_f, power);
IedServer_unlockDataModel(iedServer);
power += 0.1f;
Thread_sleep(500);
}
/* stop MMS server - close TCP server socket and all client sockets */
IedServer_stop(iedServer);
/* Cleanup - free all resources */
IedServer_destroy(iedServer);
return 0;
} /* main() */

View file

@ -3,7 +3,7 @@
* *
* automatically generated from complexModel.icd * automatically generated from complexModel.icd
*/ */
#include "../server_example_write_handler/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example3_SRCS
server_example3.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example3_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example3
${server_example3_SRCS}
)
target_link_libraries(server_example3
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example_basic_io PROJECT_BINARY_NAME = server_example3
PROJECT_SOURCES = server_example_basic_io.c PROJECT_SOURCES = server_example3.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = simpleIO_direct_control.icd PROJECT_ICD_FILE = simpleIO_direct_control.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example_basic_io.c * server_example3.c
* *
* - How to use simple control models * - How to use simple control models
* - How to serve analog measurement data * - How to serve analog measurement data
@ -12,7 +12,7 @@
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#include "../server_example_basic_io/static_model.h" #include "static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;

View file

@ -3,7 +3,7 @@
* *
* automatically generated from simpleIO_direct_control.icd * automatically generated from simpleIO_direct_control.icd
*/ */
#include "../server_example_basic_io/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example4_SRCS
server_example4.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example4_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example4
${server_example4_SRCS}
)
target_link_libraries(server_example4
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example_password_auth PROJECT_BINARY_NAME = server_example4
PROJECT_SOURCES = server_example_password_auth.c PROJECT_SOURCES = server_example4.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = simpleIO_direct_control.icd PROJECT_ICD_FILE = simpleIO_direct_control.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example_password_auth.c * server_example4.c
* *
* Example server application with password authentication. * Example server application with password authentication.
* *
@ -15,11 +15,11 @@
*/ */
#include "iec61850_server.h" #include "iec61850_server.h"
#include "static_model.h"
#include "hal_thread.h" #include "hal_thread.h"
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "../server_example_password_auth/static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;
@ -37,32 +37,13 @@ void sigint_handler(int signalId)
static char* password1 = "user1@testpw"; static char* password1 = "user1@testpw";
static char* password2 = "user2@testpw"; static char* password2 = "user2@testpw";
static void printAppTitle(ItuObjectIdentifier* oid)
{
int i;
for (i = 0; i < oid->arcCount; i++) {
printf("%i", oid->arc[i]);
if (i != (oid->arcCount - 1))
printf(".");
}
}
/** /**
* This is the AcseAuthenticator callback function that is invoked on each client connection attempt. * This is the AcseAuthenticator callback function that is invoked on each client connection attempt.
* When returning true the server stack accepts the client. Otherwise the connection is rejected. * When returning true the server stack accepts the client. Otherwise the connection is rejected.
*
* The security token can be used to pass an application specific object to other library callbacks
*/ */
static bool static bool
clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appRef) clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken)
{ {
printf("ACSE Authenticator:\n");
printf(" client ap-title: "); printAppTitle(&(appRef->apTitle)); printf("\n");
printf(" client ae-qualifier: %i\n", appRef->aeQualifier);
if (authParameter->mechanism == ACSE_AUTH_PASSWORD) { if (authParameter->mechanism == ACSE_AUTH_PASSWORD) {
if (authParameter->value.password.passwordLength == strlen(password1)) { if (authParameter->value.password.passwordLength == strlen(password1)) {
if (memcmp(authParameter->value.password.octetString, password1, if (memcmp(authParameter->value.password.octetString, password1,

View file

@ -3,7 +3,7 @@
* *
* automatically generated from simpleIO_direct_control.icd * automatically generated from simpleIO_direct_control.icd
*/ */
#include "../server_example_password_auth/static_model.h" #include "static_model.h"
static void initializeValues(); static void initializeValues();

View file

@ -0,0 +1,21 @@
include_directories(
.
)
set(server_example5_SRCS
server_example5.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example5_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example5
${server_example5_SRCS}
)
target_link_libraries(server_example5
iec61850
)

View file

@ -1,7 +1,7 @@
LIBIEC_HOME=../.. LIBIEC_HOME=../..
PROJECT_BINARY_NAME = server_example_write_handler PROJECT_BINARY_NAME = server_example5
PROJECT_SOURCES = server_example_write_handler.c PROJECT_SOURCES = server_example5.c
PROJECT_SOURCES += static_model.c PROJECT_SOURCES += static_model.c
PROJECT_ICD_FILE = complexModel.icd PROJECT_ICD_FILE = complexModel.icd

View file

@ -1,5 +1,5 @@
/* /*
* server_example_write_handler.c * server_example5.c
*/ */
#include "iec61850_server.h" #include "iec61850_server.h"
@ -8,7 +8,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "../server_example_write_handler/static_model.h" #include "static_model.h"
/* import IEC 61850 device model created from SCL-File */ /* import IEC 61850 device model created from SCL-File */
extern IedModel iedModel; extern IedModel iedModel;

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,609 @@
/*
* static_model.h
*
* automatically generated from complexModel.icd
*/
#ifndef STATIC_MODEL_H_
#define STATIC_MODEL_H_
#include <stdlib.h>
#include "iec61850_model.h"
extern IedModel iedModel;
extern LogicalDevice iedModel_Inverter;
extern LogicalNode iedModel_Inverter_LLN0;
extern DataObject iedModel_Inverter_LLN0_Mod;
extern DataAttribute iedModel_Inverter_LLN0_Mod_q;
extern DataAttribute iedModel_Inverter_LLN0_Mod_t;
extern DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel;
extern DataObject iedModel_Inverter_LLN0_Beh;
extern DataAttribute iedModel_Inverter_LLN0_Beh_stVal;
extern DataAttribute iedModel_Inverter_LLN0_Beh_q;
extern DataAttribute iedModel_Inverter_LLN0_Beh_t;
extern DataObject iedModel_Inverter_LLN0_Health;
extern DataAttribute iedModel_Inverter_LLN0_Health_stVal;
extern DataAttribute iedModel_Inverter_LLN0_Health_q;
extern DataAttribute iedModel_Inverter_LLN0_Health_t;
extern DataObject iedModel_Inverter_LLN0_NamPlt;
extern DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor;
extern DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev;
extern DataAttribute iedModel_Inverter_LLN0_NamPlt_d;
extern DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev;
extern DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs;
extern LogicalNode iedModel_Inverter_LPHD1;
extern DataObject iedModel_Inverter_LPHD1_PhyNam;
extern DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor;
extern DataObject iedModel_Inverter_LPHD1_PhyHealth;
extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal;
extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q;
extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t;
extern DataObject iedModel_Inverter_LPHD1_Proxy;
extern DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal;
extern DataAttribute iedModel_Inverter_LPHD1_Proxy_q;
extern DataAttribute iedModel_Inverter_LPHD1_Proxy_t;
extern LogicalNode iedModel_Inverter_ZINV1;
extern DataObject iedModel_Inverter_ZINV1_Mod;
extern DataAttribute iedModel_Inverter_ZINV1_Mod_q;
extern DataAttribute iedModel_Inverter_ZINV1_Mod_t;
extern DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel;
extern DataObject iedModel_Inverter_ZINV1_Beh;
extern DataAttribute iedModel_Inverter_ZINV1_Beh_stVal;
extern DataAttribute iedModel_Inverter_ZINV1_Beh_q;
extern DataAttribute iedModel_Inverter_ZINV1_Beh_t;
extern DataObject iedModel_Inverter_ZINV1_Health;
extern DataAttribute iedModel_Inverter_ZINV1_Health_stVal;
extern DataAttribute iedModel_Inverter_ZINV1_Health_q;
extern DataAttribute iedModel_Inverter_ZINV1_Health_t;
extern DataObject iedModel_Inverter_ZINV1_NamPlt;
extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor;
extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev;
extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_d;
extern DataObject iedModel_Inverter_ZINV1_WRtg;
extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag;
extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f;
extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units;
extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit;
extern DataObject iedModel_Inverter_ZINV1_VarRtg;
extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag;
extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f;
extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units;
extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit;
extern DataObject iedModel_Inverter_ZINV1_ACTyp;
extern DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal;
extern DataObject iedModel_Inverter_ZINV1_OutWSet;
extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag;
extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f;
extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units;
extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit;
extern DataObject iedModel_Inverter_ZINV1_OutVarSet;
extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag;
extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f;
extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units;
extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit;
extern LogicalNode iedModel_Inverter_MMXU1;
extern DataObject iedModel_Inverter_MMXU1_Mod;
extern DataAttribute iedModel_Inverter_MMXU1_Mod_q;
extern DataAttribute iedModel_Inverter_MMXU1_Mod_t;
extern DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel;
extern DataObject iedModel_Inverter_MMXU1_Beh;
extern DataAttribute iedModel_Inverter_MMXU1_Beh_stVal;
extern DataAttribute iedModel_Inverter_MMXU1_Beh_q;
extern DataAttribute iedModel_Inverter_MMXU1_Beh_t;
extern DataObject iedModel_Inverter_MMXU1_Health;
extern DataAttribute iedModel_Inverter_MMXU1_Health_stVal;
extern DataAttribute iedModel_Inverter_MMXU1_Health_q;
extern DataAttribute iedModel_Inverter_MMXU1_Health_t;
extern DataObject iedModel_Inverter_MMXU1_NamPlt;
extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor;
extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev;
extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_d;
extern DataObject iedModel_Inverter_MMXU1_TotW;
extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag;
extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_TotW_q;
extern DataAttribute iedModel_Inverter_MMXU1_TotW_t;
extern DataObject iedModel_Inverter_MMXU1_TotVAr;
extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag;
extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_q;
extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_t;
extern DataObject iedModel_Inverter_MMXU1_TotVA;
extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag;
extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_TotVA_q;
extern DataAttribute iedModel_Inverter_MMXU1_TotVA_t;
extern DataObject iedModel_Inverter_MMXU1_Hz;
extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag;
extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_Hz_q;
extern DataAttribute iedModel_Inverter_MMXU1_Hz_t;
extern DataObject iedModel_Inverter_MMXU1_PhV;
extern DataObject iedModel_Inverter_MMXU1_PhV_phsA;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t;
extern DataObject iedModel_Inverter_MMXU1_PhV_phsB;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t;
extern DataObject iedModel_Inverter_MMXU1_PhV_phsC;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t;
extern DataObject iedModel_Inverter_MMXU1_PhV_neut;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q;
extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t;
extern DataObject iedModel_Inverter_MMXU1_A;
extern DataObject iedModel_Inverter_MMXU1_A_phsA;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_q;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_t;
extern DataObject iedModel_Inverter_MMXU1_A_phsB;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_q;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_t;
extern DataObject iedModel_Inverter_MMXU1_A_phsC;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_q;
extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_t;
extern DataObject iedModel_Inverter_MMXU1_A_neut;
extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_A_neut_q;
extern DataAttribute iedModel_Inverter_MMXU1_A_neut_t;
extern DataObject iedModel_Inverter_MMXU1_W;
extern DataObject iedModel_Inverter_MMXU1_W_phsA;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_q;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_t;
extern DataObject iedModel_Inverter_MMXU1_W_phsB;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_q;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_t;
extern DataObject iedModel_Inverter_MMXU1_W_phsC;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_q;
extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_t;
extern LogicalDevice iedModel_Battery;
extern LogicalNode iedModel_Battery_LLN0;
extern DataObject iedModel_Battery_LLN0_Mod;
extern DataAttribute iedModel_Battery_LLN0_Mod_q;
extern DataAttribute iedModel_Battery_LLN0_Mod_t;
extern DataAttribute iedModel_Battery_LLN0_Mod_ctlModel;
extern DataObject iedModel_Battery_LLN0_Beh;
extern DataAttribute iedModel_Battery_LLN0_Beh_stVal;
extern DataAttribute iedModel_Battery_LLN0_Beh_q;
extern DataAttribute iedModel_Battery_LLN0_Beh_t;
extern DataObject iedModel_Battery_LLN0_Health;
extern DataAttribute iedModel_Battery_LLN0_Health_stVal;
extern DataAttribute iedModel_Battery_LLN0_Health_q;
extern DataAttribute iedModel_Battery_LLN0_Health_t;
extern DataObject iedModel_Battery_LLN0_NamPlt;
extern DataAttribute iedModel_Battery_LLN0_NamPlt_vendor;
extern DataAttribute iedModel_Battery_LLN0_NamPlt_swRev;
extern DataAttribute iedModel_Battery_LLN0_NamPlt_d;
extern DataAttribute iedModel_Battery_LLN0_NamPlt_configRev;
extern DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs;
extern LogicalNode iedModel_Battery_LPHD1;
extern DataObject iedModel_Battery_LPHD1_PhyNam;
extern DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor;
extern DataObject iedModel_Battery_LPHD1_PhyHealth;
extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal;
extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_q;
extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_t;
extern DataObject iedModel_Battery_LPHD1_Proxy;
extern DataAttribute iedModel_Battery_LPHD1_Proxy_stVal;
extern DataAttribute iedModel_Battery_LPHD1_Proxy_q;
extern DataAttribute iedModel_Battery_LPHD1_Proxy_t;
extern LogicalNode iedModel_Battery_ZBAT1;
extern DataObject iedModel_Battery_ZBAT1_Mod;
extern DataAttribute iedModel_Battery_ZBAT1_Mod_q;
extern DataAttribute iedModel_Battery_ZBAT1_Mod_t;
extern DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel;
extern DataObject iedModel_Battery_ZBAT1_Beh;
extern DataAttribute iedModel_Battery_ZBAT1_Beh_stVal;
extern DataAttribute iedModel_Battery_ZBAT1_Beh_q;
extern DataAttribute iedModel_Battery_ZBAT1_Beh_t;
extern DataObject iedModel_Battery_ZBAT1_Health;
extern DataAttribute iedModel_Battery_ZBAT1_Health_stVal;
extern DataAttribute iedModel_Battery_ZBAT1_Health_q;
extern DataAttribute iedModel_Battery_ZBAT1_Health_t;
extern DataObject iedModel_Battery_ZBAT1_NamPlt;
extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor;
extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev;
extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_d;
extern DataObject iedModel_Battery_ZBAT1_Vol;
extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag;
extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f;
extern DataAttribute iedModel_Battery_ZBAT1_Vol_q;
extern DataAttribute iedModel_Battery_ZBAT1_Vol_t;
extern DataObject iedModel_Battery_ZBAT1_Amp;
extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag;
extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f;
extern DataAttribute iedModel_Battery_ZBAT1_Amp_q;
extern DataAttribute iedModel_Battery_ZBAT1_Amp_t;
extern LogicalNode iedModel_Battery_ZBTC1;
extern DataObject iedModel_Battery_ZBTC1_Mod;
extern DataAttribute iedModel_Battery_ZBTC1_Mod_q;
extern DataAttribute iedModel_Battery_ZBTC1_Mod_t;
extern DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel;
extern DataObject iedModel_Battery_ZBTC1_Beh;
extern DataAttribute iedModel_Battery_ZBTC1_Beh_stVal;
extern DataAttribute iedModel_Battery_ZBTC1_Beh_q;
extern DataAttribute iedModel_Battery_ZBTC1_Beh_t;
extern DataObject iedModel_Battery_ZBTC1_Health;
extern DataAttribute iedModel_Battery_ZBTC1_Health_stVal;
extern DataAttribute iedModel_Battery_ZBTC1_Health_q;
extern DataAttribute iedModel_Battery_ZBTC1_Health_t;
extern DataObject iedModel_Battery_ZBTC1_NamPlt;
extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor;
extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev;
extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_d;
extern DataObject iedModel_Battery_ZBTC1_BatChaSt;
extern DataObject iedModel_Battery_ZBTC1_BatChaPwr;
extern DataObject iedModel_Battery_ZBTC1_BatChaMod;
extern DataObject iedModel_Battery_ZBTC1_ChaV;
extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag;
extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f;
extern DataAttribute iedModel_Battery_ZBTC1_ChaV_q;
extern DataAttribute iedModel_Battery_ZBTC1_ChaV_t;
extern DataObject iedModel_Battery_ZBTC1_ChaA;
extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag;
extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f;
extern DataAttribute iedModel_Battery_ZBTC1_ChaA_q;
extern DataAttribute iedModel_Battery_ZBTC1_ChaA_t;
extern LogicalDevice iedModel_Physical_Measurements;
extern LogicalNode iedModel_Physical_Measurements_LLN0;
extern DataObject iedModel_Physical_Measurements_LLN0_Mod;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel;
extern DataObject iedModel_Physical_Measurements_LLN0_Beh;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t;
extern DataObject iedModel_Physical_Measurements_LLN0_Health;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_q;
extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_t;
extern DataObject iedModel_Physical_Measurements_LLN0_NamPlt;
extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor;
extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev;
extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d;
extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev;
extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs;
extern LogicalNode iedModel_Physical_Measurements_LPHD1;
extern DataObject iedModel_Physical_Measurements_LPHD1_PhyNam;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor;
extern DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t;
extern DataObject iedModel_Physical_Measurements_LPHD1_Proxy;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q;
extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t;
#define IEDMODEL_Inverter (&iedModel_Inverter)
#define IEDMODEL_Inverter_LLN0 (&iedModel_Inverter_LLN0)
#define IEDMODEL_Inverter_LLN0_Mod (&iedModel_Inverter_LLN0_Mod)
#define IEDMODEL_Inverter_LLN0_Mod_q (&iedModel_Inverter_LLN0_Mod_q)
#define IEDMODEL_Inverter_LLN0_Mod_t (&iedModel_Inverter_LLN0_Mod_t)
#define IEDMODEL_Inverter_LLN0_Mod_ctlModel (&iedModel_Inverter_LLN0_Mod_ctlModel)
#define IEDMODEL_Inverter_LLN0_Beh (&iedModel_Inverter_LLN0_Beh)
#define IEDMODEL_Inverter_LLN0_Beh_stVal (&iedModel_Inverter_LLN0_Beh_stVal)
#define IEDMODEL_Inverter_LLN0_Beh_q (&iedModel_Inverter_LLN0_Beh_q)
#define IEDMODEL_Inverter_LLN0_Beh_t (&iedModel_Inverter_LLN0_Beh_t)
#define IEDMODEL_Inverter_LLN0_Health (&iedModel_Inverter_LLN0_Health)
#define IEDMODEL_Inverter_LLN0_Health_stVal (&iedModel_Inverter_LLN0_Health_stVal)
#define IEDMODEL_Inverter_LLN0_Health_q (&iedModel_Inverter_LLN0_Health_q)
#define IEDMODEL_Inverter_LLN0_Health_t (&iedModel_Inverter_LLN0_Health_t)
#define IEDMODEL_Inverter_LLN0_NamPlt (&iedModel_Inverter_LLN0_NamPlt)
#define IEDMODEL_Inverter_LLN0_NamPlt_vendor (&iedModel_Inverter_LLN0_NamPlt_vendor)
#define IEDMODEL_Inverter_LLN0_NamPlt_swRev (&iedModel_Inverter_LLN0_NamPlt_swRev)
#define IEDMODEL_Inverter_LLN0_NamPlt_d (&iedModel_Inverter_LLN0_NamPlt_d)
#define IEDMODEL_Inverter_LLN0_NamPlt_configRev (&iedModel_Inverter_LLN0_NamPlt_configRev)
#define IEDMODEL_Inverter_LLN0_NamPlt_ldNs (&iedModel_Inverter_LLN0_NamPlt_ldNs)
#define IEDMODEL_Inverter_LPHD1 (&iedModel_Inverter_LPHD1)
#define IEDMODEL_Inverter_LPHD1_PhyNam (&iedModel_Inverter_LPHD1_PhyNam)
#define IEDMODEL_Inverter_LPHD1_PhyNam_vendor (&iedModel_Inverter_LPHD1_PhyNam_vendor)
#define IEDMODEL_Inverter_LPHD1_PhyHealth (&iedModel_Inverter_LPHD1_PhyHealth)
#define IEDMODEL_Inverter_LPHD1_PhyHealth_stVal (&iedModel_Inverter_LPHD1_PhyHealth_stVal)
#define IEDMODEL_Inverter_LPHD1_PhyHealth_q (&iedModel_Inverter_LPHD1_PhyHealth_q)
#define IEDMODEL_Inverter_LPHD1_PhyHealth_t (&iedModel_Inverter_LPHD1_PhyHealth_t)
#define IEDMODEL_Inverter_LPHD1_Proxy (&iedModel_Inverter_LPHD1_Proxy)
#define IEDMODEL_Inverter_LPHD1_Proxy_stVal (&iedModel_Inverter_LPHD1_Proxy_stVal)
#define IEDMODEL_Inverter_LPHD1_Proxy_q (&iedModel_Inverter_LPHD1_Proxy_q)
#define IEDMODEL_Inverter_LPHD1_Proxy_t (&iedModel_Inverter_LPHD1_Proxy_t)
#define IEDMODEL_Inverter_ZINV1 (&iedModel_Inverter_ZINV1)
#define IEDMODEL_Inverter_ZINV1_Mod (&iedModel_Inverter_ZINV1_Mod)
#define IEDMODEL_Inverter_ZINV1_Mod_q (&iedModel_Inverter_ZINV1_Mod_q)
#define IEDMODEL_Inverter_ZINV1_Mod_t (&iedModel_Inverter_ZINV1_Mod_t)
#define IEDMODEL_Inverter_ZINV1_Mod_ctlModel (&iedModel_Inverter_ZINV1_Mod_ctlModel)
#define IEDMODEL_Inverter_ZINV1_Beh (&iedModel_Inverter_ZINV1_Beh)
#define IEDMODEL_Inverter_ZINV1_Beh_stVal (&iedModel_Inverter_ZINV1_Beh_stVal)
#define IEDMODEL_Inverter_ZINV1_Beh_q (&iedModel_Inverter_ZINV1_Beh_q)
#define IEDMODEL_Inverter_ZINV1_Beh_t (&iedModel_Inverter_ZINV1_Beh_t)
#define IEDMODEL_Inverter_ZINV1_Health (&iedModel_Inverter_ZINV1_Health)
#define IEDMODEL_Inverter_ZINV1_Health_stVal (&iedModel_Inverter_ZINV1_Health_stVal)
#define IEDMODEL_Inverter_ZINV1_Health_q (&iedModel_Inverter_ZINV1_Health_q)
#define IEDMODEL_Inverter_ZINV1_Health_t (&iedModel_Inverter_ZINV1_Health_t)
#define IEDMODEL_Inverter_ZINV1_NamPlt (&iedModel_Inverter_ZINV1_NamPlt)
#define IEDMODEL_Inverter_ZINV1_NamPlt_vendor (&iedModel_Inverter_ZINV1_NamPlt_vendor)
#define IEDMODEL_Inverter_ZINV1_NamPlt_swRev (&iedModel_Inverter_ZINV1_NamPlt_swRev)
#define IEDMODEL_Inverter_ZINV1_NamPlt_d (&iedModel_Inverter_ZINV1_NamPlt_d)
#define IEDMODEL_Inverter_ZINV1_WRtg (&iedModel_Inverter_ZINV1_WRtg)
#define IEDMODEL_Inverter_ZINV1_WRtg_setMag (&iedModel_Inverter_ZINV1_WRtg_setMag)
#define IEDMODEL_Inverter_ZINV1_WRtg_setMag_f (&iedModel_Inverter_ZINV1_WRtg_setMag_f)
#define IEDMODEL_Inverter_ZINV1_WRtg_units (&iedModel_Inverter_ZINV1_WRtg_units)
#define IEDMODEL_Inverter_ZINV1_WRtg_units_SIUnit (&iedModel_Inverter_ZINV1_WRtg_units_SIUnit)
#define IEDMODEL_Inverter_ZINV1_VarRtg (&iedModel_Inverter_ZINV1_VarRtg)
#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag (&iedModel_Inverter_ZINV1_VarRtg_setMag)
#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag_f (&iedModel_Inverter_ZINV1_VarRtg_setMag_f)
#define IEDMODEL_Inverter_ZINV1_VarRtg_units (&iedModel_Inverter_ZINV1_VarRtg_units)
#define IEDMODEL_Inverter_ZINV1_VarRtg_units_SIUnit (&iedModel_Inverter_ZINV1_VarRtg_units_SIUnit)
#define IEDMODEL_Inverter_ZINV1_ACTyp (&iedModel_Inverter_ZINV1_ACTyp)
#define IEDMODEL_Inverter_ZINV1_ACTyp_setVal (&iedModel_Inverter_ZINV1_ACTyp_setVal)
#define IEDMODEL_Inverter_ZINV1_OutWSet (&iedModel_Inverter_ZINV1_OutWSet)
#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag (&iedModel_Inverter_ZINV1_OutWSet_setMag)
#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag_f (&iedModel_Inverter_ZINV1_OutWSet_setMag_f)
#define IEDMODEL_Inverter_ZINV1_OutWSet_units (&iedModel_Inverter_ZINV1_OutWSet_units)
#define IEDMODEL_Inverter_ZINV1_OutWSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutWSet_units_SIUnit)
#define IEDMODEL_Inverter_ZINV1_OutVarSet (&iedModel_Inverter_ZINV1_OutVarSet)
#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag (&iedModel_Inverter_ZINV1_OutVarSet_setMag)
#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f (&iedModel_Inverter_ZINV1_OutVarSet_setMag_f)
#define IEDMODEL_Inverter_ZINV1_OutVarSet_units (&iedModel_Inverter_ZINV1_OutVarSet_units)
#define IEDMODEL_Inverter_ZINV1_OutVarSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit)
#define IEDMODEL_Inverter_MMXU1 (&iedModel_Inverter_MMXU1)
#define IEDMODEL_Inverter_MMXU1_Mod (&iedModel_Inverter_MMXU1_Mod)
#define IEDMODEL_Inverter_MMXU1_Mod_q (&iedModel_Inverter_MMXU1_Mod_q)
#define IEDMODEL_Inverter_MMXU1_Mod_t (&iedModel_Inverter_MMXU1_Mod_t)
#define IEDMODEL_Inverter_MMXU1_Mod_ctlModel (&iedModel_Inverter_MMXU1_Mod_ctlModel)
#define IEDMODEL_Inverter_MMXU1_Beh (&iedModel_Inverter_MMXU1_Beh)
#define IEDMODEL_Inverter_MMXU1_Beh_stVal (&iedModel_Inverter_MMXU1_Beh_stVal)
#define IEDMODEL_Inverter_MMXU1_Beh_q (&iedModel_Inverter_MMXU1_Beh_q)
#define IEDMODEL_Inverter_MMXU1_Beh_t (&iedModel_Inverter_MMXU1_Beh_t)
#define IEDMODEL_Inverter_MMXU1_Health (&iedModel_Inverter_MMXU1_Health)
#define IEDMODEL_Inverter_MMXU1_Health_stVal (&iedModel_Inverter_MMXU1_Health_stVal)
#define IEDMODEL_Inverter_MMXU1_Health_q (&iedModel_Inverter_MMXU1_Health_q)
#define IEDMODEL_Inverter_MMXU1_Health_t (&iedModel_Inverter_MMXU1_Health_t)
#define IEDMODEL_Inverter_MMXU1_NamPlt (&iedModel_Inverter_MMXU1_NamPlt)
#define IEDMODEL_Inverter_MMXU1_NamPlt_vendor (&iedModel_Inverter_MMXU1_NamPlt_vendor)
#define IEDMODEL_Inverter_MMXU1_NamPlt_swRev (&iedModel_Inverter_MMXU1_NamPlt_swRev)
#define IEDMODEL_Inverter_MMXU1_NamPlt_d (&iedModel_Inverter_MMXU1_NamPlt_d)
#define IEDMODEL_Inverter_MMXU1_TotW (&iedModel_Inverter_MMXU1_TotW)
#define IEDMODEL_Inverter_MMXU1_TotW_mag (&iedModel_Inverter_MMXU1_TotW_mag)
#define IEDMODEL_Inverter_MMXU1_TotW_mag_f (&iedModel_Inverter_MMXU1_TotW_mag_f)
#define IEDMODEL_Inverter_MMXU1_TotW_q (&iedModel_Inverter_MMXU1_TotW_q)
#define IEDMODEL_Inverter_MMXU1_TotW_t (&iedModel_Inverter_MMXU1_TotW_t)
#define IEDMODEL_Inverter_MMXU1_TotVAr (&iedModel_Inverter_MMXU1_TotVAr)
#define IEDMODEL_Inverter_MMXU1_TotVAr_mag (&iedModel_Inverter_MMXU1_TotVAr_mag)
#define IEDMODEL_Inverter_MMXU1_TotVAr_mag_f (&iedModel_Inverter_MMXU1_TotVAr_mag_f)
#define IEDMODEL_Inverter_MMXU1_TotVAr_q (&iedModel_Inverter_MMXU1_TotVAr_q)
#define IEDMODEL_Inverter_MMXU1_TotVAr_t (&iedModel_Inverter_MMXU1_TotVAr_t)
#define IEDMODEL_Inverter_MMXU1_TotVA (&iedModel_Inverter_MMXU1_TotVA)
#define IEDMODEL_Inverter_MMXU1_TotVA_mag (&iedModel_Inverter_MMXU1_TotVA_mag)
#define IEDMODEL_Inverter_MMXU1_TotVA_mag_f (&iedModel_Inverter_MMXU1_TotVA_mag_f)
#define IEDMODEL_Inverter_MMXU1_TotVA_q (&iedModel_Inverter_MMXU1_TotVA_q)
#define IEDMODEL_Inverter_MMXU1_TotVA_t (&iedModel_Inverter_MMXU1_TotVA_t)
#define IEDMODEL_Inverter_MMXU1_Hz (&iedModel_Inverter_MMXU1_Hz)
#define IEDMODEL_Inverter_MMXU1_Hz_mag (&iedModel_Inverter_MMXU1_Hz_mag)
#define IEDMODEL_Inverter_MMXU1_Hz_mag_f (&iedModel_Inverter_MMXU1_Hz_mag_f)
#define IEDMODEL_Inverter_MMXU1_Hz_q (&iedModel_Inverter_MMXU1_Hz_q)
#define IEDMODEL_Inverter_MMXU1_Hz_t (&iedModel_Inverter_MMXU1_Hz_t)
#define IEDMODEL_Inverter_MMXU1_PhV (&iedModel_Inverter_MMXU1_PhV)
#define IEDMODEL_Inverter_MMXU1_PhV_phsA (&iedModel_Inverter_MMXU1_PhV_phsA)
#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal (&iedModel_Inverter_MMXU1_PhV_phsA_cVal)
#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_PhV_phsA_q (&iedModel_Inverter_MMXU1_PhV_phsA_q)
#define IEDMODEL_Inverter_MMXU1_PhV_phsA_t (&iedModel_Inverter_MMXU1_PhV_phsA_t)
#define IEDMODEL_Inverter_MMXU1_PhV_phsB (&iedModel_Inverter_MMXU1_PhV_phsB)
#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal (&iedModel_Inverter_MMXU1_PhV_phsB_cVal)
#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_PhV_phsB_q (&iedModel_Inverter_MMXU1_PhV_phsB_q)
#define IEDMODEL_Inverter_MMXU1_PhV_phsB_t (&iedModel_Inverter_MMXU1_PhV_phsB_t)
#define IEDMODEL_Inverter_MMXU1_PhV_phsC (&iedModel_Inverter_MMXU1_PhV_phsC)
#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal (&iedModel_Inverter_MMXU1_PhV_phsC_cVal)
#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_PhV_phsC_q (&iedModel_Inverter_MMXU1_PhV_phsC_q)
#define IEDMODEL_Inverter_MMXU1_PhV_phsC_t (&iedModel_Inverter_MMXU1_PhV_phsC_t)
#define IEDMODEL_Inverter_MMXU1_PhV_neut (&iedModel_Inverter_MMXU1_PhV_neut)
#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal (&iedModel_Inverter_MMXU1_PhV_neut_cVal)
#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_PhV_neut_q (&iedModel_Inverter_MMXU1_PhV_neut_q)
#define IEDMODEL_Inverter_MMXU1_PhV_neut_t (&iedModel_Inverter_MMXU1_PhV_neut_t)
#define IEDMODEL_Inverter_MMXU1_A (&iedModel_Inverter_MMXU1_A)
#define IEDMODEL_Inverter_MMXU1_A_phsA (&iedModel_Inverter_MMXU1_A_phsA)
#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal (&iedModel_Inverter_MMXU1_A_phsA_cVal)
#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_A_phsA_q (&iedModel_Inverter_MMXU1_A_phsA_q)
#define IEDMODEL_Inverter_MMXU1_A_phsA_t (&iedModel_Inverter_MMXU1_A_phsA_t)
#define IEDMODEL_Inverter_MMXU1_A_phsB (&iedModel_Inverter_MMXU1_A_phsB)
#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal (&iedModel_Inverter_MMXU1_A_phsB_cVal)
#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_A_phsB_q (&iedModel_Inverter_MMXU1_A_phsB_q)
#define IEDMODEL_Inverter_MMXU1_A_phsB_t (&iedModel_Inverter_MMXU1_A_phsB_t)
#define IEDMODEL_Inverter_MMXU1_A_phsC (&iedModel_Inverter_MMXU1_A_phsC)
#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal (&iedModel_Inverter_MMXU1_A_phsC_cVal)
#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_A_phsC_q (&iedModel_Inverter_MMXU1_A_phsC_q)
#define IEDMODEL_Inverter_MMXU1_A_phsC_t (&iedModel_Inverter_MMXU1_A_phsC_t)
#define IEDMODEL_Inverter_MMXU1_A_neut (&iedModel_Inverter_MMXU1_A_neut)
#define IEDMODEL_Inverter_MMXU1_A_neut_cVal (&iedModel_Inverter_MMXU1_A_neut_cVal)
#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag (&iedModel_Inverter_MMXU1_A_neut_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_A_neut_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_A_neut_q (&iedModel_Inverter_MMXU1_A_neut_q)
#define IEDMODEL_Inverter_MMXU1_A_neut_t (&iedModel_Inverter_MMXU1_A_neut_t)
#define IEDMODEL_Inverter_MMXU1_W (&iedModel_Inverter_MMXU1_W)
#define IEDMODEL_Inverter_MMXU1_W_phsA (&iedModel_Inverter_MMXU1_W_phsA)
#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal (&iedModel_Inverter_MMXU1_W_phsA_cVal)
#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_W_phsA_q (&iedModel_Inverter_MMXU1_W_phsA_q)
#define IEDMODEL_Inverter_MMXU1_W_phsA_t (&iedModel_Inverter_MMXU1_W_phsA_t)
#define IEDMODEL_Inverter_MMXU1_W_phsB (&iedModel_Inverter_MMXU1_W_phsB)
#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal (&iedModel_Inverter_MMXU1_W_phsB_cVal)
#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_W_phsB_q (&iedModel_Inverter_MMXU1_W_phsB_q)
#define IEDMODEL_Inverter_MMXU1_W_phsB_t (&iedModel_Inverter_MMXU1_W_phsB_t)
#define IEDMODEL_Inverter_MMXU1_W_phsC (&iedModel_Inverter_MMXU1_W_phsC)
#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal (&iedModel_Inverter_MMXU1_W_phsC_cVal)
#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag)
#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f)
#define IEDMODEL_Inverter_MMXU1_W_phsC_q (&iedModel_Inverter_MMXU1_W_phsC_q)
#define IEDMODEL_Inverter_MMXU1_W_phsC_t (&iedModel_Inverter_MMXU1_W_phsC_t)
#define IEDMODEL_Battery (&iedModel_Battery)
#define IEDMODEL_Battery_LLN0 (&iedModel_Battery_LLN0)
#define IEDMODEL_Battery_LLN0_Mod (&iedModel_Battery_LLN0_Mod)
#define IEDMODEL_Battery_LLN0_Mod_q (&iedModel_Battery_LLN0_Mod_q)
#define IEDMODEL_Battery_LLN0_Mod_t (&iedModel_Battery_LLN0_Mod_t)
#define IEDMODEL_Battery_LLN0_Mod_ctlModel (&iedModel_Battery_LLN0_Mod_ctlModel)
#define IEDMODEL_Battery_LLN0_Beh (&iedModel_Battery_LLN0_Beh)
#define IEDMODEL_Battery_LLN0_Beh_stVal (&iedModel_Battery_LLN0_Beh_stVal)
#define IEDMODEL_Battery_LLN0_Beh_q (&iedModel_Battery_LLN0_Beh_q)
#define IEDMODEL_Battery_LLN0_Beh_t (&iedModel_Battery_LLN0_Beh_t)
#define IEDMODEL_Battery_LLN0_Health (&iedModel_Battery_LLN0_Health)
#define IEDMODEL_Battery_LLN0_Health_stVal (&iedModel_Battery_LLN0_Health_stVal)
#define IEDMODEL_Battery_LLN0_Health_q (&iedModel_Battery_LLN0_Health_q)
#define IEDMODEL_Battery_LLN0_Health_t (&iedModel_Battery_LLN0_Health_t)
#define IEDMODEL_Battery_LLN0_NamPlt (&iedModel_Battery_LLN0_NamPlt)
#define IEDMODEL_Battery_LLN0_NamPlt_vendor (&iedModel_Battery_LLN0_NamPlt_vendor)
#define IEDMODEL_Battery_LLN0_NamPlt_swRev (&iedModel_Battery_LLN0_NamPlt_swRev)
#define IEDMODEL_Battery_LLN0_NamPlt_d (&iedModel_Battery_LLN0_NamPlt_d)
#define IEDMODEL_Battery_LLN0_NamPlt_configRev (&iedModel_Battery_LLN0_NamPlt_configRev)
#define IEDMODEL_Battery_LLN0_NamPlt_ldNs (&iedModel_Battery_LLN0_NamPlt_ldNs)
#define IEDMODEL_Battery_LPHD1 (&iedModel_Battery_LPHD1)
#define IEDMODEL_Battery_LPHD1_PhyNam (&iedModel_Battery_LPHD1_PhyNam)
#define IEDMODEL_Battery_LPHD1_PhyNam_vendor (&iedModel_Battery_LPHD1_PhyNam_vendor)
#define IEDMODEL_Battery_LPHD1_PhyHealth (&iedModel_Battery_LPHD1_PhyHealth)
#define IEDMODEL_Battery_LPHD1_PhyHealth_stVal (&iedModel_Battery_LPHD1_PhyHealth_stVal)
#define IEDMODEL_Battery_LPHD1_PhyHealth_q (&iedModel_Battery_LPHD1_PhyHealth_q)
#define IEDMODEL_Battery_LPHD1_PhyHealth_t (&iedModel_Battery_LPHD1_PhyHealth_t)
#define IEDMODEL_Battery_LPHD1_Proxy (&iedModel_Battery_LPHD1_Proxy)
#define IEDMODEL_Battery_LPHD1_Proxy_stVal (&iedModel_Battery_LPHD1_Proxy_stVal)
#define IEDMODEL_Battery_LPHD1_Proxy_q (&iedModel_Battery_LPHD1_Proxy_q)
#define IEDMODEL_Battery_LPHD1_Proxy_t (&iedModel_Battery_LPHD1_Proxy_t)
#define IEDMODEL_Battery_ZBAT1 (&iedModel_Battery_ZBAT1)
#define IEDMODEL_Battery_ZBAT1_Mod (&iedModel_Battery_ZBAT1_Mod)
#define IEDMODEL_Battery_ZBAT1_Mod_q (&iedModel_Battery_ZBAT1_Mod_q)
#define IEDMODEL_Battery_ZBAT1_Mod_t (&iedModel_Battery_ZBAT1_Mod_t)
#define IEDMODEL_Battery_ZBAT1_Mod_ctlModel (&iedModel_Battery_ZBAT1_Mod_ctlModel)
#define IEDMODEL_Battery_ZBAT1_Beh (&iedModel_Battery_ZBAT1_Beh)
#define IEDMODEL_Battery_ZBAT1_Beh_stVal (&iedModel_Battery_ZBAT1_Beh_stVal)
#define IEDMODEL_Battery_ZBAT1_Beh_q (&iedModel_Battery_ZBAT1_Beh_q)
#define IEDMODEL_Battery_ZBAT1_Beh_t (&iedModel_Battery_ZBAT1_Beh_t)
#define IEDMODEL_Battery_ZBAT1_Health (&iedModel_Battery_ZBAT1_Health)
#define IEDMODEL_Battery_ZBAT1_Health_stVal (&iedModel_Battery_ZBAT1_Health_stVal)
#define IEDMODEL_Battery_ZBAT1_Health_q (&iedModel_Battery_ZBAT1_Health_q)
#define IEDMODEL_Battery_ZBAT1_Health_t (&iedModel_Battery_ZBAT1_Health_t)
#define IEDMODEL_Battery_ZBAT1_NamPlt (&iedModel_Battery_ZBAT1_NamPlt)
#define IEDMODEL_Battery_ZBAT1_NamPlt_vendor (&iedModel_Battery_ZBAT1_NamPlt_vendor)
#define IEDMODEL_Battery_ZBAT1_NamPlt_swRev (&iedModel_Battery_ZBAT1_NamPlt_swRev)
#define IEDMODEL_Battery_ZBAT1_NamPlt_d (&iedModel_Battery_ZBAT1_NamPlt_d)
#define IEDMODEL_Battery_ZBAT1_Vol (&iedModel_Battery_ZBAT1_Vol)
#define IEDMODEL_Battery_ZBAT1_Vol_mag (&iedModel_Battery_ZBAT1_Vol_mag)
#define IEDMODEL_Battery_ZBAT1_Vol_mag_f (&iedModel_Battery_ZBAT1_Vol_mag_f)
#define IEDMODEL_Battery_ZBAT1_Vol_q (&iedModel_Battery_ZBAT1_Vol_q)
#define IEDMODEL_Battery_ZBAT1_Vol_t (&iedModel_Battery_ZBAT1_Vol_t)
#define IEDMODEL_Battery_ZBAT1_Amp (&iedModel_Battery_ZBAT1_Amp)
#define IEDMODEL_Battery_ZBAT1_Amp_mag (&iedModel_Battery_ZBAT1_Amp_mag)
#define IEDMODEL_Battery_ZBAT1_Amp_mag_f (&iedModel_Battery_ZBAT1_Amp_mag_f)
#define IEDMODEL_Battery_ZBAT1_Amp_q (&iedModel_Battery_ZBAT1_Amp_q)
#define IEDMODEL_Battery_ZBAT1_Amp_t (&iedModel_Battery_ZBAT1_Amp_t)
#define IEDMODEL_Battery_ZBTC1 (&iedModel_Battery_ZBTC1)
#define IEDMODEL_Battery_ZBTC1_Mod (&iedModel_Battery_ZBTC1_Mod)
#define IEDMODEL_Battery_ZBTC1_Mod_q (&iedModel_Battery_ZBTC1_Mod_q)
#define IEDMODEL_Battery_ZBTC1_Mod_t (&iedModel_Battery_ZBTC1_Mod_t)
#define IEDMODEL_Battery_ZBTC1_Mod_ctlModel (&iedModel_Battery_ZBTC1_Mod_ctlModel)
#define IEDMODEL_Battery_ZBTC1_Beh (&iedModel_Battery_ZBTC1_Beh)
#define IEDMODEL_Battery_ZBTC1_Beh_stVal (&iedModel_Battery_ZBTC1_Beh_stVal)
#define IEDMODEL_Battery_ZBTC1_Beh_q (&iedModel_Battery_ZBTC1_Beh_q)
#define IEDMODEL_Battery_ZBTC1_Beh_t (&iedModel_Battery_ZBTC1_Beh_t)
#define IEDMODEL_Battery_ZBTC1_Health (&iedModel_Battery_ZBTC1_Health)
#define IEDMODEL_Battery_ZBTC1_Health_stVal (&iedModel_Battery_ZBTC1_Health_stVal)
#define IEDMODEL_Battery_ZBTC1_Health_q (&iedModel_Battery_ZBTC1_Health_q)
#define IEDMODEL_Battery_ZBTC1_Health_t (&iedModel_Battery_ZBTC1_Health_t)
#define IEDMODEL_Battery_ZBTC1_NamPlt (&iedModel_Battery_ZBTC1_NamPlt)
#define IEDMODEL_Battery_ZBTC1_NamPlt_vendor (&iedModel_Battery_ZBTC1_NamPlt_vendor)
#define IEDMODEL_Battery_ZBTC1_NamPlt_swRev (&iedModel_Battery_ZBTC1_NamPlt_swRev)
#define IEDMODEL_Battery_ZBTC1_NamPlt_d (&iedModel_Battery_ZBTC1_NamPlt_d)
#define IEDMODEL_Battery_ZBTC1_BatChaSt (&iedModel_Battery_ZBTC1_BatChaSt)
#define IEDMODEL_Battery_ZBTC1_BatChaPwr (&iedModel_Battery_ZBTC1_BatChaPwr)
#define IEDMODEL_Battery_ZBTC1_BatChaMod (&iedModel_Battery_ZBTC1_BatChaMod)
#define IEDMODEL_Battery_ZBTC1_ChaV (&iedModel_Battery_ZBTC1_ChaV)
#define IEDMODEL_Battery_ZBTC1_ChaV_mag (&iedModel_Battery_ZBTC1_ChaV_mag)
#define IEDMODEL_Battery_ZBTC1_ChaV_mag_f (&iedModel_Battery_ZBTC1_ChaV_mag_f)
#define IEDMODEL_Battery_ZBTC1_ChaV_q (&iedModel_Battery_ZBTC1_ChaV_q)
#define IEDMODEL_Battery_ZBTC1_ChaV_t (&iedModel_Battery_ZBTC1_ChaV_t)
#define IEDMODEL_Battery_ZBTC1_ChaA (&iedModel_Battery_ZBTC1_ChaA)
#define IEDMODEL_Battery_ZBTC1_ChaA_mag (&iedModel_Battery_ZBTC1_ChaA_mag)
#define IEDMODEL_Battery_ZBTC1_ChaA_mag_f (&iedModel_Battery_ZBTC1_ChaA_mag_f)
#define IEDMODEL_Battery_ZBTC1_ChaA_q (&iedModel_Battery_ZBTC1_ChaA_q)
#define IEDMODEL_Battery_ZBTC1_ChaA_t (&iedModel_Battery_ZBTC1_ChaA_t)
#define IEDMODEL_Physical_Measurements (&iedModel_Physical_Measurements)
#define IEDMODEL_Physical_Measurements_LLN0 (&iedModel_Physical_Measurements_LLN0)
#define IEDMODEL_Physical_Measurements_LLN0_Mod (&iedModel_Physical_Measurements_LLN0_Mod)
#define IEDMODEL_Physical_Measurements_LLN0_Mod_q (&iedModel_Physical_Measurements_LLN0_Mod_q)
#define IEDMODEL_Physical_Measurements_LLN0_Mod_t (&iedModel_Physical_Measurements_LLN0_Mod_t)
#define IEDMODEL_Physical_Measurements_LLN0_Mod_ctlModel (&iedModel_Physical_Measurements_LLN0_Mod_ctlModel)
#define IEDMODEL_Physical_Measurements_LLN0_Beh (&iedModel_Physical_Measurements_LLN0_Beh)
#define IEDMODEL_Physical_Measurements_LLN0_Beh_stVal (&iedModel_Physical_Measurements_LLN0_Beh_stVal)
#define IEDMODEL_Physical_Measurements_LLN0_Beh_q (&iedModel_Physical_Measurements_LLN0_Beh_q)
#define IEDMODEL_Physical_Measurements_LLN0_Beh_t (&iedModel_Physical_Measurements_LLN0_Beh_t)
#define IEDMODEL_Physical_Measurements_LLN0_Health (&iedModel_Physical_Measurements_LLN0_Health)
#define IEDMODEL_Physical_Measurements_LLN0_Health_stVal (&iedModel_Physical_Measurements_LLN0_Health_stVal)
#define IEDMODEL_Physical_Measurements_LLN0_Health_q (&iedModel_Physical_Measurements_LLN0_Health_q)
#define IEDMODEL_Physical_Measurements_LLN0_Health_t (&iedModel_Physical_Measurements_LLN0_Health_t)
#define IEDMODEL_Physical_Measurements_LLN0_NamPlt (&iedModel_Physical_Measurements_LLN0_NamPlt)
#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_vendor (&iedModel_Physical_Measurements_LLN0_NamPlt_vendor)
#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_swRev (&iedModel_Physical_Measurements_LLN0_NamPlt_swRev)
#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_d (&iedModel_Physical_Measurements_LLN0_NamPlt_d)
#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_configRev (&iedModel_Physical_Measurements_LLN0_NamPlt_configRev)
#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_ldNs (&iedModel_Physical_Measurements_LLN0_NamPlt_ldNs)
#define IEDMODEL_Physical_Measurements_LPHD1 (&iedModel_Physical_Measurements_LPHD1)
#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam (&iedModel_Physical_Measurements_LPHD1_PhyNam)
#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam_vendor (&iedModel_Physical_Measurements_LPHD1_PhyNam_vendor)
#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth (&iedModel_Physical_Measurements_LPHD1_PhyHealth)
#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_stVal (&iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal)
#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_q (&iedModel_Physical_Measurements_LPHD1_PhyHealth_q)
#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_t (&iedModel_Physical_Measurements_LPHD1_PhyHealth_t)
#define IEDMODEL_Physical_Measurements_LPHD1_Proxy (&iedModel_Physical_Measurements_LPHD1_Proxy)
#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_stVal (&iedModel_Physical_Measurements_LPHD1_Proxy_stVal)
#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_q (&iedModel_Physical_Measurements_LPHD1_Proxy_q)
#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_t (&iedModel_Physical_Measurements_LPHD1_Proxy_t)
#endif /* STATIC_MODEL_H_ */

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example_SRCS
server_example_basic_io.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_basic_io
${server_example_SRCS}
)
target_link_libraries(server_example_basic_io
iec61850
)

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example_SRCS
server_example_password_auth.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_password_auth
${server_example_SRCS}
)
target_link_libraries(server_example_password_auth
iec61850
)

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example_SRCS
server_example_simple.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_simple
${server_example_SRCS}
)
target_link_libraries(server_example_simple
iec61850
)

View file

@ -1,21 +0,0 @@
include_directories(
.
)
set(server_example_SRCS
server_example_write_handler.c
static_model.c
)
IF(WIN32)
set_source_files_properties(${server_example_SRCS}
PROPERTIES LANGUAGE CXX)
ENDIF(WIN32)
add_executable(server_example_write_handler
${server_example_SRCS}
)
target_link_libraries(server_example_write_handler
iec61850
)

View file

@ -560,21 +560,6 @@ IedServer_updateFloatAttributeValue(IedServer self, DataAttribute* dataAttribute
void void
IedServer_updateInt32AttributeValue(IedServer self, DataAttribute* dataAttribute, int32_t value); IedServer_updateInt32AttributeValue(IedServer self, DataAttribute* dataAttribute, int32_t value);
/**
* \brief Update the value of an IEC 61850 Dbpos (double point/position) data attribute.
*
* Update the value of a integer data attribute without handling with MmsValue instances.
*
* This function will also check if a trigger condition is satisfied in the case when a report or GOOSE
* control block is enabled.
*
* \param self the instance of IedServer to operate on.
* \param dataAttribute the data attribute handle
* \param value the new Dbpos value of the data attribute.
*/
void
IedServer_udpateDbposValue(IedServer self, DataAttribute* dataAttribute, Dbpos value);
/** /**
* \brief Update the value of an IEC 61850 integer64 data attribute (like BCR actVal) * \brief Update the value of an IEC 61850 integer64 data attribute (like BCR actVal)
* *
@ -835,8 +820,7 @@ typedef enum {
CONTROL_HARDWARE_FAULT = 1, /** check failed due to hardware fault */ CONTROL_HARDWARE_FAULT = 1, /** check failed due to hardware fault */
CONTROL_TEMPORARILY_UNAVAILABLE = 2, /** control is already selected or operated */ CONTROL_TEMPORARILY_UNAVAILABLE = 2, /** control is already selected or operated */
CONTROL_OBJECT_ACCESS_DENIED = 3, /** check failed due to access control reason - access denied for this client or state */ CONTROL_OBJECT_ACCESS_DENIED = 3, /** check failed due to access control reason - access denied for this client or state */
CONTROL_OBJECT_UNDEFINED = 4, /** object not visible in this security context ??? */ CONTROL_OBJECT_UNDEFINED = 4 /** object not visible in this security context ??? */
CONTROL_VALUE_INVALID = 11 /** ctlVal out of range */
} CheckHandlerResult; } CheckHandlerResult;
/** /**

View file

@ -985,27 +985,6 @@ IedServer_updateInt32AttributeValue(IedServer self, DataAttribute* dataAttribute
} }
} }
void
IedServer_udpateDbposValue(IedServer self, DataAttribute* dataAttribute, Dbpos value)
{
Dbpos currentValue = Dbpos_fromMmsValue(dataAttribute->mmsValue);
if (currentValue == value) {
checkForUpdateTrigger(self, dataAttribute);
}
else {
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->dataModelLock);
#endif
Dbpos_toMmsValue(dataAttribute->mmsValue, value);
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_post(self->dataModelLock);
#endif
checkForChangedTriggers(self, dataAttribute);
}
}
void void
IedServer_updateInt64AttributeValue(IedServer self, DataAttribute* dataAttribute, int64_t value) IedServer_updateInt64AttributeValue(IedServer self, DataAttribute* dataAttribute, int64_t value)
{ {

View file

@ -1211,6 +1211,27 @@ checkValidityOfOriginParameter(MmsValue* origin)
return true; return true;
} }
static MmsDataAccessError
getDataAccessErrorFromCheckHandlerResult(CheckHandlerResult checkResult)
{
MmsDataAccessError indication;
if (checkResult == CONTROL_HARDWARE_FAULT)
indication = DATA_ACCESS_ERROR_HARDWARE_FAULT;
else
if (checkResult == CONTROL_TEMPORARILY_UNAVAILABLE)
indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE;
else
if (checkResult == CONTROL_OBJECT_UNDEFINED)
indication = DATA_ACCESS_ERROR_OBJECT_UNDEFINED;
else if (checkResult == CONTROL_OBJECT_ACCESS_DENIED)
indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED;
else
indication = DATA_ACCESS_ERROR_SUCCESS;
return indication;
}
MmsDataAccessError MmsDataAccessError
Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* variableIdOrig, Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* variableIdOrig,
MmsValue* value, MmsServerConnection connection) MmsValue* value, MmsServerConnection connection)
@ -1357,7 +1378,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari
printf("SBOw: selected successful\n"); printf("SBOw: selected successful\n");
} }
else { else {
indication = (MmsDataAccessError) checkResult; indication = getDataAccessErrorFromCheckHandlerResult(checkResult);
ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0, ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0,
ADD_CAUSE_SELECT_FAILED, ctlNum, origin, true); ADD_CAUSE_SELECT_FAILED, ctlNum, origin, true);
@ -1502,7 +1523,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari
} }
else { else {
indication = (MmsDataAccessError) checkResult; indication = getDataAccessErrorFromCheckHandlerResult(checkResult);
abortControlOperation(controlObject); abortControlOperation(controlObject);
} }

View file

@ -882,7 +882,7 @@ Logging_processIntegrityLogs(MmsMapping* self, uint64_t currentTimeInMs)
if (currentTimeInMs >= logControl->nextIntegrityScan) { if (currentTimeInMs >= logControl->nextIntegrityScan) {
if (DEBUG_IED_SERVER) //if (DEBUG_IED_SERVER)
printf("IED_SERVER: INTEGRITY SCAN for log %s\n", logControl->name); printf("IED_SERVER: INTEGRITY SCAN for log %s\n", logControl->name);
LogControl_logAllDatasetEntries(logControl, self->mmsDevice->deviceName); LogControl_logAllDatasetEntries(logControl, self->mmsDevice->deviceName);

View file

@ -56,12 +56,6 @@ BerDecoder_decodeLength(uint8_t* buffer, int* length, int bufPos, int maxBufPos)
*length = len1; *length = len1;
} }
if (*length < 0)
return -1;
if (bufPos + (*length) > maxBufPos)
return -1;
return bufPos; return bufPos;
} }
@ -89,6 +83,39 @@ BerDecoder_decodeUint32(uint8_t* buffer, int intLen, int bufPos)
return value; return value;
} }
#if 0
int32_t
BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos)
{
int32_t value = 0;
bool isNegative = ((buffer[bufPos] & 0x80) == 0x80);
int i = 0;
if (isNegative) {
for (i = 0; i < 4; i++) {
value <<= 8;
if (i < (4 - intlen))
value += 0xff;
else
value += buffer[bufPos + i - (4 - intlen)];
}
}
else {
for (i = 0; i < intlen; i++) {
value <<= 8;
value += buffer[bufPos + i];
}
}
return value;
}
#endif
#if 1
int32_t int32_t
BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos) BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos)
{ {
@ -109,6 +136,7 @@ BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos)
return value; return value;
} }
#endif
float float
BerDecoder_decodeFloat(uint8_t* buffer, int bufPos) BerDecoder_decodeFloat(uint8_t* buffer, int bufPos)
@ -163,38 +191,3 @@ BerDecoder_decodeBoolean(uint8_t* buffer, int bufPos) {
else else
return false; return false;
} }
void
BerDecoder_decodeOID(uint8_t* buffer, int bufPos, int length, ItuObjectIdentifier* oid)
{
int startPos = bufPos;
int currentArc = 0;
/* clear all arcs */
int i;
for (i = 0; i < 10; i++)
oid->arc[i] = 0;
/* parse first two arcs */
if (length > 0) {
oid->arc[0] = buffer[bufPos] / 40;
oid->arc[1] = buffer[bufPos] % 40;
currentArc = 2;
bufPos++;
}
/* parse remaining arcs */
while ((bufPos - startPos < length) && (currentArc < 10)) {
oid->arc[currentArc] = oid->arc[currentArc]<<7;
if (buffer[bufPos] < 0x80)
oid->arc[currentArc++] += buffer[bufPos];
else
oid->arc[currentArc] += (buffer[bufPos] & 0x7f);
bufPos++;
}
oid->arcCount = currentArc;
}

View file

@ -34,20 +34,23 @@ extern "C" {
/**@{*/ /**@{*/
/**
* \brief authentication mechanism úsed by AcseAuthenticator
*/
typedef enum typedef enum
{ {
ACSE_AUTH_NONE = 0, ACSE_AUTH_NONE = 0,
ACSE_AUTH_PASSWORD = 1, ACSE_AUTH_PASSWORD = 1
ACSE_AUTH_CERTIFICATE = 2,
/** Use TLS certificate for client authentication */
ACSE_AUTH_TLS = 3
} AcseAuthenticationMechanism; } AcseAuthenticationMechanism;
/* --> for compatibility with older versions (libiec61850 < 0.7.7) */
#ifndef AUTH_NONE
#define AUTH_NONE ACSE_AUTH_NONE
#endif
#ifndef AUTH_PASSWORD
#define AUTH_PASSWORD ACSE_AUTH_PASSWORD
#endif
/* <-- for compatibility with older versions (libiec61850 < 0.7.7) */
typedef struct sAcseAuthenticationParameter* AcseAuthenticationParameter; typedef struct sAcseAuthenticationParameter* AcseAuthenticationParameter;
struct sAcseAuthenticationParameter struct sAcseAuthenticationParameter
@ -60,13 +63,6 @@ struct sAcseAuthenticationParameter
uint8_t* octetString; uint8_t* octetString;
int passwordLength; int passwordLength;
} password; } password;
struct
{
uint8_t* buf;
int length;
} certificate;
} value; } value;
}; };
@ -89,12 +85,11 @@ AcseAuthenticationParameter_setPassword(AcseAuthenticationParameter self, char*
* \param parameter user provided parameter - set when user registers the authenticator * \param parameter user provided parameter - set when user registers the authenticator
* \param authParameter the authentication parameters provided by the client * \param authParameter the authentication parameters provided by the client
* \param securityToken pointer where to store an application specific security token - can be ignored if not used. * \param securityToken pointer where to store an application specific security token - can be ignored if not used.
* \param appReference ISO application reference (ap-title + ae-qualifier)
* *
* \return true if client connection is accepted, false otherwise * \return true if client connection is accepted, false otherwise
*/ */
typedef bool typedef bool
(*AcseAuthenticator)(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appReference); (*AcseAuthenticator)(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken);
/** /**
* \brief COTP T selector * \brief COTP T selector

View file

@ -306,13 +306,13 @@ LinkedList /* <char*> */
MmsConnection_getDomainVariableNames(MmsConnection self, MmsError* mmsError, const char* domainId); MmsConnection_getDomainVariableNames(MmsConnection self, MmsError* mmsError, const char* domainId);
/** /**
* \brief Get the names of all named variable lists present in a MMS domain or VMD scope of the server. * \brief Get the names of all named variable lists present in a MMS domain of the server.
* *
* This will result in a domain specific GetNameList request. * This will result in a domain specific GetNameList request.
* *
* \param self MmsConnection instance to operate on * \param self MmsConnection instance to operate on
* \param mmsError user provided variable to store error code * \param mmsError user provided variable to store error code
* \param domainId the domain name for the domain specific request or NULL for a VMD scope request * \param domainId the domain name for the domain specific request
* *
* \return the domain specific named variable list names or NULL if the request failed. * \return the domain specific named variable list names or NULL if the request failed.
*/ */
@ -484,7 +484,7 @@ MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, boo
* *
* \param self MmsConnection instance to operate on * \param self MmsConnection instance to operate on
* \param mmsError user provided variable to store error code * \param mmsError user provided variable to store error code
* \param domainId the domain name of the variable or NULL for a VMD specific request * \param domainId the domain name of the variable
* \param itemId name of the variable * \param itemId name of the variable
* *
* \return Returns a MmsTypeSpecification object or NULL if the request failed. * \return Returns a MmsTypeSpecification object or NULL if the request failed.

View file

@ -46,7 +46,6 @@ typedef enum
MMS_ERROR_HARDWARE_FAULT = 5, MMS_ERROR_HARDWARE_FAULT = 5,
MMS_ERROR_CONCLUDE_REJECTED = 6, MMS_ERROR_CONCLUDE_REJECTED = 6,
MMS_ERROR_INVALID_ARGUMENTS = 7, MMS_ERROR_INVALID_ARGUMENTS = 7,
MMS_ERROR_OUTSTANDING_CALL_LIMIT = 8,
MMS_ERROR_OTHER = 9, MMS_ERROR_OTHER = 9,
@ -155,17 +154,6 @@ typedef struct
typedef struct sMmsNamedVariableList* MmsNamedVariableList; typedef struct sMmsNamedVariableList* MmsNamedVariableList;
typedef struct sMmsAccessSpecifier* MmsNamedVariableListEntry; typedef struct sMmsAccessSpecifier* MmsNamedVariableListEntry;
typedef struct {
uint16_t arc[10];
int arcCount;
} ItuObjectIdentifier;
typedef struct {
ItuObjectIdentifier apTitle;
int aeQualifier;
} IsoApplicationReference;
/**@}*/ /**@}*/

View file

@ -91,17 +91,6 @@ MmsVariableSpecification_getNamedVariableRecursive(MmsVariableSpecification* sel
MmsType MmsType
MmsVariableSpecification_getType(MmsVariableSpecification* self); MmsVariableSpecification_getType(MmsVariableSpecification* self);
/**
* \brief Check if the value has exactly the same type as this variable specfication
*
* \param self the MmsVariableSpecification instance
* \param value the value to check
*
* \return true if type is matching, false otherwise
*/
bool
MmsVariableSpecification_isValueOfType(MmsVariableSpecification* self, MmsValue* value);
/** /**
* \brief get the name of the variable * \brief get the name of the variable
* *

View file

@ -54,7 +54,6 @@ typedef struct sAcseConnection
int userDataBufferSize; int userDataBufferSize;
AcseAuthenticationParameter authentication; AcseAuthenticationParameter authentication;
AcseAuthenticator authenticator; AcseAuthenticator authenticator;
IsoApplicationReference applicationReference;
void* authenticatorParameter; void* authenticatorParameter;
void* securityToken; void* securityToken;
} AcseConnection; } AcseConnection;

View file

@ -46,7 +46,4 @@ BerDecoder_decodeDouble(uint8_t* buffer, int bufPos);
bool bool
BerDecoder_decodeBoolean(uint8_t* buffer, int bufPos); BerDecoder_decodeBoolean(uint8_t* buffer, int bufPos);
void
BerDecoder_decodeOID(uint8_t* buffer, int bufPos, int length, ItuObjectIdentifier* oid);
#endif /* BER_DECODER_H_ */ #endif /* BER_DECODER_H_ */

View file

@ -90,8 +90,6 @@ 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);
int
mmsMsg_parseRejectPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, int* rejectType, int* rejectReason);
MmsValue* MmsValue*
mmsMsg_parseDataElement(Data_t* dataElement); mmsMsg_parseDataElement(Data_t* dataElement);

View file

@ -69,10 +69,7 @@ authenticateClient(AcseConnection* self, AcseAuthenticationMechanism mechanism,
authParameter->value.password.passwordLength = authValueLen; authParameter->value.password.passwordLength = authValueLen;
} }
//TODO Check if we are in a TLS connection: if mechanism == ACSE_AUTH_NONE provide client certificate if present return self->authenticator(self->authenticatorParameter, authParameter, &(self->securityToken));
// --> mechanism = ACSE_AUTH_TLS
return self->authenticator(self->authenticatorParameter, authParameter, &(self->securityToken), &(self->applicationReference));
} }
static bool static bool
@ -244,28 +241,10 @@ parseAarqPdu(AcseConnection* self, uint8_t* buffer, int bufPos, int maxBufPos)
break; break;
case 0xa6: /* calling AP title */ case 0xa6: /* calling AP title */
{ bufPos += len;
if (buffer[bufPos] == 0x06) { /* ap-title-form2 */
int innerLength = buffer[bufPos+1];
if (innerLength == len - 2)
BerDecoder_decodeOID(buffer, bufPos + 2, innerLength, &(self->applicationReference.apTitle));
}
}
bufPos += len;
break; break;
case 0xa7: /* calling AE qualifier */ case 0xa7: /* calling AE qualifier */
{
if (buffer[bufPos] == 0x02) { /* ae-qualifier-form2 */
int innerLength = buffer[bufPos+1];
if (innerLength == len - 2)
self->applicationReference.aeQualifier = BerDecoder_decodeInt32(buffer + 2, buffer[bufPos+1], bufPos);
}
}
bufPos += len; bufPos += len;
break; break;
@ -336,7 +315,6 @@ AcseConnection_init(AcseConnection* self, AcseAuthenticator authenticator, void*
self->userDataBufferSize = 0; self->userDataBufferSize = 0;
self->authenticator= authenticator; self->authenticator= authenticator;
self->authenticatorParameter = parameter; self->authenticatorParameter = parameter;
memset(&(self->applicationReference), 0, sizeof(self->applicationReference));
} }
void void
@ -519,7 +497,7 @@ AcseConnection_createAssociateRequestMessage(AcseConnection* self,
calledAEQualifierLength = BerEncoder_UInt32determineEncodedSize(isoParameters->remoteAEQualifier); calledAEQualifierLength = BerEncoder_UInt32determineEncodedSize(isoParameters->remoteAEQualifier);
/* called AE qualifier */ /* called AP qualifier */
contentLength += (4 + calledAEQualifierLength); contentLength += (4 + calledAEQualifierLength);
} }
@ -531,7 +509,7 @@ AcseConnection_createAssociateRequestMessage(AcseConnection* self,
callingAEQualifierLength = BerEncoder_UInt32determineEncodedSize(isoParameters->localAEQualifier); callingAEQualifierLength = BerEncoder_UInt32determineEncodedSize(isoParameters->localAEQualifier);
/* calling AE qualifier */ /* calling AP qualifier */
contentLength += (4 + callingAEQualifierLength); contentLength += (4 + callingAEQualifierLength);
} }

View file

@ -94,6 +94,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = {
} else { \ } else { \
RETURN(RC_FAIL); \ RETURN(RC_FAIL); \
} \ } \
ASN_DEBUG("Reallocating into %ld", (long)_ns); \
} \ } \
memcpy(st->buf + st->size, bufptr, _bs); \ memcpy(st->buf + st->size, bufptr, _bs); \
/* Convenient nul-termination */ \ /* Convenient nul-termination */ \
@ -186,6 +187,12 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
int tlv_constr; int tlv_constr;
OS_type_e type_variant = (OS_type_e)specs->subvariant; OS_type_e type_variant = (OS_type_e)specs->subvariant;
ASN_DEBUG("Decoding %s as %s (frame %ld)",
td->name,
(type_variant == _TT_GENERIC) ?
"OCTET STRING" : "OS-SpecialCase",
(long)size);
/* /*
* Create the string if does not exist. * Create the string if does not exist.
*/ */
@ -247,6 +254,12 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
ssize_t Left = ((!sel||(size_t)sel->left >= size) ssize_t Left = ((!sel||(size_t)sel->left >= size)
?(ssize_t)size:sel->left); ?(ssize_t)size:sel->left);
ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", sel,
(long)(sel?sel->left:0),
(long)(sel?sel->want_nulls:0),
(long)(sel?sel->got:0)
);
if(sel && sel->left <= 0 && sel->want_nulls == 0) { if(sel && sel->left <= 0 && sel->want_nulls == 0) {
if(sel->prev) { if(sel->prev) {
struct _stack_el *prev = sel->prev; struct _stack_el *prev = sel->prev;
@ -267,7 +280,11 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
} }
tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag);
ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld",
(long)size, (long)Left, sel?"":"!",
(long)(sel?sel->left:0),
(long)(sel?sel->want_nulls:0),
(long)tl);
switch(tl) { switch(tl) {
case -1: RETURN(RC_FAIL); case -1: RETURN(RC_FAIL);
case 0: RETURN(RC_WMORE); case 0: RETURN(RC_WMORE);
@ -277,7 +294,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
ll = ber_fetch_length(tlv_constr, ll = ber_fetch_length(tlv_constr,
(const char *)buf_ptr + tl,Left - tl,&tlv_len); (const char *)buf_ptr + tl,Left - tl,&tlv_len);
ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld",
ber_tlv_tag_string(tlv_tag), tlv_constr,
(long)Left, (long)tl, (long)tlv_len, (long)ll);
switch(ll) { switch(ll) {
case -1: RETURN(RC_FAIL); case -1: RETURN(RC_FAIL);
case 0: RETURN(RC_WMORE); case 0: RETURN(RC_WMORE);
@ -288,6 +307,8 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
&& ((const uint8_t *)buf_ptr)[1] == 0) && ((const uint8_t *)buf_ptr)[1] == 0)
{ {
ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls);
if(type_variant == _TT_ANY if(type_variant == _TT_ANY
&& (tag_mode != 1 || sel->cont_level)) && (tag_mode != 1 || sel->cont_level))
APPEND("\0\0", 2); APPEND("\0\0", 2);
@ -338,12 +359,21 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
if(tlv_tag != expected_tag) { if(tlv_tag != expected_tag) {
char buf[2][32];
ber_tlv_tag_snprint(tlv_tag,
buf[0], sizeof(buf[0]));
ber_tlv_tag_snprint(td->tags[td->tags_count-1],
buf[1], sizeof(buf[1]));
ASN_DEBUG("Tag does not match expectation: %s != %s",
buf[0], buf[1]);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
tlvl = tl + ll; /* Combined length of T and L encoding */ tlvl = tl + ll; /* Combined length of T and L encoding */
if((tlv_len + tlvl) < 0) { if((tlv_len + tlvl) < 0) {
/* tlv_len value is too big */ /* tlv_len value is too big */
ASN_DEBUG("TLV encoding + length (%ld) is too big",
(long)tlv_len);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
@ -373,9 +403,14 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
sel->got += tlvl; sel->got += tlvl;
ADVANCE(tlvl); ADVANCE(tlvl);
ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%d",
(long)sel->got, (long)sel->left,
sel->want_nulls, sel->cont_level);
} while(tlv_constr); } while(tlv_constr);
if(sel == NULL) { if(sel == NULL) {
/* Finished operation, "phase out" */ /* Finished operation, "phase out" */
ASN_DEBUG("Phase out");
_CH_PHASE(ctx, +3); _CH_PHASE(ctx, +3);
break; break;
} }
@ -385,7 +420,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
case 2: case 2:
stck = (struct _stack *)ctx->ptr; stck = (struct _stack *)ctx->ptr;
sel = stck->cur_ptr; sel = stck->cur_ptr;
ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d",
(long)sel->left, (long)size, (long)sel->got,
sel->want_nulls);
{ {
ber_tlv_len_t len; ber_tlv_len_t len;
@ -409,6 +446,8 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
} }
if(sel->left) { if(sel->left) {
ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n",
(long)sel->left, (long)size, sel->want_nulls);
RETURN(RC_WMORE); RETURN(RC_WMORE);
} }
@ -452,6 +491,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
} }
if(sel) { if(sel) {
ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld",
sel->prev, sel->want_nulls,
(long)sel->left, (long)sel->got, (long)size);
if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { if(sel->prev || sel->want_nulls > 1 || sel->left > 0) {
RETURN(RC_WMORE); RETURN(RC_WMORE);
} }
@ -465,6 +507,12 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
st->buf[st->size-1] &= 0xff << st->bits_unused; st->buf[st->size-1] &= 0xff << st->bits_unused;
} }
ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld",
(long)consumed_myself, td->name,
(type_variant == _TT_GENERIC) ? (char *)st->buf : "<data>",
(long)st->size);
RETURN(RC_OK); RETURN(RC_OK);
} }
@ -483,6 +531,9 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
OS_type_e type_variant = (OS_type_e)specs->subvariant; OS_type_e type_variant = (OS_type_e)specs->subvariant;
int fix_last_byte = 0; int fix_last_byte = 0;
ASN_DEBUG("%s %s as OCTET STRING",
cb?"Estimating":"Encoding", td->name);
/* /*
* Write tags. * Write tags.
*/ */
@ -1223,6 +1274,9 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx,
if(len_bits < 0) RETURN(RC_WMORE); if(len_bits < 0) RETURN(RC_WMORE);
len_bits += ct->lower_bound; len_bits += ct->lower_bound;
ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)",
(long)ct->effective_bits, (long)len_bits,
repeat ? "repeat" : "once", td->name);
if(unit_bits == 1) { if(unit_bits == 1) {
len_bytes = (len_bits + 7) >> 3; len_bytes = (len_bits + 7) >> 3;
if(len_bits & 0x7) if(len_bits & 0x7)
@ -1269,9 +1323,17 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td,
_ASN_ENCODE_FAILED; _ASN_ENCODE_FAILED;
if(unit_bits == 1) { if(unit_bits == 1) {
ASN_DEBUG("BIT STRING of %d bytes, %d bits unused",
sizeinunits, st->bits_unused);
sizeinunits = sizeinunits * 8 - (st->bits_unused & 0x07); sizeinunits = sizeinunits * 8 - (st->bits_unused & 0x07);
} }
ASN_DEBUG("Encoding %s into %d units of %d bits"
" (%d..%d, effective %d)%s",
td->name, sizeinunits, unit_bits,
ct->lower_bound, ct->upper_bound,
ct->effective_bits, ct_extensible ? " EXT" : "");
/* Figure out wheter size lies within PER visible consrtaint */ /* Figure out wheter size lies within PER visible consrtaint */
if(ct->effective_bits >= 0) { if(ct->effective_bits >= 0) {
@ -1297,6 +1359,9 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td,
/* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */
/* X.691, #16.7: long fixed length encoding (up to 64K octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */
if(ct->effective_bits >= 0) { if(ct->effective_bits >= 0) {
ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits",
st->size, sizeinunits - ct->lower_bound,
ct->effective_bits);
ret = per_put_few_bits(po, sizeinunits - ct->lower_bound, ret = per_put_few_bits(po, sizeinunits - ct->lower_bound,
ct->effective_bits); ct->effective_bits);
if(ret) _ASN_ENCODE_FAILED; if(ret) _ASN_ENCODE_FAILED;
@ -1305,6 +1370,8 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td,
_ASN_ENCODED_OK(er); _ASN_ENCODED_OK(er);
} }
ASN_DEBUG("Encoding %d bytes", st->size);
if(sizeinunits == 0) { if(sizeinunits == 0) {
if(uper_put_length(po, 0)) if(uper_put_length(po, 0))
_ASN_ENCODE_FAILED; _ASN_ENCODE_FAILED;
@ -1316,6 +1383,8 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td,
ssize_t maySave = uper_put_length(po, sizeinunits); ssize_t maySave = uper_put_length(po, sizeinunits);
if(maySave < 0) _ASN_ENCODE_FAILED; if(maySave < 0) _ASN_ENCODE_FAILED;
ASN_DEBUG("Encoding %d of %d", maySave, sizeinunits);
ret = per_put_many_bits(po, buf, maySave * unit_bits); ret = per_put_many_bits(po, buf, maySave * unit_bits);
if(ret) _ASN_ENCODE_FAILED; if(ret) _ASN_ENCODE_FAILED;
@ -1399,6 +1468,8 @@ OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) {
if(!td || !st) if(!td || !st)
return; return;
ASN_DEBUG("Freeing %s as OCTET STRING", td->name);
if(st->buf) { if(st->buf) {
FREEMEM(st->buf); FREEMEM(st->buf);
} }

View file

@ -108,7 +108,8 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
tagno = step /* Continuing where left previously */ tagno = step /* Continuing where left previously */
+ (tag_mode==1?-1:0) + (tag_mode==1?-1:0)
; ;
ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)",
td->name, (long)size, tag_mode, step, tagno);
/* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */
if(tag_mode == 0 && tagno == td->tags_count) { if(tag_mode == 0 && tagno == td->tags_count) {
@ -129,7 +130,8 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
case -1: RETURN(RC_FAIL); case -1: RETURN(RC_FAIL);
case 0: RETURN(RC_WMORE); case 0: RETURN(RC_WMORE);
} }
ASN_DEBUG("Advancing %ld in ANY case",
(long)(tag_len + len_len));
ADVANCE(tag_len + len_len); ADVANCE(tag_len + len_len);
} else { } else {
assert(tagno < td->tags_count); /* At least one loop */ assert(tagno < td->tags_count); /* At least one loop */
@ -140,7 +142,11 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
* Fetch and process T from TLV. * Fetch and process T from TLV.
*/ */
tag_len = ber_fetch_tag(ptr, size, &tlv_tag); tag_len = ber_fetch_tag(ptr, size, &tlv_tag);
ASN_DEBUG("Fetching tag from {%p,%ld}: "
"len %ld, step %d, tagno %d got %s",
ptr, (long)size,
(long)tag_len, step, tagno,
ber_tlv_tag_string(tlv_tag));
switch(tag_len) { switch(tag_len) {
case -1: RETURN(RC_FAIL); case -1: RETURN(RC_FAIL);
case 0: RETURN(RC_WMORE); case 0: RETURN(RC_WMORE);
@ -164,7 +170,12 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
/* /*
* Unexpected tag. Too bad. * Unexpected tag. Too bad.
*/ */
RETURN(RC_FAIL); ASN_DEBUG("Expected: %s, "
"expectation failed (tn=%d, tm=%d)",
ber_tlv_tag_string(td->tags[tagno]),
tagno, tag_mode
);
RETURN(RC_FAIL);
} }
} }
@ -177,11 +188,15 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
*/ */
if(tagno < (td->tags_count - 1)) { if(tagno < (td->tags_count - 1)) {
if(tlv_constr == 0) { if(tlv_constr == 0) {
ASN_DEBUG("tlv_constr = %d, expfail",
tlv_constr);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
} else { } else {
if(last_tag_form != tlv_constr if(last_tag_form != tlv_constr
&& last_tag_form != -1) { && last_tag_form != -1) {
ASN_DEBUG("last_tag_form %d != %d",
last_tag_form, tlv_constr);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
} }
@ -191,7 +206,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
*/ */
len_len = ber_fetch_length(tlv_constr, len_len = ber_fetch_length(tlv_constr,
(const char *)ptr + tag_len, size - tag_len, &tlv_len); (const char *)ptr + tag_len, size - tag_len, &tlv_len);
ASN_DEBUG("Fetchinig len = %ld", (long)len_len);
switch(len_len) { switch(len_len) {
case -1: RETURN(RC_FAIL); case -1: RETURN(RC_FAIL);
case 0: RETURN(RC_WMORE); case 0: RETURN(RC_WMORE);
@ -211,12 +226,16 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
if(limit_len == -1) { if(limit_len == -1) {
expect_00_terminators++; expect_00_terminators++;
} else { } else {
ASN_DEBUG("Unexpected indefinite length "
"in a chain of definite lengths");
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
ADVANCE(tag_len + len_len); ADVANCE(tag_len + len_len);
continue; continue;
} else { } else {
if(expect_00_terminators) { if(expect_00_terminators) {
ASN_DEBUG("Unexpected definite length "
"in a chain of indefinite lengths");
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
} }
@ -236,7 +255,8 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx,
* Inner TLV specifies length which is inconsistent * Inner TLV specifies length which is inconsistent
* with the outer TLV's length value. * with the outer TLV's length value.
*/ */
ASN_DEBUG("Outer TLV is %ld and inner is %ld",
(long)limit_len, (long)tlv_len);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }

View file

@ -56,6 +56,50 @@ ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
return 0; /* Want more */ return 0; /* Want more */
} }
ssize_t
ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) {
char buf[sizeof("[APPLICATION ]") + 32];
ssize_t ret;
ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf));
if(ret >= (ssize_t)sizeof(buf) || ret < 2) {
errno = EPERM;
return -1;
}
return fwrite(buf, 1, ret, f);
}
ssize_t
ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) {
char *type = 0;
int ret;
switch(tag & 0x3) {
case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break;
case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break;
case ASN_TAG_CLASS_CONTEXT: type = ""; break;
case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break;
}
ret = snprintf(buf, size, "[%s%u](%02x)", type, ((unsigned)tag) >> 2, tag);
if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */
return ret;
}
char *
ber_tlv_tag_string(ber_tlv_tag_t tag) {
static char buf[sizeof("[APPLICATION ]") + 32];
(void)ber_tlv_tag_snprint(tag, buf, sizeof(buf));
return buf;
}
size_t size_t
ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) {
int tclass = BER_TAG_CLASS(tag); int tclass = BER_TAG_CLASS(tag);

View file

@ -117,6 +117,8 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
ASN_DEBUG("Decoding %s as CHOICE", td->name);
/* /*
* Create the target structure if it is not present already. * Create the target structure if it is not present already.
*/ */
@ -147,6 +149,8 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size,
tag_mode, -1, &ctx->left, 0); tag_mode, -1, &ctx->left, 0);
if(rval.code != RC_OK) { if(rval.code != RC_OK) {
ASN_DEBUG("%s tagging check failed: %d",
td->name, rval.code);
return rval; return rval;
} }
@ -161,13 +165,16 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
NEXT_PHASE(ctx); NEXT_PHASE(ctx);
ASN_DEBUG("Structure consumes %ld bytes, buffer %ld",
(long)ctx->left, (long)size);
/* Fall through */ /* Fall through */
case 1: case 1:
/* /*
* Fetch the T from TLV. * Fetch the T from TLV.
*/ */
tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag);
ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len);
switch(tag_len) { switch(tag_len) {
case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
/* Fall through */ /* Fall through */
@ -190,11 +197,17 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
ctx->step = t2m->el_no; ctx->step = t2m->el_no;
break; break;
} else if(specs->ext_start == -1) { } else if(specs->ext_start == -1) {
ASN_DEBUG("Unexpected tag %s "
"in non-extensible CHOICE %s",
ber_tlv_tag_string(tlv_tag), td->name);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} else { } else {
/* Skip this tag */ /* Skip this tag */
ssize_t skip; ssize_t skip;
ASN_DEBUG("Skipping unknown tag %s",
ber_tlv_tag_string(tlv_tag));
skip = ber_skip_length(opt_codec_ctx, skip = ber_skip_length(opt_codec_ctx,
BER_TLV_CONSTRUCTED(ptr), BER_TLV_CONSTRUCTED(ptr),
(const char *)ptr + tag_len, (const char *)ptr + tag_len,
@ -267,6 +280,9 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
/* Fall through */ /* Fall through */
case 3: case 3:
ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d",
td->name, (long)ctx->left, (long)size,
tag_mode, td->tags_count);
if(ctx->left > 0) { if(ctx->left > 0) {
/* /*
@ -319,6 +335,8 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
continue; continue;
} }
} else { } else {
ASN_DEBUG("Unexpected continuation in %s",
td->name);
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
@ -347,6 +365,9 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
if(!sptr) _ASN_ENCODE_FAILED; if(!sptr) _ASN_ENCODE_FAILED;
ASN_DEBUG("%s %s as CHOICE",
cb?"Encoding":"Estimating", td->name);
present = _fetch_present_idx(sptr, present = _fetch_present_idx(sptr,
specs->pres_offset, specs->pres_size); specs->pres_offset, specs->pres_size);
@ -414,6 +435,9 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
if(erval.encoded == -1) if(erval.encoded == -1)
return erval; return erval;
ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)",
(long)erval.encoded, (long)computed_size);
erval.encoded += computed_size; erval.encoded += computed_size;
return erval; return erval;
@ -458,6 +482,9 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
int present; int present;
if(!sptr) { if(!sptr) {
_ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1; return -1;
} }
@ -474,7 +501,9 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(!memb_ptr) { if(!memb_ptr) {
if(elm->optional) if(elm->optional)
return 0; return 0;
_ASN_CTFAIL(app_key, td,
"%s: mandatory CHOICE element %s absent (%s:%d)",
td->name, elm->name, __FILE__, __LINE__);
return -1; return -1;
} }
} else { } else {
@ -495,6 +524,9 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
return ret; return ret;
} }
} else { } else {
_ASN_CTFAIL(app_key, td,
"%s: no CHOICE element given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1; return -1;
} }
} }
@ -584,7 +616,8 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
elm->type, memb_ptr2, elm->name, elm->type, memb_ptr2, elm->name,
buf_ptr, size); buf_ptr, size);
XER_ADVANCE(tmprval.consumed); XER_ADVANCE(tmprval.consumed);
ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d",
elm->type->name, tmprval.code);
if(tmprval.code != RC_OK) if(tmprval.code != RC_OK)
RETURN(tmprval.code); RETURN(tmprval.code);
assert(_fetch_present_idx(st, assert(_fetch_present_idx(st,
@ -621,10 +654,17 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
} }
tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); tcv = xer_check_tag(buf_ptr, ch_size, xml_tag);
ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d",
ch_size>0?((const uint8_t *)buf_ptr)[0]:'?',
ch_size>1?((const uint8_t *)buf_ptr)[1]:'?',
ch_size>2?((const uint8_t *)buf_ptr)[2]:'?',
ch_size>3?((const uint8_t *)buf_ptr)[3]:'?',
xml_tag, tcv);
/* Skip the extensions section */ /* Skip the extensions section */
if(ctx->phase == 4) { if(ctx->phase == 4) {
ASN_DEBUG("skip_unknown(%d, %ld)",
tcv, (long)ctx->left);
switch(xer_skip_unknown(tcv, &ctx->left)) { switch(xer_skip_unknown(tcv, &ctx->left)) {
case -1: case -1:
ctx->phase = 5; ctx->phase = 5;
@ -693,6 +733,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
/* It is expected extension */ /* It is expected extension */
if(specs->ext_start != -1) { if(specs->ext_start != -1) {
ASN_DEBUG("Got anticipated extension");
/* /*
* Check for (XCT_BOTH or XCT_UNKNOWN_BO) * Check for (XCT_BOTH or XCT_UNKNOWN_BO)
* By using a mask. Only record a pure * By using a mask. Only record a pure
@ -714,6 +755,13 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
break; break;
} }
ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]"
" (ph=%d, tag=%s)",
ch_size>0?((const uint8_t *)buf_ptr)[0]:'?',
ch_size>1?((const uint8_t *)buf_ptr)[1]:'?',
ch_size>2?((const uint8_t *)buf_ptr)[2]:'?',
ch_size>3?((const uint8_t *)buf_ptr)[3]:'?',
td->name, ctx->phase, xml_tag);
break; break;
} }
@ -811,7 +859,8 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
if(ct && ct->range_bits >= 0) { if(ct && ct->range_bits >= 0) {
value = per_get_few_bits(pd, ct->range_bits); value = per_get_few_bits(pd, ct->range_bits);
if(value < 0) _ASN_DECODE_STARVED; if(value < 0) _ASN_DECODE_STARVED;
ASN_DEBUG("CHOICE %s got index %d in range %d",
td->name, value, ct->range_bits);
if(value > ct->upper_bound) if(value > ct->upper_bound)
_ASN_DECODE_FAILED; _ASN_DECODE_FAILED;
} else { } else {
@ -822,7 +871,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
value += specs->ext_start; value += specs->ext_start;
if(value >= td->elements_count) if(value >= td->elements_count)
_ASN_DECODE_FAILED; _ASN_DECODE_FAILED;
ASN_DEBUG("NOT IMPLEMENTED YET");
_ASN_DECODE_FAILED; _ASN_DECODE_FAILED;
} }
@ -841,10 +890,13 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
memb_ptr = (char *)st + elm->memb_offset; memb_ptr = (char *)st + elm->memb_offset;
memb_ptr2 = &memb_ptr; memb_ptr2 = &memb_ptr;
} }
ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name);
rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, rv = elm->type->uper_decoder(opt_codec_ctx, elm->type,
elm->per_constraints, memb_ptr2, pd); elm->per_constraints, memb_ptr2, pd);
if(rv.code != RC_OK)
ASN_DEBUG("Failed to decode %s in %s (CHOICE)",
elm->name, td->name);
return rv; return rv;
} }
@ -859,6 +911,8 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td,
if(!sptr) _ASN_ENCODE_FAILED; if(!sptr) _ASN_ENCODE_FAILED;
ASN_DEBUG("Encoding %s as CHOICE", td->name);
if(constraints) ct = &constraints->value; if(constraints) ct = &constraints->value;
else if(td->per_constraints) ct = &td->per_constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value;
else ct = 0; else ct = 0;
@ -879,6 +933,8 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td,
if(specs->canonical_order) if(specs->canonical_order)
present = specs->canonical_order[present]; present = specs->canonical_order[present];
ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present);
if(ct && ct->range_bits >= 0) { if(ct && ct->range_bits >= 0) {
if(present < ct->lower_bound if(present < ct->lower_bound
|| present > ct->upper_bound) { || present > ct->upper_bound) {
@ -903,7 +959,7 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td,
_ASN_ENCODE_FAILED; _ASN_ENCODE_FAILED;
if(uper_put_nsnnwn(po, present - specs->ext_start)) if(uper_put_nsnnwn(po, present - specs->ext_start))
_ASN_ENCODE_FAILED; _ASN_ENCODE_FAILED;
ASN_DEBUG("NOT IMPLEMENTED YET");
_ASN_ENCODE_FAILED; _ASN_ENCODE_FAILED;
} }
@ -970,6 +1026,8 @@ CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
if(!td || !ptr) if(!td || !ptr)
return; return;
ASN_DEBUG("Freeing %s as CHOICE", td->name);
/* /*
* Figure out which CHOICE element is encoded. * Figure out which CHOICE element is encoded.
*/ */

View file

@ -33,7 +33,7 @@
#undef ADVANCE #undef ADVANCE
#define ADVANCE(num_bytes) do { \ #define ADVANCE(num_bytes) do { \
size_t num = num_bytes; \ size_t num = num_bytes; \
ptr = ((const char *)ptr) + num; \ ptr = ((const char *)ptr) + num;\
size -= num; \ size -= num; \
if(ctx->left >= 0) \ if(ctx->left >= 0) \
ctx->left -= num; \ ctx->left -= num; \
@ -127,6 +127,8 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
int edx; /* SEQUENCE element's index */ int edx; /* SEQUENCE element's index */
ASN_DEBUG("Decoding %s as SEQUENCE", td->name);
/* /*
* Create the target structure if it is not present already. * Create the target structure if it is not present already.
@ -157,6 +159,8 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size,
tag_mode, 1, &ctx->left, 0); tag_mode, 1, &ctx->left, 0);
if(rval.code != RC_OK) { if(rval.code != RC_OK) {
ASN_DEBUG("%s tagging check failed: %d",
td->name, rval.code);
return rval; return rval;
} }
@ -166,6 +170,9 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
NEXT_PHASE(ctx); NEXT_PHASE(ctx);
ASN_DEBUG("Structure consumes %ld bytes, buffer %ld",
(long)ctx->left, (long)size);
/* Fall through */ /* Fall through */
case 1: case 1:
/* /*
@ -193,6 +200,11 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
/* /*
* MICROPHASE 1: Synchronize decoding. * MICROPHASE 1: Synchronize decoding.
*/ */
ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d"
" opt=%d ec=%d",
td->name, (int)ctx->left, edx,
elements[edx].flags, elements[edx].optional,
td->elements_count);
if(ctx->left == 0 /* No more stuff is expected */ if(ctx->left == 0 /* No more stuff is expected */
&& ( && (
@ -205,6 +217,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
&& specs->ext_before > td->elements_count) && specs->ext_before > td->elements_count)
) )
) { ) {
ASN_DEBUG("End of SEQUENCE %s", td->name);
/* /*
* Found the legitimate end of the structure. * Found the legitimate end of the structure.
*/ */
@ -216,7 +229,10 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
* Fetch the T from TLV. * Fetch the T from TLV.
*/ */
tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag);
ASN_DEBUG("Current tag in %s SEQUENCE for element %d "
"(%s) is %s encoded in %d bytes, of frame %ld",
td->name, edx, elements[edx].name,
ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT);
switch(tag_len) { switch(tag_len) {
case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
/* Fall through */ /* Fall through */
@ -230,7 +246,9 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
else else
RETURN(RC_WMORE); RETURN(RC_WMORE);
} else if(((const uint8_t *)ptr)[1] == 0) { } else if(((const uint8_t *)ptr)[1] == 0) {
ASN_DEBUG("edx = %d, opt = %d, ec=%d",
edx, elements[edx].optional,
td->elements_count);
if((edx + elements[edx].optional if((edx + elements[edx].optional
== td->elements_count) == td->elements_count)
|| (IN_EXTENSION_GROUP(specs, edx) || (IN_EXTENSION_GROUP(specs, edx)
@ -328,18 +346,25 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
* or an extension (...), * or an extension (...),
* or an end of the indefinite-length structure. * or an end of the indefinite-length structure.
*/ */
if(!IN_EXTENSION_GROUP(specs, edx + elements[edx].optional)) { if(!IN_EXTENSION_GROUP(specs, edx)) {
ASN_DEBUG("Unexpected tag %s (at %d)",
ber_tlv_tag_string(tlv_tag), edx);
ASN_DEBUG("Expected tag %s (%s)%s",
ber_tlv_tag_string(elements[edx].tag),
elements[edx].name,
elements[edx].optional
?" or alternatives":"");
RETURN(RC_FAIL); RETURN(RC_FAIL);
} else { } else {
/* Skip this tag */ /* Skip this tag */
ssize_t skip; ssize_t skip;
edx += elements[edx].optional;
skip = ber_skip_length(opt_codec_ctx, skip = ber_skip_length(opt_codec_ctx,
BER_TLV_CONSTRUCTED(ptr), BER_TLV_CONSTRUCTED(ptr),
(const char *)ptr + tag_len, (const char *)ptr + tag_len,
LEFT - tag_len); LEFT - tag_len);
ASN_DEBUG("Skip length %d in %s",
(int)skip, td->name);
switch(skip) { switch(skip) {
case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
/* Fall through */ /* Fall through */
@ -358,6 +383,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
*/ */
ctx->step |= 1; /* Confirm entering next microphase */ ctx->step |= 1; /* Confirm entering next microphase */
microphase2: microphase2:
ASN_DEBUG("Inside SEQUENCE %s MF2", td->name);
/* /*
* Compute the position of the member inside a structure, * Compute the position of the member inside a structure,
@ -382,7 +408,10 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
elements[edx].type, elements[edx].type,
memb_ptr2, ptr, LEFT, memb_ptr2, ptr, LEFT,
elements[edx].tag_mode); elements[edx].tag_mode);
ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d "
"in %d bytes rval.code %d, size=%d",
td->name, edx, elements[edx].type->name,
(int)LEFT, (int)rval.consumed, rval.code, (int)size);
switch(rval.code) { switch(rval.code) {
case RC_OK: case RC_OK:
break; break;
@ -391,7 +420,8 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
ADVANCE(rval.consumed); ADVANCE(rval.consumed);
RETURN(RC_WMORE); RETURN(RC_WMORE);
} }
ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)",
(long)ctx->left, (long)size);
/* Fall through */ /* Fall through */
case RC_FAIL: /* Fatal error */ case RC_FAIL: /* Fatal error */
RETURN(RC_FAIL); RETURN(RC_FAIL);
@ -405,6 +435,9 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
case 3: /* 00 and other tags expected */ case 3: /* 00 and other tags expected */
case 4: /* only 00's expected */ case 4: /* only 00's expected */
ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld",
td->name, (long)ctx->left, (long)size);
/* /*
* Skip everything until the end of the SEQUENCE. * Skip everything until the end of the SEQUENCE.
*/ */
@ -441,6 +474,11 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
if(!IN_EXTENSION_GROUP(specs, td->elements_count) if(!IN_EXTENSION_GROUP(specs, td->elements_count)
|| ctx->phase == 4) { || ctx->phase == 4) {
ASN_DEBUG("Unexpected continuation "
"of a non-extensible type "
"%s (SEQUENCE): %s",
td->name,
ber_tlv_tag_string(tlv_tag));
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
@ -1136,6 +1174,7 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td,
er.encoded = 0; er.encoded = 0;
ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name);
if(specs->ext_before >= 0) if(specs->ext_before >= 0)
_ASN_ENCODE_FAILED; /* We don't encode extensions yet */ _ASN_ENCODE_FAILED; /* We don't encode extensions yet */

View file

@ -84,6 +84,8 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
asn_dec_rval_t rval; /* Return code from subparsers */ asn_dec_rval_t rval; /* Return code from subparsers */
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
ASN_DEBUG("Decoding %s as SET OF", td->name);
/* /*
* Create the target structure if it is not present already. * Create the target structure if it is not present already.
@ -114,6 +116,8 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size,
tag_mode, 1, &ctx->left, 0); tag_mode, 1, &ctx->left, 0);
if(rval.code != RC_OK) { if(rval.code != RC_OK) {
ASN_DEBUG("%s tagging check failed: %d",
td->name, rval.code);
return rval; return rval;
} }
@ -121,6 +125,9 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
ctx->left += rval.consumed; /* ?Substracted below! */ ctx->left += rval.consumed; /* ?Substracted below! */
ADVANCE(rval.consumed); ADVANCE(rval.consumed);
ASN_DEBUG("Structure consumes %ld bytes, "
"buffer %ld", (long)ctx->left, (long)size);
NEXT_PHASE(ctx); NEXT_PHASE(ctx);
/* Fall through */ /* Fall through */
case 1: case 1:
@ -140,6 +147,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
*/ */
if(ctx->left == 0) { if(ctx->left == 0) {
ASN_DEBUG("End of SET OF %s", td->name);
/* /*
* No more things to decode. * No more things to decode.
* Exit out of here. * Exit out of here.
@ -180,6 +188,10 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
* The new list member of expected type has arrived. * The new list member of expected type has arrived.
*/ */
} else { } else {
ASN_DEBUG("Unexpected tag %s fixed SET OF %s",
ber_tlv_tag_string(tlv_tag), td->name);
ASN_DEBUG("%s SET OF has tag %s",
td->name, ber_tlv_tag_string(elm->tag));
RETURN(RC_FAIL); RETURN(RC_FAIL);
} }
} }
@ -195,7 +207,9 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
*/ */
rval = elm->type->ber_decoder(opt_codec_ctx, rval = elm->type->ber_decoder(opt_codec_ctx,
elm->type, &ctx->ptr, ptr, LEFT, 0); elm->type, &ctx->ptr, ptr, LEFT, 0);
ASN_DEBUG("In %s SET OF %s code %d consumed %d",
td->name, elm->type->name,
rval.code, (int)rval.consumed);
switch(rval.code) { switch(rval.code) {
case RC_OK: case RC_OK:
{ {
@ -213,8 +227,6 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
} }
/* Fall through */ /* Fall through */
case RC_FAIL: /* Fatal error */ case RC_FAIL: /* Fatal error */
ASN_STRUCT_FREE(*elm->type, ctx->ptr);
ctx->ptr = 0;
RETURN(RC_FAIL); RETURN(RC_FAIL);
} /* switch(rval) */ } /* switch(rval) */
@ -312,6 +324,8 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr,
int ret; int ret;
int edx; int edx;
ASN_DEBUG("Estimating size for SET OF %s", td->name);
/* /*
* Gather the length of the underlying members sequence. * Gather the length of the underlying members sequence.
*/ */
@ -360,6 +374,8 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr,
return erval; return erval;
} }
ASN_DEBUG("Encoding members of %s SET OF", td->name);
/* /*
* Encode all members. * Encode all members.
*/ */
@ -507,6 +523,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
asn_dec_rval_t tmprval; asn_dec_rval_t tmprval;
/* Invoke the inner type decoder, m.b. multiple times */ /* Invoke the inner type decoder, m.b. multiple times */
ASN_DEBUG("XER/SET OF element [%s]", elm_tag);
tmprval = element->type->xer_decoder(opt_codec_ctx, tmprval = element->type->xer_decoder(opt_codec_ctx,
element->type, &ctx->ptr, elm_tag, element->type, &ctx->ptr, elm_tag,
buf_ptr, size); buf_ptr, size);
@ -521,6 +538,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
RETURN(tmprval.code); RETURN(tmprval.code);
} }
ctx->phase = 1; /* Back to body processing */ ctx->phase = 1; /* Back to body processing */
ASN_DEBUG("XER/SET OF phase => %d", ctx->phase);
/* Fall through */ /* Fall through */
} }
@ -544,7 +562,8 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
} }
tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); tcv = xer_check_tag(buf_ptr, ch_size, xml_tag);
ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s",
tcv, ctx->phase, xml_tag);
switch(tcv) { switch(tcv) {
case XCT_CLOSING: case XCT_CLOSING:
if(ctx->phase == 0) break; if(ctx->phase == 0) break;
@ -568,6 +587,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
case XCT_UNKNOWN_OP: case XCT_UNKNOWN_OP:
case XCT_UNKNOWN_BO: case XCT_UNKNOWN_BO:
ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase);
if(ctx->phase == 1) { if(ctx->phase == 1) {
/* /*
* Process a single possible member. * Process a single possible member.
@ -580,6 +600,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
break; break;
} }
ASN_DEBUG("Unexpected XML tag in SET OF");
break; break;
} }
@ -766,10 +787,8 @@ SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
void void
SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
if(td && ptr) { if(td && ptr) {
asn_SET_OF_specifics_t *specs;
asn_TYPE_member_t *elm = td->elements; asn_TYPE_member_t *elm = td->elements;
asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr);
asn_struct_ctx_t *ctx; /* Decoder context */
int i; int i;
/* /*
@ -785,13 +804,6 @@ SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
asn_set_empty(list); /* Remove (list->array) */ asn_set_empty(list); /* Remove (list->array) */
specs = (asn_SET_OF_specifics_t *)td->specifics;
ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset);
if(ctx->ptr) {
ASN_STRUCT_FREE(*elm->type, ctx->ptr);
ctx->ptr = 0;
}
if(!contents_only) { if(!contents_only) {
FREEMEM(ptr); FREEMEM(ptr);
} }
@ -807,6 +819,9 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
int i; int i;
if(!sptr) { if(!sptr) {
_ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1; return -1;
} }
@ -875,7 +890,8 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
if(ct && ct->effective_bits >= 0) { if(ct && ct->effective_bits >= 0) {
/* X.691, #19.5: No length determinant */ /* X.691, #19.5: No length determinant */
nelems = per_get_few_bits(pd, ct->effective_bits); nelems = per_get_few_bits(pd, ct->effective_bits);
ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s",
(long)nelems, ct->lower_bound, td->name);
if(nelems < 0) _ASN_DECODE_STARVED; if(nelems < 0) _ASN_DECODE_STARVED;
nelems += ct->lower_bound; nelems += ct->lower_bound;
} else { } else {
@ -892,11 +908,20 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
for(i = 0; i < nelems; i++) { for(i = 0; i < nelems; i++) {
void *ptr = 0; void *ptr = 0;
ASN_DEBUG("SET OF %s decoding", elm->type->name);
rv = elm->type->uper_decoder(opt_codec_ctx, elm->type,
elm->per_constraints, &ptr, pd);
ASN_DEBUG("%s SET OF %s decoded %d, %p",
td->name, elm->type->name, rv.code, ptr);
if(rv.code == RC_OK) { if(rv.code == RC_OK) {
if(ASN_SET_ADD(list, ptr) == 0) if(ASN_SET_ADD(list, ptr) == 0)
continue; continue;
ASN_DEBUG("Failed to add element into %s",
td->name);
/* Fall through */ /* Fall through */
} else {
ASN_DEBUG("Failed decoding %s of %s (SET OF)",
elm->type->name, td->name);
} }
if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); if(ptr) ASN_STRUCT_FREE(*elm->type, ptr);
return rv; return rv;
@ -905,6 +930,8 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
nelems = -1; /* Allow uper_get_length() */ nelems = -1; /* Allow uper_get_length() */
} while(repeat); } while(repeat);
ASN_DEBUG("Decoded %s as SET OF", td->name);
rv.code = RC_OK; rv.code = RC_OK;
rv.consumed = 0; rv.consumed = 0;
return rv; return rv;

View file

@ -281,7 +281,7 @@ removeFromOutstandingCalls(MmsConnection self, uint32_t invokeId)
} }
static ByteBuffer* static ByteBuffer*
sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* message, MmsError* mmsError) sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* message)
{ {
ByteBuffer* receivedMessage = NULL; ByteBuffer* receivedMessage = NULL;
@ -291,12 +291,7 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer*
bool success = false; bool success = false;
if (addToOutstandingCalls(self, invokeId) == false) { addToOutstandingCalls(self, invokeId);
*mmsError = MMS_ERROR_OUTSTANDING_CALL_LIMIT;
return NULL;
}
*mmsError = MMS_ERROR_NONE;
#if (CONFIG_MMS_RAW_MESSAGE_LOGGING == 1) #if (CONFIG_MMS_RAW_MESSAGE_LOGGING == 1)
if (self->rawMmsMessageHandler != NULL) { if (self->rawMmsMessageHandler != NULL) {
@ -310,10 +305,8 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer*
while (currentTime < waitUntilTime) { while (currentTime < waitUntilTime) {
uint32_t receivedInvokeId; uint32_t receivedInvokeId;
if (self->associationState == MMS_STATE_CLOSED) { if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
goto connection_lost; goto connection_lost;
}
Semaphore_wait(self->lastResponseLock); Semaphore_wait(self->lastResponseLock);
@ -338,14 +331,7 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer*
if (!success) { if (!success) {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: TIMEOUT for request %u: \n", invokeId); printf("MMS_CLIENT: TIMEOUT for request %u: \n", invokeId);
self->lastResponseError = MMS_ERROR_SERVICE_TIMEOUT;
*mmsError = MMS_ERROR_SERVICE_TIMEOUT;
}
else {
*mmsError = self->lastResponseError;
if (*mmsError != MMS_ERROR_NONE)
receivedMessage = NULL;
} }
connection_lost: connection_lost:
@ -389,21 +375,6 @@ waitUntilLastResponseHasBeenProcessed(MmsConnection self)
} }
} }
static MmsError
convertRejectCodesToMmsError(int rejectType, int rejectReason)
{
if ((rejectType == 1) && (rejectReason == 1))
return MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE;
else if ((rejectType == 5) && (rejectReason == 0))
return MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE;
else if ((rejectType == 1) && (rejectReason == 4))
return MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT;
else if ((rejectType == 5) && (rejectReason == 1))
return MMS_ERROR_REJECT_INVALID_PDU;
else
return MMS_ERROR_REJECT_OTHER;
}
static MmsError static MmsError
convertServiceErrorToMmsError(MmsServiceError serviceError) convertServiceErrorToMmsError(MmsServiceError serviceError)
{ {
@ -584,8 +555,11 @@ mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32
int endPos = bufPos + length; int endPos = bufPos + length;
if (endPos > maxBufPos) if (endPos > maxBufPos) {
if (DEBUG_MMS_CLIENT)
printf("parseConfirmedErrorPDU: message to short!\n");
goto exit_error; goto exit_error;
}
while (bufPos < endPos) { while (bufPos < endPos) {
tag = buffer[bufPos++]; tag = buffer[bufPos++];
@ -617,63 +591,6 @@ mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32
return bufPos; return bufPos;
exit_error: exit_error:
if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: error parsing confirmed error PDU\n");
return -1;
}
int
mmsMsg_parseRejectPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, int* rejectType, int* rejectReason)
{
int length;
uint8_t tag = buffer[bufPos++];
if (tag != 0xa4)
goto exit_error;
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0)
goto exit_error;
if (bufPos + length > maxBufPos)
goto exit_error;
int endPos = bufPos + length;
if (endPos > maxBufPos)
goto exit_error;
while (bufPos < endPos) {
tag = buffer[bufPos++];
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0)
goto exit_error;
if (tag == 0x80) { /* invoke id */
if (invokeId != NULL)
*invokeId = BerDecoder_decodeUint32(buffer, length, bufPos);
}
else if (tag > 0x80 && tag < 0x8c) {
*rejectType = tag - 0x80;
*rejectReason = BerDecoder_decodeInt32(buffer, length, bufPos);
}
else {
/* unknown - ignore */
}
bufPos += length;
}
return bufPos;
exit_error:
if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: error parsing reject PDU\n");
return -1; return -1;
} }
@ -779,8 +696,6 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload)
if (mmsMsg_parseConfirmedErrorPDU(payload->buffer, 0, payload->size, &invokeId, &serviceError) < 0) { if (mmsMsg_parseConfirmedErrorPDU(payload->buffer, 0, payload->size, &invokeId, &serviceError) < 0) {
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: Error parsing confirmedErrorPDU!\n"); printf("MMS_CLIENT: Error parsing confirmedErrorPDU!\n");
goto exit_with_error;
} }
else { else {
if (checkForOutstandingCall(self, invokeId)) { if (checkForOutstandingCall(self, invokeId)) {
@ -801,37 +716,6 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload)
} }
} }
} }
else if (tag == 0xa4) { /* reject PDU */
if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: reject PDU!\n");
uint32_t invokeId;
int rejectType;
int rejectReason;
if (mmsMsg_parseRejectPDU(payload->buffer, 0, payload->size, &invokeId, &rejectType, &rejectReason) >= 0) {
if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: reject PDU invokeID: %i type: %i reason: %i\n", (int) invokeId, rejectType, rejectReason);
if (checkForOutstandingCall(self, invokeId)) {
/* wait for application thread to handle last received response */
waitUntilLastResponseHasBeenProcessed(self);
Semaphore_wait(self->lastResponseLock);
self->lastResponseError = convertRejectCodesToMmsError(rejectType, rejectReason);
self->responseInvokeId = invokeId;
Semaphore_post(self->lastResponseLock);
}
else {
IsoClientConnection_releaseReceiveBuffer(self->isoClient);
return;
}
}
else
goto exit_with_error;
}
else if (tag == 0xa1) { /* confirmed response PDU */ else if (tag == 0xa1) { /* confirmed response PDU */
int length; int length;
@ -999,16 +883,16 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload)
return; return;
exit_with_error: exit_with_error:
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: received malformed message from server!\n"); printf("received malformed message from server!\n");
IsoClientConnection_releaseReceiveBuffer(self->isoClient); IsoClientConnection_releaseReceiveBuffer(self->isoClient);
if (DEBUG_MMS_CLIENT) if (DEBUG_MMS_CLIENT)
printf("MMS_CLIENT: LEAVE mmsIsoCallback - NOT OK!\n"); printf("LEAVE mmsIsoCallback - NOT OK!\n");
return; return;
} }
@ -1364,6 +1248,8 @@ mmsClient_getNameListSingleRequest(
goto exit_function; goto exit_function;
} }
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
@ -1381,13 +1267,19 @@ mmsClient_getNameListSingleRequest(
payload, objectClass, continueAfter); payload, objectClass, continueAfter);
} }
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (responseMessage != NULL)
moreFollows = mmsClient_parseGetNameListResponse(nameList, self->lastResponse, NULL); moreFollows = mmsClient_parseGetNameListResponse(nameList, self->lastResponse, NULL);
if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return moreFollows; return moreFollows;
} }
@ -1469,17 +1361,24 @@ MmsConnection_readVariable(MmsConnection self, MmsError* mmsError,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createReadRequest(invokeId, domainId, itemId, payload); mmsClient_createReadRequest(invokeId, domainId, itemId, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
value = mmsClient_parseReadResponse(self->lastResponse, NULL, false); value = mmsClient_parseReadResponse(self->lastResponse, NULL, false);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return value; return value;
} }
@ -1498,18 +1397,25 @@ MmsConnection_readArrayElements(MmsConnection self, MmsError* mmsError,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createReadRequestAlternateAccessIndex(invokeId, domainId, itemId, startIndex, mmsClient_createReadRequestAlternateAccessIndex(invokeId, domainId, itemId, startIndex,
numberOfElements, payload); numberOfElements, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
value = mmsClient_parseReadResponse(self->lastResponse, NULL, false); value = mmsClient_parseReadResponse(self->lastResponse, NULL, false);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return value; return value;
} }
@ -1527,17 +1433,24 @@ MmsConnection_readMultipleVariables(MmsConnection self, MmsError* mmsError,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createReadRequestMultipleValues(invokeId, domainId, items, payload); mmsClient_createReadRequestMultipleValues(invokeId, domainId, items, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
value = mmsClient_parseReadResponse(self->lastResponse, NULL, true); value = mmsClient_parseReadResponse(self->lastResponse, NULL, true);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return value; return value;
} }
@ -1556,18 +1469,27 @@ MmsConnection_readNamedVariableListValues(MmsConnection self, MmsError* mmsError
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createReadNamedVariableListRequest(invokeId, domainId, listName, mmsClient_createReadNamedVariableListRequest(invokeId, domainId, listName,
payload, specWithResult); payload, specWithResult);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE) {
*mmsError = self->lastResponseError;
}
else if (responseMessage != NULL) {
value = mmsClient_parseReadResponse(self->lastResponse, NULL, true); value = mmsClient_parseReadResponse(self->lastResponse, NULL, true);
}
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return value; return value;
} }
@ -1587,18 +1509,25 @@ MmsConnection_readNamedVariableListValuesAssociationSpecific(
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createReadAssociationSpecificNamedVariableListRequest(invokeId, listName, mmsClient_createReadAssociationSpecificNamedVariableListRequest(invokeId, listName,
payload, specWithResult); payload, specWithResult);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
value = mmsClient_parseReadResponse(self->lastResponse, NULL, true); value = mmsClient_parseReadResponse(self->lastResponse, NULL, true);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return value; return value;
} }
@ -1616,19 +1545,26 @@ MmsConnection_readNamedVariableListDirectory(MmsConnection self, MmsError* mmsEr
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createGetNamedVariableListAttributesRequest(invokeId, payload, domainId, mmsClient_createGetNamedVariableListAttributesRequest(invokeId, payload, domainId,
listName); listName);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
attributes = mmsClient_parseGetNamedVariableListAttributesResponse(self->lastResponse, NULL, attributes = mmsClient_parseGetNamedVariableListAttributesResponse(self->lastResponse, NULL,
deletable); deletable);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return attributes; return attributes;
} }
@ -1646,19 +1582,26 @@ MmsConnection_readNamedVariableListDirectoryAssociationSpecific(MmsConnection se
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createGetNamedVariableListAttributesRequestAssociationSpecific(invokeId, payload, mmsClient_createGetNamedVariableListAttributesRequestAssociationSpecific(invokeId, payload,
listName); listName);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
attributes = mmsClient_parseGetNamedVariableListAttributesResponse(self->lastResponse, NULL, attributes = mmsClient_parseGetNamedVariableListAttributesResponse(self->lastResponse, NULL,
deletable); deletable);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return attributes; return attributes;
} }
@ -1674,19 +1617,26 @@ MmsConnection_defineNamedVariableList(MmsConnection self, MmsError* mmsError,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createDefineNamedVariableListRequest(invokeId, payload, domainId, mmsClient_createDefineNamedVariableListRequest(invokeId, payload, domainId,
listName, variableSpecs, false); listName, variableSpecs, false);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
if (!mmsClient_parseDefineNamedVariableResponse(self->lastResponse, NULL)) if (!mmsClient_parseDefineNamedVariableResponse(self->lastResponse, NULL))
*mmsError = MMS_ERROR_PARSING_RESPONSE; *mmsError = MMS_ERROR_DEFINITION_OTHER;
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return; return;
} }
@ -1702,19 +1652,25 @@ MmsConnection_defineNamedVariableListAssociationSpecific(MmsConnection self,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createDefineNamedVariableListRequest(invokeId, payload, NULL, mmsClient_createDefineNamedVariableListRequest(invokeId, payload, NULL,
listName, variableSpecs, true); listName, variableSpecs, true);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
if (!mmsClient_parseDefineNamedVariableResponse(self->lastResponse, NULL)) if (!mmsClient_parseDefineNamedVariableResponse(self->lastResponse, NULL))
*mmsError = MMS_ERROR_PARSING_RESPONSE; *mmsError = MMS_ERROR_DEFINITION_OTHER;
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return; return;
@ -1733,18 +1689,25 @@ MmsConnection_deleteNamedVariableList(MmsConnection self, MmsError* mmsError,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createDeleteNamedVariableListRequest(invokeId, payload, domainId, listName); mmsClient_createDeleteNamedVariableListRequest(invokeId, payload, domainId, listName);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
if (mmsClient_parseDeleteNamedVariableListResponse(self->lastResponse, NULL)) if (mmsClient_parseDeleteNamedVariableListResponse(self->lastResponse, NULL))
isDeleted = true; isDeleted = true;
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return isDeleted; return isDeleted;
} }
@ -1762,19 +1725,26 @@ MmsConnection_deleteAssociationSpecificNamedVariableList(MmsConnection self,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createDeleteAssociationSpecificNamedVariableListRequest( mmsClient_createDeleteAssociationSpecificNamedVariableListRequest(
invokeId, payload, listName); invokeId, payload, listName);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
if (mmsClient_parseDeleteNamedVariableListResponse(self->lastResponse, NULL)) if (mmsClient_parseDeleteNamedVariableListResponse(self->lastResponse, NULL))
isDeleted = true; isDeleted = true;
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return isDeleted; return isDeleted;
} }
@ -1792,17 +1762,24 @@ MmsConnection_getVariableAccessAttributes(MmsConnection self, MmsError* mmsError
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createGetVariableAccessAttributesRequest(invokeId, domainId, itemId, payload); mmsClient_createGetVariableAccessAttributesRequest(invokeId, domainId, itemId, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
typeSpec = mmsClient_parseGetVariableAccessAttributesResponse(self->lastResponse, NULL); typeSpec = mmsClient_parseGetVariableAccessAttributesResponse(self->lastResponse, NULL);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return typeSpec; return typeSpec;
} }
@ -1819,17 +1796,24 @@ MmsConnection_identify(MmsConnection self, MmsError* mmsError)
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createIdentifyRequest(invokeId, payload); mmsClient_createIdentifyRequest(invokeId, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
identity = mmsClient_parseIdentifyResponse(self); identity = mmsClient_parseIdentifyResponse(self);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
exit_function: exit_function:
return identity; return identity;
} }
@ -1840,28 +1824,41 @@ MmsConnection_getServerStatus(MmsConnection self, MmsError* mmsError, int* vmdLo
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createStatusRequest(invokeId, payload, extendedDerivation); mmsClient_createStatusRequest(invokeId, payload, extendedDerivation);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
if (mmsClient_parseStatusResponse(self, vmdLogicalStatus, vmdPhysicalStatus) == false) if (mmsClient_parseStatusResponse(self, vmdLogicalStatus, vmdPhysicalStatus) == false)
*mmsError = MMS_ERROR_PARSING_RESPONSE; *mmsError = MMS_ERROR_PARSING_RESPONSE;
} }
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
static LinkedList static LinkedList
readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuffer* payload, bool* moreFollows) readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuffer* payload, bool* moreFollows)
{ {
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); *mmsError = MMS_ERROR_NONE;
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
LinkedList response = NULL; LinkedList response = NULL;
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
if (mmsClient_parseReadJournalResponse(self, moreFollows, &response) == false) if (mmsClient_parseReadJournalResponse(self, moreFollows, &response) == false)
*mmsError = MMS_ERROR_PARSING_RESPONSE; *mmsError = MMS_ERROR_PARSING_RESPONSE;
@ -1869,6 +1866,9 @@ readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuff
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
return response; return response;
} }
@ -1972,15 +1972,19 @@ MmsConnection_fileOpen(MmsConnection self, MmsError* mmsError, const char* filen
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
int32_t frsmId = -1; int32_t frsmId = -1;
mmsClient_createFileOpenRequest(invokeId, payload, filename, initialPosition); mmsClient_createFileOpenRequest(invokeId, payload, filename, initialPosition);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
uint8_t* buffer = self->lastResponse->buffer; uint8_t* buffer = self->lastResponse->buffer;
int maxBufPos = self->lastResponse->size; int maxBufPos = self->lastResponse->size;
@ -1992,6 +1996,9 @@ MmsConnection_fileOpen(MmsConnection self, MmsError* mmsError, const char* filen
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
return frsmId; return frsmId;
} }
@ -2000,15 +2007,23 @@ MmsConnection_fileClose(MmsConnection self, MmsError* mmsError, int32_t frsmId)
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
uint32_t invokeId = getNextInvokeId(self); *mmsError = MMS_ERROR_NONE;
mmsClient_createFileCloseRequest(invokeId, payload, frsmId); uint32_t invokeId = getNextInvokeId(self);
sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); mmsClient_createFileCloseRequest(invokeId, payload, frsmId);
/* nothing to do - response contains no data to evaluate */ sendRequestAndWaitForResponse(self, invokeId, payload);
releaseResponse(self); if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
/* nothing to do - response contains no data to evaluate */
releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
void void
@ -2016,15 +2031,24 @@ MmsConnection_fileDelete(MmsConnection self, MmsError* mmsError, const char* fil
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
uint32_t invokeId = getNextInvokeId(self); *mmsError = MMS_ERROR_NONE;
mmsClient_createFileDeleteRequest(invokeId, payload, fileName); uint32_t invokeId = getNextInvokeId(self);
sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); mmsClient_createFileDeleteRequest(invokeId, payload, fileName);
/* nothing to do - response contains no data to evaluate */
releaseResponse(self); sendRequestAndWaitForResponse(self, invokeId, payload);
if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
/* nothing to do - response contains no data to evaluate */
releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
bool bool
@ -2033,14 +2057,18 @@ MmsConnection_fileRead(MmsConnection self, MmsError* mmsError, int32_t frsmId, M
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
bool moreFollows = false; bool moreFollows = false;
mmsClient_createFileReadRequest(invokeId, payload, frsmId); mmsClient_createFileReadRequest(invokeId, payload, frsmId);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
uint8_t* buffer = self->lastResponse->buffer; uint8_t* buffer = self->lastResponse->buffer;
int maxBufPos = self->lastResponse->size; int maxBufPos = self->lastResponse->size;
int bufPos = self->lastResponseBufPos; int bufPos = self->lastResponseBufPos;
@ -2051,6 +2079,9 @@ MmsConnection_fileRead(MmsConnection self, MmsError* mmsError, int32_t frsmId, M
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
return moreFollows; return moreFollows;
} }
@ -2061,21 +2092,28 @@ MmsConnection_getFileDirectory(MmsConnection self, MmsError* mmsError, const cha
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createFileDirectoryRequest(invokeId, payload, fileSpecification, continueAfter); mmsClient_createFileDirectoryRequest(invokeId, payload, fileSpecification, continueAfter);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
bool moreFollows = false; bool moreFollows = false;
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
if (mmsClient_parseFileDirectoryResponse(self, handler, handlerParameter, &moreFollows) == false) if (mmsClient_parseFileDirectoryResponse(self, handler, handlerParameter, &moreFollows) == false)
*mmsError = MMS_ERROR_PARSING_RESPONSE; *mmsError = MMS_ERROR_PARSING_RESPONSE;
} }
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
return moreFollows; return moreFollows;
} }
@ -2084,15 +2122,23 @@ MmsConnection_fileRename(MmsConnection self, MmsError* mmsError, const char* cur
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createFileRenameRequest(invokeId, payload, currentFileName, newFileName); mmsClient_createFileRenameRequest(invokeId, payload, currentFileName, newFileName);
sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); sendRequestAndWaitForResponse(self, invokeId, payload);
if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
/* nothing to do - response contains no data to evaluate */ /* nothing to do - response contains no data to evaluate */
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
@ -2101,15 +2147,23 @@ MmsConnection_obtainFile(MmsConnection self, MmsError* mmsError, const char* sou
{ {
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile); mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile);
sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); sendRequestAndWaitForResponse(self, invokeId, payload);
if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
/* nothing to do - response contains no data to evaluate */ /* nothing to do - response contains no data to evaluate */
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
MmsDataAccessError MmsDataAccessError
@ -2121,17 +2175,24 @@ MmsConnection_writeVariable(MmsConnection self, MmsError* mmsError,
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
mmsClient_createWriteRequest(invokeId, domainId, itemId, value, payload); mmsClient_createWriteRequest(invokeId, domainId, itemId, value, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
return retVal; return retVal;
} }
@ -2141,15 +2202,19 @@ MmsConnection_writeMultipleVariables(MmsConnection self, MmsError* mmsError, con
LinkedList /* <MmsValue*> */values, LinkedList /* <MmsValue*> */values,
/* OUTPUT */LinkedList* /* <MmsValue*> */accessResults) /* OUTPUT */LinkedList* /* <MmsValue*> */accessResults)
{ {
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
mmsClient_createWriteMultipleItemsRequest(invokeId, domainId, items, values, payload); mmsClient_createWriteMultipleItemsRequest(invokeId, domainId, items, values, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
int numberOfItems = LinkedList_size(items); int numberOfItems = LinkedList_size(items);
@ -2158,6 +2223,9 @@ MmsConnection_writeMultipleVariables(MmsConnection self, MmsError* mmsError, con
} }
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
MmsDataAccessError MmsDataAccessError
@ -2167,19 +2235,26 @@ MmsConnection_writeArrayElements(MmsConnection self, MmsError* mmsError,
{ {
MmsDataAccessError retVal = DATA_ACCESS_ERROR_UNKNOWN; MmsDataAccessError retVal = DATA_ACCESS_ERROR_UNKNOWN;
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
mmsClient_createWriteRequestArray(invokeId, domainId, itemId, index, numberOfElements, value, payload); mmsClient_createWriteRequestArray(invokeId, domainId, itemId, index, numberOfElements, value, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL)
retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError);
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
return retVal; return retVal;
} }
@ -2188,15 +2263,19 @@ MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, boo
const char* domainId, const char* itemId, LinkedList /* <MmsValue*> */values, const char* domainId, const char* itemId, LinkedList /* <MmsValue*> */values,
/* OUTPUT */LinkedList* /* <MmsValue*> */accessResults) /* OUTPUT */LinkedList* /* <MmsValue*> */accessResults)
{ {
*mmsError = MMS_ERROR_NONE;
uint32_t invokeId = getNextInvokeId(self); uint32_t invokeId = getNextInvokeId(self);
ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient);
mmsClient_createWriteRequestNamedVariableList(invokeId, isAssociationSpecific, domainId, itemId, values, payload); mmsClient_createWriteRequestNamedVariableList(invokeId, isAssociationSpecific, domainId, itemId, values, payload);
ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload);
if (responseMessage != NULL) { if (self->lastResponseError != MMS_ERROR_NONE)
*mmsError = self->lastResponseError;
else if (responseMessage != NULL) {
int numberOfItems = LinkedList_size(values); int numberOfItems = LinkedList_size(values);
@ -2205,6 +2284,9 @@ MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, boo
} }
releaseResponse(self); releaseResponse(self);
if (self->associationState == MMS_STATE_CLOSED)
*mmsError = MMS_ERROR_CONNECTION_LOST;
} }
void void

View file

@ -98,8 +98,6 @@ mmsClient_handleFileOpenRequest(
if (bufPos < 0) goto exit_reject_invalid_pdu; if (bufPos < 0) goto exit_reject_invalid_pdu;
if (bufPos + length > maxBufPos) goto exit_reject_invalid_pdu;
switch(tag) { switch(tag) {
case 0xa0: /* filename */ case 0xa0: /* filename */
@ -204,13 +202,13 @@ mmsClient_createFileOpenRequest(uint32_t invokeId, ByteBuffer* request, const ch
uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId);
uint32_t fileNameStringSize = strlen(fileName); uint32_t fileNameStringSize = strlen(fileName);
uint32_t fileNameSize = 1 + BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize; uint32_t fileNameSize = 1+ BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize;
uint32_t fileNameSeqSize = fileNameSize; uint32_t fileNameSeqSize = fileNameSize;
uint32_t fileOpenRequestSize = 1 + BerEncoder_determineLengthSize(fileNameSeqSize) + fileNameSeqSize + 2 + BerEncoder_UInt32determineEncodedSize(initialPosition); uint32_t fileOpenRequestSize = fileNameSeqSize + 2 + BerEncoder_UInt32determineEncodedSize(initialPosition) + 2;
uint32_t confirmedRequestPduSize = 2 + invokeIdSize + 2 + BerEncoder_determineLengthSize(fileOpenRequestSize) + fileOpenRequestSize; uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + fileOpenRequestSize;
int bufPos = 0; int bufPos = 0;
uint8_t* buffer = request->buffer; uint8_t* buffer = request->buffer;
@ -223,10 +221,9 @@ mmsClient_createFileOpenRequest(uint32_t invokeId, ByteBuffer* request, const ch
buffer[bufPos++] = 0xbf; buffer[bufPos++] = 0xbf;
buffer[bufPos++] = 0x48; buffer[bufPos++] = 0x48;
bufPos = BerEncoder_encodeLength(fileOpenRequestSize, buffer, bufPos); bufPos = BerEncoder_encodeLength(fileOpenRequestSize, buffer, bufPos);
bufPos = BerEncoder_encodeTL(0xa0, fileNameSeqSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0xa0, fileNameSeqSize, buffer, bufPos);
bufPos = BerEncoder_encodeOctetString(0x19, (uint8_t*) fileName, fileNameStringSize, buffer, bufPos);
bufPos = BerEncoder_encodeOctetString(0x19, (uint8_t*) fileName, fileNameStringSize, buffer, bufPos);
bufPos = BerEncoder_encodeUInt32WithTL(0x81, initialPosition, buffer, bufPos); bufPos = BerEncoder_encodeUInt32WithTL(0x81, initialPosition, buffer, bufPos);
request->size = bufPos; request->size = bufPos;
@ -240,9 +237,11 @@ mmsClient_createFileDeleteRequest(uint32_t invokeId, ByteBuffer* request, const
uint32_t fileNameStringSize = strlen(fileName); uint32_t fileNameStringSize = strlen(fileName);
uint32_t fileNameSize = 1 + BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize; uint32_t fileNameSize = 1 + BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize;
uint32_t fileDeleteRequestSize = fileNameSize; uint32_t fileNameSeqSize = fileNameSize;
uint32_t confirmedRequestPduSize = 1 + 2 + invokeIdSize + 1 + BerEncoder_determineLengthSize(fileDeleteRequestSize) + fileDeleteRequestSize; uint32_t fileDeleteRequestSize = fileNameSeqSize; // + 2;
uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + fileDeleteRequestSize;
int bufPos = 0; int bufPos = 0;
uint8_t* buffer = request->buffer; uint8_t* buffer = request->buffer;
@ -315,7 +314,7 @@ mmsClient_createFileDirectoryRequest(uint32_t invokeId, ByteBuffer* request, con
{ {
uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId);
uint32_t confirmedRequestPduSize = 1 + 2 + 1 + invokeIdSize; uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + 0;
uint32_t parameterSize = 0; uint32_t parameterSize = 0;
@ -325,7 +324,7 @@ mmsClient_createFileDirectoryRequest(uint32_t invokeId, ByteBuffer* request, con
if (continueAfter) if (continueAfter)
parameterSize += encodeFileSpecification(0xa1, continueAfter, NULL, 0); parameterSize += encodeFileSpecification(0xa1, continueAfter, NULL, 0);
confirmedRequestPduSize += BerEncoder_determineLengthSize(parameterSize) + parameterSize; confirmedRequestPduSize += parameterSize;
int bufPos = 0; int bufPos = 0;
uint8_t* buffer = request->buffer; uint8_t* buffer = request->buffer;
@ -354,13 +353,15 @@ mmsClient_createFileRenameRequest(uint32_t invokeId, ByteBuffer* request, const
{ {
uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId);
uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize;
uint32_t parameterSize = 0; uint32_t parameterSize = 0;
parameterSize += encodeFileSpecification(0xa0, currentFileName, NULL, 0); parameterSize += encodeFileSpecification(0xa0, currentFileName, NULL, 0);
parameterSize += encodeFileSpecification(0xa1, newFileName, NULL, 0); parameterSize += encodeFileSpecification(0xa1, newFileName, NULL, 0);
uint32_t confirmedRequestPduSize = 2 + invokeIdSize + 2 + BerEncoder_determineLengthSize(parameterSize) + parameterSize; confirmedRequestPduSize += parameterSize;
int bufPos = 0; int bufPos = 0;
uint8_t* buffer = request->buffer; uint8_t* buffer = request->buffer;
@ -386,13 +387,15 @@ mmsClient_createObtainFileRequest(uint32_t invokeId, ByteBuffer* request, const
{ {
uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId);
uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize;
uint32_t parameterSize = 0; uint32_t parameterSize = 0;
parameterSize += encodeFileSpecification(0xa0, sourceFile, NULL, 0); parameterSize += encodeFileSpecification(0xa0, sourceFile, NULL, 0);
parameterSize += encodeFileSpecification(0xa1, destinationFile, NULL, 0); parameterSize += encodeFileSpecification(0xa1, destinationFile, NULL, 0);
uint32_t confirmedRequestPduSize = 2 + invokeIdSize + 2 + BerEncoder_determineLengthSize(parameterSize) + parameterSize; confirmedRequestPduSize += parameterSize;
int bufPos = 0; int bufPos = 0;
uint8_t* buffer = request->buffer; uint8_t* buffer = request->buffer;

View file

@ -179,35 +179,22 @@ mmsClient_createGetVariableAccessAttributesRequest(
request->present = GetVariableAccessAttributesRequest_PR_name; request->present = GetVariableAccessAttributesRequest_PR_name;
if (domainId != NULL) { request->choice.name.present = ObjectName_PR_domainspecific;
request->choice.name.present = ObjectName_PR_domainspecific;
request->choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId; request->choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId;
request->choice.name.choice.domainspecific.domainId.size = strlen(domainId); request->choice.name.choice.domainspecific.domainId.size = strlen(domainId);
request->choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId; request->choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId;
request->choice.name.choice.domainspecific.itemId.size = strlen(itemId); request->choice.name.choice.domainspecific.itemId.size = strlen(itemId);
}
else {
request->choice.name.present = ObjectName_PR_vmdspecific;
request->choice.name.choice.vmdspecific.buf = (uint8_t*) itemId;
request->choice.name.choice.vmdspecific.size = strlen(itemId);
}
asn_enc_rval_t rval; asn_enc_rval_t rval;
rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, rval = der_encode(&asn_DEF_MmsPdu, mmsPdu,
(asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer);
if (domainId != NULL) { request->choice.name.choice.domainspecific.domainId.buf = 0;
request->choice.name.choice.domainspecific.domainId.buf = 0; request->choice.name.choice.domainspecific.domainId.size = 0;
request->choice.name.choice.domainspecific.domainId.size = 0; request->choice.name.choice.domainspecific.itemId.buf = 0;
request->choice.name.choice.domainspecific.itemId.buf = 0; request->choice.name.choice.domainspecific.itemId.size = 0;
request->choice.name.choice.domainspecific.itemId.size = 0;
}
else {
request->choice.name.choice.vmdspecific.buf = 0;
request->choice.name.choice.vmdspecific.size = 0;
}
asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);

View file

@ -377,18 +377,14 @@ mmsMsg_openFile(const char* basepath, char* fileName, bool readWrite)
bool bool
mmsMsg_parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response) mmsMsg_parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response)
{ {
if (*bufPos == maxBufPos)
return false;
uint8_t tag = buffer[(*bufPos)++]; uint8_t tag = buffer[(*bufPos)++];
int length;
if (tag != 0x19) { if (tag != 0x19) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return false; return false;
} }
int length;
*bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos);
if (*bufPos < 0) { if (*bufPos < 0) {

View file

@ -95,64 +95,6 @@ MmsVariableSpecification_getType(MmsVariableSpecification* self)
return self->type; return self->type;
} }
bool
MmsVariableSpecification_isValueOfType(MmsVariableSpecification* self, MmsValue* value)
{
if ((self->type) == (value->type)) {
if ((self->type == MMS_STRUCTURE) || (self->type == MMS_ARRAY)) {
int componentCount = self->typeSpec.structure.elementCount;
if (componentCount != (int) MmsValue_getArraySize(value))
return false;
if (self->type == MMS_STRUCTURE) {
int i;
for (i = 0; i < componentCount; i++) {
if (MmsVariableSpecification_isValueOfType(self->typeSpec.structure.elements[i], MmsValue_getElement(value, i)) == false)
return false;
}
return true;
}
else {
int i;
for (i = 0; i < componentCount; i++) {
if (MmsVariableSpecification_isValueOfType(self->typeSpec.array.elementTypeSpec, MmsValue_getElement(value, i)) == false)
return false;
}
}
}
else if (self->type == MMS_BIT_STRING) {
if (self->typeSpec.bitString == value->value.bitString.size)
return true;
if (self->typeSpec.bitString < 0) {
if (value->value.bitString.size <= (-self->typeSpec.bitString))
return true;
}
}
else if (self->type == MMS_FLOAT) {
if ((self->typeSpec.floatingpoint.exponentWidth == value->value.floatingPoint.exponentWidth) &&
(self->typeSpec.floatingpoint.formatWidth == value->value.floatingPoint.formatWidth))
return true;
}
else if (self->type == MMS_BINARY_TIME) {
if (self->typeSpec.binaryTime == value->value.binaryTime.size)
return true;
}
else
return true;
}
return false;
}
const char* const char*
MmsVariableSpecification_getName(MmsVariableSpecification* self) MmsVariableSpecification_getName(MmsVariableSpecification* self)
{ {

View file

@ -251,11 +251,6 @@ mmsServer_handleFileDeleteRequest(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (length > 255) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response);
return;
}
char filename[256]; char filename[256];
memcpy(filename, buffer + bufPos, length); memcpy(filename, buffer + bufPos, length);
@ -316,8 +311,6 @@ mmsServer_handleFileOpenRequest(
if (bufPos < 0) goto exit_reject_invalid_pdu; if (bufPos < 0) goto exit_reject_invalid_pdu;
if (bufPos + length > maxBufPos) goto exit_reject_invalid_pdu;
switch(tag) { switch(tag) {
case 0xa0: /* filename */ case 0xa0: /* filename */
@ -577,8 +570,6 @@ mmsServer_handleObtainFileRequest(
if (bufPos < 0) goto exit_reject_invalid_pdu; if (bufPos < 0) goto exit_reject_invalid_pdu;
if (bufPos + length > maxBufPos) goto exit_reject_invalid_pdu;
switch(tag) { switch(tag) {
case 0xa1: /* source filename */ case 0xa1: /* source filename */
@ -991,7 +982,7 @@ mmsServer_handleFileRenameRequest(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if ((bufPos < 0) || (bufPos + length > maxBufPos)) { if (bufPos < 0) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }
@ -1075,7 +1066,7 @@ mmsServer_handleFileDirectoryRequest(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if ((bufPos < 0) || (bufPos + length > maxBufPos)) { if (bufPos < 0) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return; return;
} }

View file

@ -233,10 +233,9 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection,
mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED);
} }
exit_function:
asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);
exit_function:
return; return;
} }
@ -421,7 +420,7 @@ mmsServer_handleDefineNamedVariableListRequest(
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
goto exit_free_struct; goto exit_function;
} }
request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.defineNamedVariableList); request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.defineNamedVariableList);
@ -667,7 +666,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest(
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
goto exit_function; return;
} }
if (request->present == ObjectName_PR_domainspecific) { if (request->present == ObjectName_PR_domainspecific) {

View file

@ -747,7 +747,7 @@ mmsServer_handleReadRequest(
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
goto exit_function; return;
} }
request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.read); request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.read);
@ -764,7 +764,6 @@ mmsServer_handleReadRequest(
mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED);
} }
exit_function:
asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);
} }

View file

@ -299,8 +299,7 @@ mmsServer_getValue(MmsServer self, MmsDomain* domain, char* itemId, MmsServerCon
if (self->readAccessHandler != NULL) { if (self->readAccessHandler != NULL) {
MmsDataAccessError accessError = MmsDataAccessError accessError =
self->readAccessHandler(self->readAccessHandlerParameter, (domain == (MmsDomain*) self->device) ? NULL : domain, self->readAccessHandler(self->readAccessHandlerParameter, domain, itemId, connection);
itemId, connection);
if (accessError != DATA_ACCESS_ERROR_SUCCESS) { if (accessError != DATA_ACCESS_ERROR_SUCCESS) {
value = MmsValue_newDataAccessError(accessError); value = MmsValue_newDataAccessError(accessError);
@ -313,7 +312,7 @@ mmsServer_getValue(MmsServer self, MmsDomain* domain, char* itemId, MmsServerCon
if (value == NULL) if (value == NULL)
if (self->readHandler != NULL) if (self->readHandler != NULL)
value = self->readHandler(self->readHandlerParameter, (domain == (MmsDomain*) self->device) ? NULL : domain, value = self->readHandler(self->readHandlerParameter, domain,
itemId, connection); itemId, connection);
exit_function: exit_function:

View file

@ -156,14 +156,9 @@ handleConfirmedRequestPdu(
bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos);
if (bufPos < 0) { if (bufPos < 0) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;
} }
if (bufPos + length > maxBufPos) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
return;
}
if (extendedTag) { if (extendedTag) {
switch(tag) { switch(tag) {

View file

@ -481,7 +481,7 @@ mmsServer_handleWriteRequest(
if (rval.code != RC_OK) { if (rval.code != RC_OK) {
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response);
goto exit_function; return;
} }
WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write);
@ -657,7 +657,7 @@ mmsServer_handleWriteRequest(
} }
/* Check for correct type */ /* Check for correct type */
if (MmsVariableSpecification_isValueOfType(variable, value) == false) { if (MmsValue_getType(value) != MmsVariableSpecification_getType(variable)) {
accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT;
goto end_of_main_loop; goto end_of_main_loop;
} }

View file

@ -570,6 +570,4 @@ EXPORTS
IedServer_setFilestoreBasepath IedServer_setFilestoreBasepath
IedModel_getDeviceByInst IedModel_getDeviceByInst
MmsConnection_writeNamedVariableList MmsConnection_writeNamedVariableList
IedConnection_writeDataSetValues IedConnection_writeDataSetValues
MmsVariableSpecification_isValueOfType
IedServer_udpateDbposValue

View file

@ -652,5 +652,3 @@ EXPORTS
SVClientASDU_hasRefrTm SVClientASDU_hasRefrTm
SVClientASDU_getRefrTmAsMs SVClientASDU_getRefrTmAsMs
IedConnection_writeDataSetValues IedConnection_writeDataSetValues
MmsVariableSpecification_isValueOfType
IedServer_udpateDbposValue

Binary file not shown.

View file

@ -23,8 +23,6 @@ package com.libiec61850.scl.model;
* See COPYING file for the complete license text. * See COPYING file for the complete license text.
*/ */
import java.util.Base64;
import com.libiec61850.scl.types.EnumerationType; import com.libiec61850.scl.types.EnumerationType;
import com.libiec61850.scl.types.IllegalValueException; import com.libiec61850.scl.types.IllegalValueException;
import com.libiec61850.scl.types.SclType; import com.libiec61850.scl.types.SclType;
@ -130,15 +128,6 @@ public class DataModelValue {
case UNICODE_STRING_255: case UNICODE_STRING_255:
this.value = value; this.value = value;
break; break;
case OCTET_STRING_64:
try {
this.value = Base64.getDecoder().decode(value);
}
catch (IllegalArgumentException e) {
throw new IllegalValueException("Val element for Octet64 type does not contain a valid base64 encoded string");
}
break;
case VISIBLE_STRING_32: case VISIBLE_STRING_32:
case VISIBLE_STRING_64: case VISIBLE_STRING_64:

View file

@ -727,20 +727,6 @@ public class StaticModelGenerator {
} }
} }
private void appendHexArrayString(StringBuffer buffer, byte[] byteArray) {
buffer.append("{");
for (int i = 0; i < byteArray.length; i++) {
if (i == 0)
buffer.append(String.format("0x%02X", byteArray[i]));
else
buffer.append(String.format(", 0x%02X", byteArray[i]));
}
buffer.append("}");
}
private void printValue(String daName, DataAttribute dataAttribute, DataModelValue value) { private void printValue(String daName, DataAttribute dataAttribute, DataModelValue value) {
@ -773,21 +759,6 @@ public class StaticModelGenerator {
case BOOLEAN: case BOOLEAN:
buffer.append("MmsValue_newBoolean(" + value.getValue() + ");"); buffer.append("MmsValue_newBoolean(" + value.getValue() + ");");
break; break;
case OCTET_STRING_64:
{
String daValName = daName + "__val";
buffer.append("MmsValue_newOctetString(0, 64);\n");
buffer.append("uint8_t " + daValName + "[] = ");
appendHexArrayString(buffer, (byte[]) value.getValue());
buffer.append(";\n");
buffer.append("MmsValue_setOctetString(");
buffer.append(daName);
buffer.append(".mmsValue, " + daValName + ", " + ((byte[])value.getValue()).length + ");\n");
}
break;
case UNICODE_STRING_255: case UNICODE_STRING_255:
buffer.append("MmsValue_newMmsString(\"" + value.getValue() + "\");"); buffer.append("MmsValue_newMmsString(\"" + value.getValue() + "\");");
break; break;