Browse Source

cleaned up transportlayer file

FlorianPalm 11 years ago
parent
commit
3190d865e9

+ 1 - 0
OPCUAServer/src/opcua_builtInDatatypes.h

@@ -626,6 +626,7 @@ UA_VariantArrayUnion;
 
 typedef struct _UA_VariantArrayValue
 {
+	//Byte TypeEncoding;
     Int32  Length;
     UA_VariantArrayUnion Value;
 }

+ 3 - 32
OPCUAServer/src/opcua_secureChannelLayer.c

@@ -6,37 +6,8 @@
  */
 #include "opcua_secureChannelLayer.h"
 
-//memory calculation
 
 
-Int32 SL_openSecureChannelRequest_check(const UA_connection *connection, AD_RawMessage *secureChannelMessage)
-{
-	return UA_NO_ERROR;
-}
-/*
- * respond the securechannel_open request
- */
-Int32 SL_secureChannel_ResponseHeader_get(const UA_connection *connection, T_ResponseHeader *responseHeader)
-{
-	responseHeader->timestamp = 0;//TODO getCurrentTime();
-	responseHeader->requestHandle = 0;
-	responseHeader->serviceResult = 0; // TODO insert service result code
-
-	responseHeader->serviceDiagnostics->EncodingMask = 0;
-	responseHeader->noOfStringTable = 0;
-
-	responseHeader->additionalHeader.Body.Length = 0;
-	responseHeader->additionalHeader.Encoding = 0;
-	responseHeader->additionalHeader.Length = 0;
-
-
-	responseHeader->additionalHeader.TypeId.Namespace = 0;
-	responseHeader->additionalHeader.TypeId.Identifier.Numeric = 0;
-
-
-	responseHeader->requestHandle = 0;
-	return UA_NO_ERROR;
-}
 
 /*
  * opens a secureChannel (server side)
@@ -51,7 +22,7 @@ Int32 SL_secureChannel_open(const UA_connection *connection,
 	T_ResponseHeader responseHeader;
 	AD_RawMessage rawMessage;
 	Int32 position = 0;
-	SL_secureChannel_ResponseHeader_get(connection,&responseHeader);
+	//SL_secureChannel_ResponseHeader_get(connection,&responseHeader);
 	Int32 size = responseHeader_calcSize(&responseHeader);
 	rawMessage.message = (char*)opcua_malloc(size);
 
@@ -143,7 +114,7 @@ void SL_receive(UA_connection *connection, AD_RawMessage *serviceMessage)
 	//		if (openSecureChannelHeader_check(connection, secureChannelMessage))
 	//		{
 				//check if the request is valid
-				SL_openSecureChannelRequest_check(connection, secureChannelMessage);
+			//	SL_openSecureChannelRequest_check(connection, secureChannelMessage);
 	//		}
 	//		else
 	//		{
@@ -181,7 +152,7 @@ Int32 decodeSCMHeader(AD_RawMessage *rawMessage,Int32 *pos,
 Int32 encodeSCMHeader(SL_SecureConversationMessageHeader *SC_Header,
 		 Int32 *pos,AD_RawMessage *rawMessage)
 {
-	char *type = "ERR";
+	const char *type = "ERR";
 	switch(SC_Header->MessageType)
 	{
 	case packetType_ACK:

+ 71 - 117
OPCUAServer/src/opcua_transportLayer.c

@@ -8,19 +8,7 @@
 #include "opcua_transportLayer.h"
 
 
-/*
- * send acknowledge to the client
- */
-void TL_sendACK(UA_connection *connection)
-{
-	//get memory for message
-	//
-	//build message
-	//connection->transportLayer.localConf.maxChunkCount;
 
-	//call send function
-
-}
 /*
  * server answer to open message
  */
@@ -61,11 +49,13 @@ void TL_open(UA_connection *connection, AD_RawMessage *rawMessage)
 		}
 	}
 }
