Compare commits
No commits in common. "master" and "v1.1" have entirely different histories.
91 changed files with 5999 additions and 710 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
17
examples/mms_client_example1/CMakeLists.txt
Normal file
17
examples/mms_client_example1/CMakeLists.txt
Normal 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
|
||||||
|
)
|
17
examples/mms_client_example1/Makefile
Normal file
17
examples/mms_client_example1/Makefile
Normal 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)
|
51
examples/mms_client_example1/mms_client_example1.c
Normal file
51
examples/mms_client_example1/mms_client_example1.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
17
examples/mms_client_example2/CMakeLists.txt
Normal file
17
examples/mms_client_example2/CMakeLists.txt
Normal 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
|
||||||
|
)
|
17
examples/mms_client_example2/Makefile
Normal file
17
examples/mms_client_example2/Makefile
Normal 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)
|
64
examples/mms_client_example2/mms_client_example2.c
Normal file
64
examples/mms_client_example2/mms_client_example2.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
17
examples/mms_client_example3/CMakeLists.txt
Normal file
17
examples/mms_client_example3/CMakeLists.txt
Normal 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
|
||||||
|
)
|
17
examples/mms_client_example3/Makefile
Normal file
17
examples/mms_client_example3/Makefile
Normal 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)
|
41
examples/mms_client_example3/mms_client_example3.c
Normal file
41
examples/mms_client_example3/mms_client_example3.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
17
examples/mms_client_example4/CMakeLists.txt
Normal file
17
examples/mms_client_example4/CMakeLists.txt
Normal 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
|
||||||
|
)
|
17
examples/mms_client_example4/Makefile
Normal file
17
examples/mms_client_example4/Makefile
Normal 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)
|
87
examples/mms_client_example4/mms_client_example4.c
Normal file
87
examples/mms_client_example4/mms_client_example4.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
17
examples/mms_client_example5/CMakeLists.txt
Normal file
17
examples/mms_client_example5/CMakeLists.txt
Normal 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
|
||||||
|
)
|
17
examples/mms_client_example5/Makefile
Normal file
17
examples/mms_client_example5/Makefile
Normal 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)
|
50
examples/mms_client_example5/mms_client_example5.c
Normal file
50
examples/mms_client_example5/mms_client_example5.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
21
examples/server_example1/CMakeLists.txt
Normal file
21
examples/server_example1/CMakeLists.txt
Normal 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
|
||||||
|
)
|
|
@ -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
|
|
@ -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;
|
|
@ -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();
|
||||||
|
|
21
examples/server_example2/CMakeLists.txt
Normal file
21
examples/server_example2/CMakeLists.txt
Normal 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
|
||||||
|
)
|
24
examples/server_example2/Makefile
Normal file
24
examples/server_example2/Makefile
Normal 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)
|
||||||
|
|
347
examples/server_example2/complexModel.icd
Normal file
347
examples/server_example2/complexModel.icd
Normal 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>
|
91
examples/server_example2/server_example2.c
Normal file
91
examples/server_example2/server_example2.c
Normal 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() */
|
|
@ -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();
|
||||||
|
|
21
examples/server_example3/CMakeLists.txt
Normal file
21
examples/server_example3/CMakeLists.txt
Normal 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
|
||||||
|
)
|
|
@ -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
|
|
@ -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;
|
|
@ -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();
|
||||||
|
|
0
examples/server_example3/vmd-filestore/SYSTEM.BIN
Normal file
0
examples/server_example3/vmd-filestore/SYSTEM.BIN
Normal file
21
examples/server_example4/CMakeLists.txt
Normal file
21
examples/server_example4/CMakeLists.txt
Normal 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
|
||||||
|
)
|
|
@ -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
|
|
@ -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,
|
|
@ -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();
|
||||||
|
|
21
examples/server_example5/CMakeLists.txt
Normal file
21
examples/server_example5/CMakeLists.txt
Normal 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
|
||||||
|
)
|
|
@ -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
|
|
@ -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;
|
3621
examples/server_example5/static_model.c
Normal file
3621
examples/server_example5/static_model.c
Normal file
File diff suppressed because it is too large
Load diff
609
examples/server_example5/static_model.h
Normal file
609
examples/server_example5/static_model.h
Normal 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_ */
|
||||||
|
|
|
@ -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
|
|
||||||
)
|
|
|
@ -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
|
|
||||||
)
|
|
|
@ -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
|
|
||||||
)
|
|
|
@ -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
|
|
||||||
)
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
|
@ -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.
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue