From 7a8bd5dabec0f2e6da5f4ec3a82adfb951d013cf Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 9 Feb 2016 17:47:58 +0100 Subject: [PATCH] - allow 16 octet ISO session selector in C code --- config/stack_config.h | 2 +- .../client_example5.c | 8 ++- src/mms/inc/iso_connection_parameters.h | 15 ++++-- src/mms/inc_private/iso_session.h | 4 +- .../iso_common/iso_connection_parameters.c | 4 +- .../iso_mms/client/mms_client_connection.c | 8 +-- src/mms/iso_session/iso_session.c | 50 +++++++++++++------ 7 files changed, 61 insertions(+), 30 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index 61ae9e67..c21730e5 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -17,7 +17,7 @@ #define DEBUG_COTP 0 #define DEBUG_ISO_SERVER 0 #define DEBUG_ISO_CLIENT 0 -#define DEBUG_IED_SERVER 1 +#define DEBUG_IED_SERVER 0 #define DEBUG_IED_CLIENT 0 #define DEBUG_MMS_CLIENT 0 #define DEBUG_MMS_SERVER 0 diff --git a/examples/iec61850_client_example5/client_example5.c b/examples/iec61850_client_example5/client_example5.c index f49c0aba..9dc66b68 100644 --- a/examples/iec61850_client_example5/client_example5.c +++ b/examples/iec61850_client_example5/client_example5.c @@ -50,9 +50,13 @@ int main(int argc, char** argv) { TSelector localTSelector = { 3, { 0x00, 0x01, 0x02 } }; TSelector remoteTSelector = { 2, { 0x00, 0x01 } }; + SSelector sSelector1 = {2, { 0, 1 } }; + SSelector sSelector2 = {5, { 0, 1, 2, 3, 4 } }; + + /* change parameters for presentation, session and transport layers */ - IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, 12, localTSelector); - IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, 1234 , remoteTSelector); + IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, sSelector1, localTSelector); + IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, sSelector2 , remoteTSelector); char* password = "top secret"; diff --git a/src/mms/inc/iso_connection_parameters.h b/src/mms/inc/iso_connection_parameters.h index 27fbb82e..b966491c 100644 --- a/src/mms/inc/iso_connection_parameters.h +++ b/src/mms/inc/iso_connection_parameters.h @@ -98,9 +98,14 @@ typedef bool */ typedef struct { uint8_t size; /** 0 .. 4 - 0 means T-selector is not present */ - uint8_t value[4]; /** T-selector value - value[0] */ + uint8_t value[4]; /** T-selector value */ } TSelector; +typedef struct { + uint8_t size; /** 0 .. 16 - 0 means S-selector is not present */ + uint8_t value[16]; /** P-selector value */ +} SSelector; + struct sIsoConnectionParameters { AcseAuthenticationParameter acseAuthParameter; @@ -112,14 +117,14 @@ struct sIsoConnectionParameters int remoteApTitleLen; int remoteAEQualifier; uint32_t remotePSelector; - uint16_t remoteSSelector; + SSelector remoteSSelector; TSelector remoteTSelector; uint8_t localApTitle[10]; int localApTitleLen; int localAEQualifier; uint32_t localPSelector; - uint16_t localSSelector; + SSelector localSSelector; TSelector localTSelector; }; @@ -201,7 +206,7 @@ IsoConnectionParameters_setRemoteApTitle(IsoConnectionParameters self, const cha * \param tSelector the T-Selector (ISO transport layer address) */ void -IsoConnectionParameters_setRemoteAddresses(IsoConnectionParameters self, uint32_t pSelector, uint16_t sSelector, TSelector tSelector); +IsoConnectionParameters_setRemoteAddresses(IsoConnectionParameters self, uint32_t pSelector, SSelector sSelector, TSelector tSelector); /** * \brief set the local AP-Title and AE-Qualifier @@ -231,7 +236,7 @@ IsoConnectionParameters_setLocalApTitle(IsoConnectionParameters self, char* apTi * \param tSelector the T-Selector (ISO transport layer address) */ void -IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, uint32_t pSelector, uint16_t sSelector, TSelector tSelector); +IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, uint32_t pSelector, SSelector sSelector, TSelector tSelector); /**@}*/ diff --git a/src/mms/inc_private/iso_session.h b/src/mms/inc_private/iso_session.h index 2e53a54c..f041cf79 100644 --- a/src/mms/inc_private/iso_session.h +++ b/src/mms/inc_private/iso_session.h @@ -29,8 +29,8 @@ #include "iso_connection_parameters.h" typedef struct { - uint16_t callingSessionSelector; - uint16_t calledSessionSelector; + SSelector callingSessionSelector; + SSelector calledSessionSelector; uint16_t sessionRequirement; uint8_t protocolOptions; ByteBuffer userData; diff --git a/src/mms/iso_common/iso_connection_parameters.c b/src/mms/iso_common/iso_connection_parameters.c index 8f4b2d2e..fa0aa928 100644 --- a/src/mms/iso_common/iso_connection_parameters.c +++ b/src/mms/iso_common/iso_connection_parameters.c @@ -104,7 +104,7 @@ IsoConnectionParameters_setRemoteApTitle(IsoConnectionParameters self, const cha } void -IsoConnectionParameters_setRemoteAddresses(IsoConnectionParameters self, uint32_t pSelector, uint16_t sSelector, TSelector tSelector) +IsoConnectionParameters_setRemoteAddresses(IsoConnectionParameters self, uint32_t pSelector, SSelector sSelector, TSelector tSelector) { self->remotePSelector = pSelector; self->remoteSSelector = sSelector; @@ -124,7 +124,7 @@ IsoConnectionParameters_setLocalApTitle(IsoConnectionParameters self, char* apTi } void -IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, uint32_t pSelector, uint16_t sSelector, TSelector tSelector) +IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, uint32_t pSelector, SSelector sSelector, TSelector tSelector) { self->localPSelector = pSelector; self->localSSelector = sSelector; diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index c514ca85..db4aecda 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -771,12 +771,12 @@ MmsConnection_create() self->isoParameters = IsoConnectionParameters_create(); /* Load default values for connection parameters */ - TSelector selector1 = { 2, { 0, 1 } }; - TSelector selector2 = { 2, { 0, 1 } }; + TSelector tSelector = { 2, { 0, 1 } }; + SSelector sSelector = {2, { 0, 1 } }; - IsoConnectionParameters_setLocalAddresses(self->isoParameters, 1, 1, selector1); + IsoConnectionParameters_setLocalAddresses(self->isoParameters, 1, sSelector, tSelector); IsoConnectionParameters_setLocalApTitle(self->isoParameters, "1.1.1.999", 12); - IsoConnectionParameters_setRemoteAddresses(self->isoParameters, 1, 1, selector2); + IsoConnectionParameters_setRemoteAddresses(self->isoParameters, 1, sSelector, tSelector); IsoConnectionParameters_setRemoteApTitle(self->isoParameters, "1.1.1.999.1", 12); self->connectTimeout = CONFIG_MMS_CONNECTION_DEFAULT_CONNECT_TIMEOUT; diff --git a/src/mms/iso_session/iso_session.c b/src/mms/iso_session/iso_session.c index e3db2699..5ee6ed11 100644 --- a/src/mms/iso_session/iso_session.c +++ b/src/mms/iso_session/iso_session.c @@ -165,21 +165,33 @@ parseSessionHeaderParameters(IsoSession* session, ByteBuffer* message, int param if (DEBUG_SESSION) printf("SESSION: Parameter - Calling Session Selector\n"); - if (parameterLength != 2) + if (parameterLength > 16) return SESSION_ERROR; - session->callingSessionSelector = message->buffer[offset++] * 0x100; - session->callingSessionSelector += message->buffer[offset++]; + { + session->callingSessionSelector.size = parameterLength; + + int i; + for (i = 0; i < session->callingSessionSelector.size; i++) + session->callingSessionSelector.value[i] = message->buffer[offset++]; + } + break; case 52: /* Called Session Selector */ if (DEBUG_SESSION) printf("SESSION: Parameter - Called Session Selector\n"); - if (parameterLength != 2) + if (parameterLength > 16) return SESSION_ERROR; - session->calledSessionSelector = message->buffer[offset++] * 0x100; - session->calledSessionSelector += message->buffer[offset++]; + { + session->calledSessionSelector.size = parameterLength; + + int i; + for (i = 0; i < session->calledSessionSelector.size; i++) + session->calledSessionSelector.value[i] = message->buffer[offset++]; + } + break; case 60: /* Data Overflow */ if (DEBUG_SESSION) @@ -251,9 +263,11 @@ static int encodeCallingSessionSelector(IsoSession* self, uint8_t* buf, int offset) { buf[offset++] = 0x33; - buf[offset++] = 2; - buf[offset++] = (uint8_t) (self->callingSessionSelector / 0x100); - buf[offset++] = (uint8_t) (self->callingSessionSelector & 0x00ff); + buf[offset++] = self->callingSessionSelector.size; + + int i; + for (i = 0; i < self->callingSessionSelector.size; i++) + buf[offset++] = self->callingSessionSelector.value[i]; return offset; } @@ -262,9 +276,11 @@ static int encodeCalledSessionSelector(IsoSession* self, uint8_t* buf, int offset) { buf[offset++] = 0x34; - buf[offset++] = 2; - buf[offset++] = (uint8_t) (self->calledSessionSelector / 0x100); - buf[offset++] = (uint8_t) (self->calledSessionSelector & 0x00ff); + buf[offset++] = self->calledSessionSelector.size; + + int i; + for (i = 0; i < self->calledSessionSelector.size; i++) + buf[offset++] = self->calledSessionSelector.value[i]; return offset; } @@ -399,8 +415,14 @@ IsoSession_init(IsoSession* session) { memset(session, 0, sizeof(IsoSession)); session->sessionRequirement = 0x0002; /* default = duplex functional unit */ - session->callingSessionSelector = 0x0001; - session->calledSessionSelector = 0x0001; + + session->callingSessionSelector.size = 2; + session->callingSessionSelector.value[0] = 0; + session->callingSessionSelector.value[1] = 1; + + session->calledSessionSelector.size = 2; + session->calledSessionSelector.value[0] = 0; + session->calledSessionSelector.value[1] = 1; } ByteBuffer*