-Int32 TL_checkMessage(UA_connection *connection, AD_RawMessage *TL_messsage)
+
+Int32 TL_check(UA_connection *connection, AD_RawMessage *TL_messsage)
 {
 	Int32 position = 4;
 	UInt32 messageLength = 0;
-	TL_getPacketType(TL_messsage);
+	Int32 pos = 0;
+	TL_getPacketType(&pos,TL_messsage);
 	decoder_decodeBuiltInDatatype(TL_messsage->message,UINT32,&position,&messageLength);
 
 	if (messageLength == TL_messsage->length &&
@@ -75,64 +65,50 @@ Int32 TL_checkMessage(UA_connection *connection, AD_RawMessage *TL_messsage)
 	}
 	return UA_NO_ERROR;
 }
-void TL_receive(UA_connection *connection, AD_RawMessage *TL_message)
+
+
+Int32 TL_receive(UA_connection *connection, AD_RawMessage *TL_message)
 {
 	UInt32 bufferSize = connection->transportLayer.localConf.recvBufferSize = 8192;
 	UInt32 length = 0;
+	Int32 pos = 0;
 
 	AD_RawMessage tmpRawMessage;
 	struct TL_header tmpHeader;
-	//allocate memory for the message
-//TODO filter double Hello Messages -> generate error message as response
-//TODO build a file which handles the memory allocation
+	//TODO call socket receive function
 	tmpRawMessage.message = (char *)opcua_malloc(bufferSize);
+	tmpRawMessage.length = bufferSize;
 
-//	if (tmpRawMessage.message != NULL)
-//	{
-		//length = tcp_recv(connection, tmpRawMessage.message, bufferSize);
-//	}
-
-
-
-	tmpRawMessage.length = length;
-	if(tmpRawMessage.length > 0)
+	if(TL_check(connection,TL_message) == UA_NO_ERROR)
 	{
-		switch(TL_getPacketType(&tmpRawMessage))
+		Int32 packetType = TL_getPacketType(&pos,TL_message);
+		switch(packetType)
 		{
 		packetType_MSG:
 		packetType_OPN:
 		packetType_CLO:
-			//CHECK MESSAGE SIZE
-			if (TL_checkMessage(connection,TL_message))
-			{
-				TL_message->length = tmpRawMessage.length;
-				TL_message->message = tmpRawMessage.message;
-			}
-			else
-			{
-				// SEND BACK ERROR MESSAGE
-			}
+
 			break;
 		packetType_HEL:
-			TL_message->length = 0;
-			TL_message->message = NULL;
-			TL_open(connection, &tmpRawMessage);
-			break;
 		packetType_ACK:
-			TL_message->length = 0;
-			TL_message->message = NULL;
+			TL_process(connection,TL_message,packetType);
 			break;
 		packetType_ERR:
 			TL_message->length = 0;
 			TL_message->message = NULL;
+
 			//TODO ERROR HANDLING
+
+			return UA_ERROR_RCV_ERROR;
 			break;
-			//TODO ERROR HANDLING
 		}
-		//check in which state the connection is
-
 	}
-
+	else
+	{
+		//length error: send error message to communication partner
+		//TL_send()
+	}
+	return UA_NO_ERROR;
 }
 
 
@@ -189,41 +165,42 @@ void TL_getMessageHeader(struct TL_header *header, AD_RawMessage *rawMessage)
 	decoder_decodeBuiltInDatatype(rawMessage->message,BYTE,&pos,&(header->Reserved));
 	decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,&(header->MessageSize));
 }
