opcua_transportLayer.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /*
  2. * opcua_transportLayer.c
  3. *
  4. * Created on: Dec 19, 2013
  5. * Author: opcua
  6. */
  7. #include "opcua_transportLayer.h"
  8. /*
  9. * server answer to open message
  10. */
  11. void TL_open(UA_connection *connection, AD_RawMessage *rawMessage)
  12. {
  13. UA_connection tmpConnection;
  14. switch(connection->transportLayer.connectionState)
  15. {
  16. connectionState_CLOSED :
  17. {
  18. //process the connection values received by the client
  19. TL_processHELMessage(&tmpConnection,rawMessage);
  20. connection->transportLayer.localConf.protocolVersion = TL_SERVER_PROTOCOL_VERSION;
  21. connection->transportLayer.localConf.recvBufferSize =
  22. tmpConnection.transportLayer.localConf.recvBufferSize;
  23. connection->transportLayer.localConf.sendBufferSize =
  24. tmpConnection.transportLayer.localConf.sendBufferSize;
  25. connection->transportLayer.localConf.maxMessageSize = TL_SERVER_MAX_MESSAGE_SIZE;
  26. connection->transportLayer.localConf.maxChunkCount = TL_SERVER_MAX_CHUNK_COUNT;
  27. TL_sendACK(connection);
  28. connection->transportLayer.connectionState = connectionState_ESTABLISHED;
  29. break;
  30. }
  31. connectionState_OPENING :
  32. {
  33. // TL_sendACK(connection);
  34. // connection->transportLayer.connectionState = connectionState_ESTABLISHED;
  35. break;
  36. }
  37. connectionState_ESTABLISHED :
  38. {
  39. break;
  40. }
  41. }
  42. }
  43. Int32 TL_check(UA_connection *connection, AD_RawMessage *TL_messsage)
  44. {
  45. Int32 position = 4;
  46. UInt32 messageLength = 0;
  47. Int32 pos = 0;
  48. TL_getPacketType(&pos,TL_messsage);
  49. decoder_decodeBuiltInDatatype(TL_messsage->message,UINT32,&position,&messageLength);
  50. if (messageLength == TL_messsage->length &&
  51. messageLength < (connection->transportLayer.localConf.maxMessageSize))
  52. {
  53. return UA_ERROR;
  54. }
  55. return UA_NO_ERROR;
  56. }
  57. Int32 TL_receive(UA_connection *connection, AD_RawMessage *TL_message)
  58. {
  59. UInt32 bufferSize = connection->transportLayer.localConf.recvBufferSize = 8192;
  60. UInt32 length = 0;
  61. Int32 pos = 0;
  62. AD_RawMessage tmpRawMessage;
  63. struct TL_header tmpHeader;
  64. //TODO call socket receive function
  65. tmpRawMessage.message = (char *)opcua_malloc(bufferSize);
  66. tmpRawMessage.length = bufferSize;
  67. if(TL_check(connection,TL_message) == UA_NO_ERROR)
  68. {
  69. Int32 packetType = TL_getPacketType(&pos,TL_message);
  70. switch(packetType)
  71. {
  72. packetType_MSG:
  73. packetType_OPN:
  74. packetType_CLO:
  75. break;
  76. packetType_HEL:
  77. packetType_ACK:
  78. TL_process(connection,TL_message,packetType);
  79. break;
  80. packetType_ERR:
  81. TL_message->length = 0;
  82. TL_message->message = NULL;
  83. //TODO ERROR HANDLING
  84. return UA_ERROR_RCV_ERROR;
  85. break;
  86. }
  87. }
  88. else
  89. {
  90. //length error: send error message to communication partner
  91. //TL_send()
  92. }
  93. return UA_NO_ERROR;
  94. }
  95. /*
  96. * get the message header
  97. */
  98. void TL_getMessageHeader(struct TL_header *header, AD_RawMessage *rawMessage)
  99. {
  100. int pos = 0;
  101. if(rawMessage->message[0] == 'H' &&
  102. rawMessage->message[1] == 'E' &&
  103. rawMessage->message[2] == 'L')
  104. {
  105. header->MessageType = TL_HEL;
  106. }
  107. else if(rawMessage->message[0] == 'A' &&
  108. rawMessage->message[1] == 'C' &&
  109. rawMessage->message[2] == 'K')
  110. {
  111. header->MessageType = TL_ACK;
  112. }
  113. else if(rawMessage->message[0] == 'E' &&
  114. rawMessage->message[1] == 'R' &&
  115. rawMessage->message[2] == 'R')
  116. {
  117. header->MessageType = TL_ERR;
  118. }
  119. else if(rawMessage->message[0] == 'O' &&
  120. rawMessage->message[1] == 'P' &&
  121. rawMessage->message[2] == 'N')
  122. {
  123. header->MessageType = TL_OPN;
  124. }
  125. else if(rawMessage->message[0] == 'C' &&
  126. rawMessage->message[1] == 'L' &&
  127. rawMessage->message[2] == 'O')
  128. {
  129. header->MessageType = TL_CLO;
  130. }
  131. else if(rawMessage->message[0] == 'M' &&
  132. rawMessage->message[1] == 'S' &&
  133. rawMessage->message[2] == 'G')
  134. {
  135. header->MessageType = TL_MSG;
  136. }
  137. else
  138. {
  139. //TODO ERROR no valid message received
  140. }
  141. pos = pos + TL_MESSAGE_TYPE_LEN;
  142. decoder_decodeBuiltInDatatype(rawMessage->message,BYTE,&pos,&(header->Reserved));
  143. decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,&(header->MessageSize));
  144. }
  145. Int32 TL_getPacketType(Int32 *pos,AD_RawMessage *rawMessage)
  146. {
  147. if(rawMessage->message[*pos] == 'H' &&
  148. rawMessage->message[*pos+1] == 'E' &&
  149. rawMessage->message[*pos+2] == 'L')
  150. {
  151. return packetType_HEL;
  152. }
  153. else if(rawMessage->message[*pos] == 'A' &&
  154. rawMessage->message[*pos+1] == 'C' &&
  155. rawMessage->message[*pos+2] == 'K')
  156. {
  157. return packetType_ACK;
  158. }
  159. else if(rawMessage->message[*pos] == 'E' &&
  160. rawMessage->message[*pos+1] == 'R' &&
  161. rawMessage->message[*pos+2] == 'R')
  162. {
  163. return packetType_ERR;
  164. }
  165. else if(rawMessage->message[*pos] == 'O' &&
  166. rawMessage->message[*pos+1] == 'P' &&
  167. rawMessage->message[*pos+2] == 'N')
  168. {
  169. return packetType_OPN;
  170. }
  171. else if(rawMessage->message[*pos] == 'C' &&
  172. rawMessage->message[*pos+1] == 'L' &&
  173. rawMessage->message[*pos+2] == 'O')
  174. {
  175. return packetType_CLO;
  176. }
  177. else if(rawMessage->message[*pos] == 'M' &&
  178. rawMessage->message[*pos+1] == 'S' &&
  179. rawMessage->message[*pos+2] == 'G')
  180. {
  181. return packetType_MSG;
  182. }
  183. else
  184. {
  185. return -1;//TODO ERROR no valid message received
  186. }
  187. }
  188. Int32 TL_process(UA_connection *connection,Int32 packetType, Int32 *pos, AD_RawMessage *rawMessage)
  189. {
  190. struct TL_header tmpHeader;
  191. switch(packetType)
  192. {
  193. packetType_HEL :
  194. if(connection->transportLayer.connectionState == connectionState_CLOSED)
  195. {
  196. decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
  197. (void*)(&(connection->transportLayer.remoteConf.protocolVersion)));
  198. decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
  199. (void*)(&(connection->transportLayer.remoteConf.recvBufferSize)));
  200. decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
  201. (void*)(&(connection->transportLayer.remoteConf.sendBufferSize)));
  202. decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
  203. (void*)(&(connection->transportLayer.remoteConf.maxMessageSize)));
  204. decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
  205. (void*)(&(connection->transportLayer.remoteConf.maxChunkCount)));
  206. decoder_decodeBuiltInDatatype(rawMessage->message,STRING,&pos,
  207. (void*)(&(connection->transportLayer.endpointURL)));
  208. }
  209. else
  210. {
  211. return UA_ERROR_MULTIPLY_HEL;
  212. }
  213. }
  214. return UA_NO_ERROR;
  215. }
  216. /*
  217. * respond to client request
  218. */
  219. TL_send(AD_RawMessage *rawMessage)
  220. {
  221. //call tcp function or callback
  222. }