opcua_transportLayer.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /*
  2. * opcua_transportLayer.c
  3. *
  4. * Created on: Dec 19, 2013
  5. * Author: opcua
  6. */
  7. #include "opcua_transportLayer.h"
  8. /*
  9. * send acknowledge to the client
  10. */
  11. void TL_sendACK(UA_connection *connection)
  12. {
  13. //get memory for message
  14. //
  15. //build message
  16. //connection->transportLayer.serverBuffers.maxChunkCount;
  17. //call send function
  18. }
  19. /*
  20. * server answer to open message
  21. */
  22. void TL_open(UA_connection *connection, AD_RawMessage *rawMessage)
  23. {
  24. UA_connection tmpConnection;
  25. switch(connection->transportLayer.connectionState)
  26. {
  27. connectionState_CLOSED :
  28. {
  29. //process the connection values received by the client
  30. TL_processHELMessage(&tmpConnection,rawMessage);
  31. connection->transportLayer.serverBuffers.protocolVersion = TL_SERVER_PROTOCOL_VERSION;
  32. connection->transportLayer.serverBuffers.recvBufferSize =
  33. tmpConnection.transportLayer.serverBuffers.recvBufferSize;
  34. connection->transportLayer.serverBuffers.sendBufferSize =
  35. tmpConnection.transportLayer.serverBuffers.sendBufferSize;
  36. connection->transportLayer.serverBuffers.maxMessageSize = TL_SERVER_MAX_MESSAGE_SIZE;
  37. connection->transportLayer.serverBuffers.maxChunkCount = TL_SERVER_MAX_CHUNK_COUNT;
  38. TL_sendACK(connection);
  39. connection->transportLayer.connectionState = connectionState_ESTABLISHED;
  40. break;
  41. }
  42. connectionState_OPENING :
  43. {
  44. // TL_sendACK(connection);
  45. // connection->transportLayer.connectionState = connectionState_ESTABLISHED;
  46. break;
  47. }
  48. connectionState_ESTABLISHED :
  49. {
  50. break;
  51. }
  52. }
  53. }
  54. void TL_receive(UA_connection *connection, AD_RawMessage *TL_message)
  55. {
  56. UInt32 bufferSize = connection->transportLayer.serverBuffers.recvBufferSize = 8192;
  57. UInt32 length = 0;
  58. AD_RawMessage tmpRawMessage;
  59. struct TL_header tmpHeader;
  60. //allocate memory for the message
  61. //TODO filter double Hello Messages -> generate error message as response
  62. //TODO build a file which handles the memory allocation
  63. tmpRawMessage.message = (char *)malloc(bufferSize);
  64. if (tmpRawMessage.message != NULL)
  65. {
  66. //length = tcp_recv(connection, tmpRawMessage.message, bufferSize);
  67. }
  68. tmpRawMessage.length = length;
  69. if(tmpRawMessage.length > 0)
  70. {
  71. switch(TL_getPacketType(tmpRawMessage))
  72. {
  73. packetType_MSG:
  74. packetType_OPN:
  75. packetType_CLO:
  76. TL_message->length = tmpRawMessage.length;
  77. TL_message->message = tmpRawMessage.message;
  78. break;
  79. packetType_HEL:
  80. TL_message->length = 0;
  81. TL_message->message = NULL;
  82. TL_open(connection, &tmpRawMessage);
  83. break;
  84. packetType_ACK:
  85. TL_message->length = 0;
  86. TL_message->message = NULL;
  87. break;
  88. packetType_ERR:
  89. TL_message->length = 0;
  90. TL_message->message = NULL;
  91. //TODO ERROR HANDLING
  92. break;
  93. //TODO ERROR HANDLING
  94. }
  95. //check in which state the connection is
  96. }
  97. }
  98. void TL_getMessageHeader_test()
  99. {
  100. 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};
  101. AD_RawMessage rawMessage;
  102. rawMessage.message = data;
  103. rawMessage.length = 86;
  104. struct TL_messageBodyHEL HELmessage;
  105. struct TL_header header;
  106. printf("TL_getMessageHeader_test");
  107. TL_getMessageHeader(&header, &rawMessage);
  108. if(header.MessageSize == 86 &&
  109. header.MessageType == TL_HEL &&
  110. header.Reserved == 0x46)
  111. {
  112. printf(" - passed \n");
  113. }
  114. else
  115. {
  116. printf(" - failed \n");
  117. }
  118. }
  119. /*
  120. * get the message header
  121. */
  122. void TL_getMessageHeader(struct TL_header *header, AD_RawMessage *rawMessage)
  123. {
  124. int pos = 0;
  125. if(rawMessage->message[0] == 'H' &&
  126. rawMessage->message[1] == 'E' &&
  127. rawMessage->message[2] == 'L')
  128. {
  129. header->MessageType = TL_HEL;
  130. }
  131. else if(rawMessage->message[0] == 'A' &&
  132. rawMessage->message[1] == 'C' &&
  133. rawMessage->message[2] == 'K')
  134. {
  135. header->MessageType = TL_ACK;
  136. }
  137. else if(rawMessage->message[0] == 'E' &&
  138. rawMessage->message[1] == 'R' &&
  139. rawMessage->message[2] == 'R')
  140. {
  141. header->MessageType = TL_ERR;
  142. }
  143. else if(rawMessage->message[0] == 'O' &&
  144. rawMessage->message[1] == 'P' &&
  145. rawMessage->message[2] == 'N')
  146. {
  147. header->MessageType = TL_OPN;
  148. }
  149. else if(rawMessage->message[0] == 'C' &&
  150. rawMessage->message[1] == 'L' &&
  151. rawMessage->message[2] == 'O')
  152. {
  153. header->MessageType = TL_CLO;
  154. }
  155. else if(rawMessage->message[0] == 'M' &&
  156. rawMessage->message[1] == 'S' &&
  157. rawMessage->message[2] == 'G')
  158. {
  159. header->MessageType = TL_MSG;
  160. }
  161. else
  162. {
  163. //TODO ERROR no valid message received
  164. }
  165. pos = pos + TL_MESSAGE_TYPE_LEN;
  166. header->Reserved = convertToByte(rawMessage,pos);
  167. pos = pos + TL_RESERVED_LEN;
  168. header->MessageSize = convertToUInt32(rawMessage,pos);
  169. }
  170. Int32 TL_getPacketType(AD_RawMessage *rawMessage)
  171. {
  172. if(rawMessage->message[0] == 'H' &&
  173. rawMessage->message[1] == 'E' &&
  174. rawMessage->message[2] == 'L')
  175. {
  176. return packetType_HEL;
  177. }
  178. else if(rawMessage->message[0] == 'A' &&
  179. rawMessage->message[1] == 'C' &&
  180. rawMessage->message[2] == 'K')
  181. {
  182. return packetType_ACK;
  183. }
  184. else if(rawMessage->message[0] == 'E' &&
  185. rawMessage->message[1] == 'R' &&
  186. rawMessage->message[2] == 'R')
  187. {
  188. return packetType_ERR;
  189. }
  190. else if(rawMessage->message[0] == 'O' &&
  191. rawMessage->message[1] == 'P' &&
  192. rawMessage->message[2] == 'N')
  193. {
  194. return packetType_OPN;
  195. }
  196. else if(rawMessage->message[0] == 'C' &&
  197. rawMessage->message[1] == 'L' &&
  198. rawMessage->message[2] == 'O')
  199. {
  200. return packetType_CLO;
  201. }
  202. else if(rawMessage->message[0] == 'M' &&
  203. rawMessage->message[1] == 'S' &&
  204. rawMessage->message[2] == 'G')
  205. {
  206. return packetType_MSG;
  207. }
  208. else
  209. {
  210. return -1;//TODO ERROR no valid message received
  211. }
  212. }
  213. void TL_processHELMessage_test()
  214. {
  215. 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};
  216. UA_connection con;
  217. AD_RawMessage rawMessage;
  218. rawMessage.message = data;
  219. rawMessage.length = 86;
  220. struct TL_messageBodyHEL HELmessage;
  221. struct TL_header header;
  222. printf("TL_getHELMessage_test");
  223. header.MessageSize = 86;
  224. header.MessageType = TL_HEL; // HEL message
  225. header.Reserved = 0x46; // F
  226. TL_processHELMessage(&con, &rawMessage);
  227. if(con.transportLayer.clientBuffers.protocolVersion == 0 &&
  228. con.transportLayer.clientBuffers.recvBufferSize == 65536 &&
  229. con.transportLayer.clientBuffers.sendBufferSize == 65536 &&
  230. con.transportLayer.clientBuffers.maxMessageSize == 16777216 &&
  231. con.transportLayer.clientBuffers.maxChunkCount == 5000)
  232. {
  233. printf(" - passed \n");
  234. }
  235. else
  236. {
  237. printf(" - failed \n");
  238. }
  239. }
  240. /*
  241. * gets the TL_messageBody
  242. */
  243. void TL_processHELMessage(UA_connection *connection, AD_RawMessage *rawMessage)
  244. {
  245. UInt32 pos = TL_HEADER_LENGTH;
  246. struct TL_header tmpHeader;
  247. connection->transportLayer.clientBuffers.protocolVersion =
  248. convertToUInt32(rawMessage,pos);
  249. pos = pos + sizeof(UInt32);
  250. connection->transportLayer.clientBuffers.recvBufferSize =
  251. convertToUInt32(rawMessage,pos);
  252. pos = pos + sizeof(UInt32);
  253. connection->transportLayer.clientBuffers.sendBufferSize =
  254. convertToUInt32(rawMessage,pos);
  255. pos = pos + sizeof(UInt32);
  256. connection->transportLayer.clientBuffers.maxMessageSize =
  257. convertToUInt32(rawMessage,pos);
  258. pos = pos + sizeof(UInt32);
  259. connection->transportLayer.clientBuffers.maxChunkCount =
  260. convertToUInt32(rawMessage,pos);
  261. pos = pos + sizeof(UInt32);
  262. connection->transportLayer.endpointURL.Data = (rawMessage->message[pos]);
  263. connection->transportLayer.endpointURL.Length = tmpHeader.MessageSize - pos;
  264. }
  265. /*
  266. * respond to client request
  267. */
  268. TL_send(AD_RawMessage *rawMessage)
  269. {
  270. //call tcp function or callback
  271. }