- 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_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

@ -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";

@ -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);
/**@}*/

@ -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;

@ -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;

@ -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;

@ -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*

Loading…
Cancel
Save