-Int32 TL_getPacketType(AD_RawMessage *rawMessage)
+Int32 TL_getPacketType(Int32 *pos,AD_RawMessage *rawMessage)
 {
-	if(rawMessage->message[0] == 'H' &&
-	   rawMessage->message[1] == 'E' &&
-	   rawMessage->message[2] == 'L')
+
+	if(rawMessage->message[*pos] == 'H' &&
+	   rawMessage->message[*pos+1] == 'E' &&
+	   rawMessage->message[*pos+2] == 'L')
 	{
 		return packetType_HEL;
 	}
-	else if(rawMessage->message[0] == 'A' &&
-	        rawMessage->message[1] == 'C' &&
-	        rawMessage->message[2] == 'K')
+	else if(rawMessage->message[*pos] == 'A' &&
+	        rawMessage->message[*pos+1] == 'C' &&
+	        rawMessage->message[*pos+2] == 'K')
 	{
 		return packetType_ACK;
 	}
-	else if(rawMessage->message[0] == 'E' &&
-			rawMessage->message[1] == 'R' &&
-			rawMessage->message[2] == 'R')
+	else if(rawMessage->message[*pos] == 'E' &&
+			rawMessage->message[*pos+1] == 'R' &&
+			rawMessage->message[*pos+2] == 'R')
 	{
 		return packetType_ERR;
 	}
-	else if(rawMessage->message[0] == 'O' &&
-	        rawMessage->message[1] == 'P' &&
-	        rawMessage->message[2] == 'N')
+	else if(rawMessage->message[*pos] == 'O' &&
+	        rawMessage->message[*pos+1] == 'P' &&
+	        rawMessage->message[*pos+2] == 'N')
 	{
 		return packetType_OPN;
 	}
-	else if(rawMessage->message[0] == 'C' &&
-	        rawMessage->message[1] == 'L' &&
-	        rawMessage->message[2] == 'O')
+	else if(rawMessage->message[*pos] == 'C' &&
+	        rawMessage->message[*pos+1] == 'L' &&
+	        rawMessage->message[*pos+2] == 'O')
 	{
 		return packetType_CLO;
 	}
-	else if(rawMessage->message[0] == 'M' &&
-			rawMessage->message[1] == 'S' &&
-			rawMessage->message[2] == 'G')
+	else if(rawMessage->message[*pos] == 'M' &&
+			rawMessage->message[*pos+1] == 'S' &&
+			rawMessage->message[*pos+2] == 'G')
 	{
 		return packetType_MSG;
 	}
@@ -232,66 +209,43 @@ Int32 TL_getPacketType(AD_RawMessage *rawMessage)
 		return -1;//TODO ERROR no valid message received
 	}
 }
-void TL_processHELMessage_test()
-{
-	Byte data[] = {0x48,0x45,0x4c,0x46,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x88,0x13,0x00,0x00,0x36,0x00,0x00,0x00,0x6f,0x70,0x63,0x2e,0x74,0x63,0x70,0x3a,0x2f,0x2f,0x43,0x61,0x6e,0x6f,0x70,0x75,0x73,0x2e,0x70,0x6c,0x74,0x2e,0x72,0x77,0x74,0x68,0x2d,0x61,0x61,0x63,0x68,0x65,0x6e,0x2e,0x64,0x65,0x3a,0x31,0x36,0x36,0x36,0x34,0x2f,0x34,0x43,0x45,0x55,0x41,0x53,0x65,0x72,0x76,0x65,0x72};
-	UA_connection con;
-	AD_RawMessage rawMessage;
-	rawMessage.message = data;
-	rawMessage.length = 86;
-
-
-	struct TL_messageBodyHEL HELmessage;
-
-	struct TL_header header;
-
-	printf("TL_getHELMessage_test");
-
-	header.MessageSize = 86;
-	header.MessageType = TL_HEL; // HEL message
-	header.Reserved = 0x46; // F
-
-	TL_processHELMessage(&con, &rawMessage);
 
-	if(con.transportLayer.remoteConf.protocolVersion == 0 &&
-	   con.transportLayer.remoteConf.recvBufferSize == 65536 &&
-	   con.transportLayer.remoteConf.sendBufferSize == 65536 &&
-	   con.transportLayer.remoteConf.maxMessageSize == 16777216 &&
-	   con.transportLayer.remoteConf.maxChunkCount == 5000)
-	{
-		printf(" - passed \n");
-	}
-	else
-	{
-		printf(" - failed \n");
-	}
 
-}
-/*
- * gets the TL_messageBody
- */
-void TL_processHELMessage(UA_connection *connection, AD_RawMessage *rawMessage)
+Int32 TL_process(UA_connection *connection,Int32 packetType, Int32 *pos, AD_RawMessage *rawMessage)
 {
-	UInt32 pos = TL_HEADER_LENGTH;
 	struct TL_header tmpHeader;
+	switch(packetType)
+	{
+	packetType_HEL :
+		if(connection->transportLayer.connectionState == connectionState_CLOSED)
+		{
+
+			decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
+					(void*)(&(connection->transportLayer.remoteConf.protocolVersion)));
 
-	decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,pos,
-			(void*)&(connection->transportLayer.remoteConf.protocolVersion));
+			decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
+					(void*)(&(connection->transportLayer.remoteConf.recvBufferSize)));
 
