|
@@ -5,41 +5,291 @@
|
|
|
* Author: opcua
|
|
|
*/
|
|
|
#include "opcua_transportLayer.h"
|
|
|
-void TL_getHELMessage_test()
|
|
|
+
|
|
|
+/*
|
|
|
+ * send acknowledge to the client
|
|
|
+ */
|
|
|
+void TL_sendACK(UA_connection *connection)
|
|
|
+{
|
|
|
+ //get memory for message
|
|
|
+ //
|
|
|
+ //build message
|
|
|
+ //connection->transportLayer.serverBuffers.maxChunkCount;
|
|
|
+
|
|
|
+ //call send function
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void TL_open(UA_connection *connection, AD_RawMessage *rawMessage)
|
|
|
{
|
|
|
- char data[] = {0x48,0x45,0x4c,0x46,0x56,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x20,0x01,0x88,0x13,0x20,0x20,0x36,0x20,0x20,0x20,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};
|
|
|
+ switch(connection->transportLayer.connectionState)
|
|
|
+ {
|
|
|
+ connectionState_CLOSED :
|
|
|
+ {
|
|
|
+
|
|
|
+ TL_processHELMessage(connection,rawMessage);
|
|
|
+ TL_sendACK(connection);
|
|
|
+ connection->transportLayer.connectionState = connectionState_ESTABLISHED;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ connectionState_OPENING :
|
|
|
+ {
|
|
|
+ // TL_sendACK(connection);
|
|
|
+ // connection->transportLayer.connectionState = connectionState_ESTABLISHED;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ connectionState_ESTABLISHED :
|
|
|
+ {
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+/*
|
|
|
+void TL_receive(UA_connection *connection, AD_RawMessage *TL_message)
|
|
|
+{
|
|
|
+ UInt32 bufferSize = connection->transportLayer.serverBuffers.recvBufferSize = 8192;
|
|
|
+ UInt32 length = 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
|
|
|
+ tmpRawMessage.message = (char *)malloc(bufferSize);
|
|
|
+
|
|
|
+ if (tmpRawMessage.message != NULL)
|
|
|
+ {
|
|
|
+ length = tcp_recv(connection, tmpRawMessage.message, bufferSize);
|
|
|
+ }
|
|
|
+ tmpRawMessage.length = length;
|
|
|
+ if(tmpRawMessage.length > 0)
|
|
|
+ {
|
|
|
+ TL_getMessageHeader(connection, &tmpHeader);
|
|
|
+ switch(tmpHeader->MessageType)
|
|
|
+ {
|
|
|
+ TL_OPN,TL_MSG,TL_CLO :
|
|
|
+ {
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ TL_HEL :
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ TL_ACK :
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ //check in which state the connection is
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+*/
|
|
|
+void TL_getMessageHeader_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};
|
|
|
+
|
|
|
+ AD_RawMessage rawMessage;
|
|
|
+ rawMessage.message = data;
|
|
|
+ rawMessage.length = 86;
|
|
|
+
|
|
|
+
|
|
|
struct TL_messageBodyHEL HELmessage;
|
|
|
struct TL_header header;
|
|
|
+ printf("TL_getMessageHeader_test");
|
|
|
+
|
|
|
+ TL_getMessageHeader(&header, &rawMessage);
|
|
|
+
|
|
|
+ if(header.MessageSize == 86 &&
|
|
|
+ header.MessageType == TL_HEL &&
|
|
|
+ header.Reserved == 0x46)
|
|
|
+ {
|
|
|
+ printf(" - passed \n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf(" - failed \n");
|
|
|
+ }
|
|
|
+}
|
|
|
+/*
|
|
|
+ * get the message header
|
|
|
+ */
|
|
|
+void TL_getMessageHeader(struct TL_header *header, AD_RawMessage *rawMessage)
|
|
|
+{
|
|
|
+ int pos = 0;
|
|
|
+
|
|
|
+ if(rawMessage->message[0] == 'H' &&
|
|
|
+ rawMessage->message[1] == 'E' &&
|
|
|
+ rawMessage->message[2] == 'L')
|
|
|
+ {
|
|
|
+ header->MessageType = TL_HEL;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'A' &&
|
|
|
+ rawMessage->message[1] == 'C' &&
|
|
|
+ rawMessage->message[2] == 'K')
|
|
|
+ {
|
|
|
+ header->MessageType = TL_ACK;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'E' &&
|
|
|
+ rawMessage->message[1] == 'R' &&
|
|
|
+ rawMessage->message[2] == 'R')
|
|
|
+ {
|
|
|
+ header->MessageType = TL_ERR;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'O' &&
|
|
|
+ rawMessage->message[1] == 'P' &&
|
|
|
+ rawMessage->message[2] == 'N')
|
|
|
+ {
|
|
|
+ header->MessageType = TL_OPN;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'C' &&
|
|
|
+ rawMessage->message[1] == 'L' &&
|
|
|
+ rawMessage->message[2] == 'O')
|
|
|
+ {
|
|
|
+ header->MessageType = TL_CLO;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'M' &&
|
|
|
+ rawMessage->message[1] == 'S' &&
|
|
|
+ rawMessage->message[2] == 'G')
|
|
|
+ {
|
|
|
+ header->MessageType = TL_MSG;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //TODO ERROR no valid message received
|
|
|
+ }
|
|
|
+
|
|
|
+ pos = pos + TL_MESSAGE_TYPE_LEN;
|
|
|
+ header->Reserved = convertToByte(rawMessage,pos);
|
|
|
+ pos = pos + TL_RESERVED_LEN;
|
|
|
+ header->MessageSize = convertToUInt32(rawMessage,pos);
|
|
|
+
|
|
|
+}
|
|
|
+Int32 TL_getPacketType(AD_RawMessage *rawMessage)
|
|
|
+{
|
|
|
+ if(rawMessage->message[0] == 'H' &&
|
|
|
+ rawMessage->message[1] == 'E' &&
|
|
|
+ rawMessage->message[2] == 'L')
|
|
|
+ {
|
|
|
+ return packetType_HEL;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'A' &&
|
|
|
+ rawMessage->message[1] == 'C' &&
|
|
|
+ rawMessage->message[2] == 'K')
|
|
|
+ {
|
|
|
+ return packetType_ACK;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'E' &&
|
|
|
+ rawMessage->message[1] == 'R' &&
|
|
|
+ rawMessage->message[2] == 'R')
|
|
|
+ {
|
|
|
+ return packetType_ERR;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'O' &&
|
|
|
+ rawMessage->message[1] == 'P' &&
|
|
|
+ rawMessage->message[2] == 'N')
|
|
|
+ {
|
|
|
+ return packetType_OPN;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'C' &&
|
|
|
+ rawMessage->message[1] == 'L' &&
|
|
|
+ rawMessage->message[2] == 'O')
|
|
|
+ {
|
|
|
+ return packetType_CLO;
|
|
|
+ }
|
|
|
+ else if(rawMessage->message[0] == 'M' &&
|
|
|
+ rawMessage->message[1] == 'S' &&
|
|
|
+ rawMessage->message[2] == 'G')
|
|
|
+ {
|
|
|
+ return packetType_MSG;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ 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.clientBuffers.protocolVersion == 0 &&
|
|
|
+ con.transportLayer.clientBuffers.recvBufferSize == 65536 &&
|
|
|
+ con.transportLayer.clientBuffers.sendBufferSize == 65536 &&
|
|
|
+ con.transportLayer.clientBuffers.maxMessageSize == 16777216 &&
|
|
|
+ con.transportLayer.clientBuffers.maxChunkCount == 5000)
|
|
|
+ {
|
|
|
+ printf(" - passed \n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf(" - failed \n");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
}
|
|
|
/*
|
|
|
* gets the TL_messageBody
|
|
|
*/
|
|
|
-void TL_getHELMessage(char *message, struct TL_messageBodyHEL *HELmessage, struct TL_header *messageHeader)
|
|
|
+void TL_processHELMessage(UA_connection *connection, AD_RawMessage *rawMessage)
|
|
|
{
|
|
|
- UInt32 pos = HEADER_LENGTH;
|
|
|
- HELmessage->ProtocolVersion = convertToUInt32(message[pos]);
|
|
|
+ UInt32 pos = TL_HEADER_LENGTH;
|
|
|
+ struct TL_header tmpHeader;
|
|
|
+
|
|
|
+ connection->transportLayer.clientBuffers.protocolVersion =
|
|
|
+ convertToUInt32(rawMessage,pos);
|
|
|
pos = pos + sizeof(UInt32);
|
|
|
- HELmessage->ReceiveBufferSize = convertToUInt32(message[pos]);
|
|
|
+
|
|
|
+ connection->transportLayer.clientBuffers.recvBufferSize =
|
|
|
+ convertToUInt32(rawMessage,pos);
|
|
|
pos = pos + sizeof(UInt32);
|
|
|
- HELmessage->SendBufferSize = convertToUInt32(message[pos]);
|
|
|
+
|
|
|
+ connection->transportLayer.clientBuffers.sendBufferSize =
|
|
|
+ convertToUInt32(rawMessage,pos);
|
|
|
pos = pos + sizeof(UInt32);
|
|
|
- HELmessage->MaxMessageSize = convertToUInt32(message[pos]);
|
|
|
+ connection->transportLayer.clientBuffers.maxMessageSize =
|
|
|
+ convertToUInt32(rawMessage,pos);
|
|
|
pos = pos + sizeof(UInt32);
|
|
|
- HELmessage->MaxChunkCount = convertToUInt32(message[pos]);
|
|
|
+
|
|
|
+ connection->transportLayer.clientBuffers.maxChunkCount =
|
|
|
+ convertToUInt32(rawMessage,pos);
|
|
|
pos = pos + sizeof(UInt32);
|
|
|
|
|
|
- HELmessage->EndpointUrl.Data = message[pos];
|
|
|
- HELmessage->EndpointUrl.Length = messageHeader->MessageSize - pos;
|
|
|
+ connection->transportLayer.endpointURL.Data = (rawMessage->message[pos]);
|
|
|
+ connection->transportLayer.endpointURL.Length = tmpHeader.MessageSize - pos;
|
|
|
}
|
|
|
/*
|
|
|
- * repond to client request
|
|
|
+ * respond to client request
|
|
|
*/
|
|
|
-void TL_buildACKMessage(char *message, struct TL_messageBodyHEL *ACKmessage, struct TL_header *messageHeader)
|
|
|
-{
|
|
|
|
|
|
+
|
|
|
+TL_send(AD_RawMessage *rawMessage)
|
|
|
+{
|
|
|
+ //call tcp function or callback
|
|
|
}
|
|
|
|
|
|
|