- allow 16 octet ISO session selector in C code

pull/6/head
Michael Zillgith 10 years ago
parent d54301fa09
commit 7a8bd5dabe

@ -17,7 +17,7 @@
#define DEBUG_COTP 0 #define DEBUG_COTP 0
#define DEBUG_ISO_SERVER 0 #define DEBUG_ISO_SERVER 0
#define DEBUG_ISO_CLIENT 0 #define DEBUG_ISO_CLIENT 0
#define DEBUG_IED_SERVER 1 #define DEBUG_IED_SERVER 0
#define DEBUG_IED_CLIENT 0 #define DEBUG_IED_CLIENT 0
#define DEBUG_MMS_CLIENT 0 #define DEBUG_MMS_CLIENT 0
#define DEBUG_MMS_SERVER 0 #define DEBUG_MMS_SERVER 0

@ -50,9 +50,13 @@ int main(int argc, char** argv) {
TSelector localTSelector = { 3, { 0x00, 0x01, 0x02 } }; TSelector localTSelector = { 3, { 0x00, 0x01, 0x02 } };
TSelector remoteTSelector = { 2, { 0x00, 0x01 } }; 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 */ /* change parameters for presentation, session and transport layers */
IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, 12, localTSelector); IsoConnectionParameters_setRemoteAddresses(parameters, 0x12345678, sSelector1, localTSelector);
IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, 1234 , remoteTSelector); IsoConnectionParameters_setLocalAddresses(parameters, 0x87654321, sSelector2 , remoteTSelector);
char* password = "top secret"; char* password = "top secret";

@ -98,9 +98,14 @@ typedef bool
*/ */
typedef struct { typedef struct {
uint8_t size; /** 0 .. 4 - 0 means T-selector is not present */ 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; } 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 struct sIsoConnectionParameters
{ {
AcseAuthenticationParameter acseAuthParameter; AcseAuthenticationParameter acseAuthParameter;
@ -112,14 +117,14 @@ struct sIsoConnectionParameters
int remoteApTitleLen; int remoteApTitleLen;
int remoteAEQualifier; int remoteAEQualifier;
uint32_t remotePSelector; uint32_t remotePSelector;
uint16_t remoteSSelector; SSelector remoteSSelector;
TSelector remoteTSelector; TSelector remoteTSelector;
uint8_t localApTitle[10]; uint8_t localApTitle[10];
int localApTitleLen; int localApTitleLen;
int localAEQualifier; int localAEQualifier;
uint32_t localPSelector; uint32_t localPSelector;
uint16_t localSSelector; SSelector localSSelector;
TSelector localTSelector; TSelector localTSelector;
}; };
@ -201,7 +206,7 @@ IsoConnectionParameters_setRemoteApTitle(IsoConnectionParameters self, const cha
* \param tSelector the T-Selector (ISO transport layer address) * \param tSelector the T-Selector (ISO transport layer address)
*/ */
void 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 * \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) * \param tSelector the T-Selector (ISO transport layer address)
*/ */
void void
IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, uint32_t pSelector, uint16_t sSelector, TSelector tSelector); IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, uint32_t pSelector, SSelector sSelector, TSelector tSelector);
/**@}*/ /**@}*/

@ -29,8 +29,8 @@
#include "iso_connection_parameters.h" #include "iso_connection_parameters.h"
typedef struct { typedef struct {
uint16_t callingSessionSelector; SSelector callingSessionSelector;
uint16_t calledSessionSelector; SSelector calledSessionSelector;
uint16_t sessionRequirement; uint16_t sessionRequirement;
uint8_t protocolOptions; uint8_t protocolOptions;
ByteBuffer userData; ByteBuffer userData;

@ -104,7 +104,7 @@ IsoConnectionParameters_setRemoteApTitle(IsoConnectionParameters self, const cha
} }
void 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->remotePSelector = pSelector;
self->remoteSSelector = sSelector; self->remoteSSelector = sSelector;
@ -124,7 +124,7 @@ IsoConnectionParameters_setLocalApTitle(IsoConnectionParameters self, char* apTi
} }
void 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->localPSelector = pSelector;
self->localSSelector = sSelector; self->localSSelector = sSelector;

@ -771,12 +771,12 @@ MmsConnection_create()
self->isoParameters = IsoConnectionParameters_create(); self->isoParameters = IsoConnectionParameters_create();
/* Load default values for connection parameters */ /* Load default values for connection parameters */
TSelector selector1 = { 2, { 0, 1 } }; TSelector tSelector = { 2, { 0, 1 } };
TSelector selector2 = { 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_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); IsoConnectionParameters_setRemoteApTitle(self->isoParameters, "1.1.1.999.1", 12);
self->connectTimeout = CONFIG_MMS_CONNECTION_DEFAULT_CONNECT_TIMEOUT; self->connectTimeout = CONFIG_MMS_CONNECTION_DEFAULT_CONNECT_TIMEOUT;

@ -165,21 +165,33 @@ parseSessionHeaderParameters(IsoSession* session, ByteBuffer* message, int param
if (DEBUG_SESSION) if (DEBUG_SESSION)
printf("SESSION: Parameter - Calling Session Selector\n"); printf("SESSION: Parameter - Calling Session Selector\n");
if (parameterLength != 2) if (parameterLength > 16)
return SESSION_ERROR; 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; break;
case 52: /* Called Session Selector */ case 52: /* Called Session Selector */
if (DEBUG_SESSION) if (DEBUG_SESSION)
printf("SESSION: Parameter - Called Session Selector\n"); printf("SESSION: Parameter - Called Session Selector\n");
if (parameterLength != 2) if (parameterLength > 16)
return SESSION_ERROR; 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; break;
case 60: /* Data Overflow */ case 60: /* Data Overflow */
if (DEBUG_SESSION) if (DEBUG_SESSION)
@ -251,9 +263,11 @@ static int
encodeCallingSessionSelector(IsoSession* self, uint8_t* buf, int offset) encodeCallingSessionSelector(IsoSession* self, uint8_t* buf, int offset)
{ {
buf[offset++] = 0x33; buf[offset++] = 0x33;
buf[offset++] = 2; buf[offset++] = self->callingSessionSelector.size;
buf[offset++] = (uint8_t) (self->callingSessionSelector / 0x100);
buf[offset++] = (uint8_t) (self->callingSessionSelector & 0x00ff); int i;
for (i = 0; i < self->callingSessionSelector.size; i++)
buf[offset++] = self->callingSessionSelector.value[i];
return offset; return offset;
} }
@ -262,9 +276,11 @@ static int
encodeCalledSessionSelector(IsoSession* self, uint8_t* buf, int offset) encodeCalledSessionSelector(IsoSession* self, uint8_t* buf, int offset)
{ {
buf[offset++] = 0x34; buf[offset++] = 0x34;
buf[offset++] = 2; buf[offset++] = self->calledSessionSelector.size;
buf[offset++] = (uint8_t) (self->calledSessionSelector / 0x100);
buf[offset++] = (uint8_t) (self->calledSessionSelector & 0x00ff); int i;
for (i = 0; i < self->calledSessionSelector.size; i++)
buf[offset++] = self->calledSessionSelector.value[i];
return offset; return offset;
} }
@ -399,8 +415,14 @@ IsoSession_init(IsoSession* session)
{ {
memset(session, 0, sizeof(IsoSession)); memset(session, 0, sizeof(IsoSession));
session->sessionRequirement = 0x0002; /* default = duplex functional unit */ 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* ByteBuffer*

Loading…
Cancel
Save