-	decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,pos,
-			(void*)&(connection->transportLayer.remoteConf.recvBufferSize));
+			decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
+					(void*)(&(connection->transportLayer.remoteConf.sendBufferSize)));
 
-	decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,pos,
-			(void*)&(connection->transportLayer.remoteConf.sendBufferSize));
+			decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
+					(void*)(&(connection->transportLayer.remoteConf.maxMessageSize)));
 
-	decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,pos,
-			(void*)&(connection->transportLayer.remoteConf.maxMessageSize));
+			decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
+					(void*)(&(connection->transportLayer.remoteConf.maxChunkCount)));
 
-	decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,pos,
-			(void*)&(connection->transportLayer.remoteConf.maxChunkCount));
 
-	connection->transportLayer.endpointURL.Data = &(rawMessage->message[pos]);
-	connection->transportLayer.endpointURL.Length = tmpHeader.MessageSize - pos;
+			decoder_decodeBuiltInDatatype(rawMessage->message,STRING,&pos,
+					(void*)(&(connection->transportLayer.endpointURL)));
+
+		}
+		else
+		{
+			return UA_ERROR_MULTIPLY_HEL;
+		}
+	}
+	return UA_NO_ERROR;
 }
 /*
  * respond to client request

+ 18 - 4
OPCUAServer/src/opcua_transportLayer.h

@@ -16,6 +16,9 @@
 
 //TODO : Implement this interface
 #include "tcp_layer.h"
+//transport errors begin at 1000
+#define UA_ERROR_MULTIPLY_HEL 1000
+#define UA_ERROR_RCV_ERROR 1001
 
 //constants
 static const UInt32 TL_HEADER_LENGTH = 8;
@@ -76,10 +79,21 @@ struct TL_messageBodyERR
 
 };
 //functions
-void TL_receive(UA_connection *connection, AD_RawMessage *TL_message);
-//Test
-void TL_getMessageHeader_test();
-Int32 TL_getPacketType(AD_RawMessage *rawMessage);
+/**
+ *
+ * @param connection connection object
+ * @param TL_message
+ * @return
+ */
+Int32 TL_check(UA_connection *connection, AD_RawMessage *TL_message);
+/**
+ *
+ * @param connection
+ * @param TL_message
+ */
+Int32 TL_receive(UA_connection *connection, AD_RawMessage *TL_message);
+
+Int32 TL_getPacketType(Int32 *pos, AD_RawMessage *rawMessage);
 void TL_getMessageHeader(struct TL_header *messageHeader,AD_RawMessage *rawMessage);
 
 //Test

+ 2 - 1
OPCUAServer/tests/check_stack.c

@@ -23,11 +23,12 @@ START_TEST(test_getPacketType_validParameter)
 {
 
 	char buf[] = {'C','L','O'};
+	Int32 pos = 0;
 	AD_RawMessage rawMessage;
 	rawMessage.message = buf;
 	rawMessage.length = 3;
 
-	ck_assert_int_eq(TL_getPacketType(&rawMessage),packetType_CLO);
+	ck_assert_int_eq(TL_getPacketType(&pos,&rawMessage),packetType_CLO);
 
 }
 END_TEST