Browse Source

split the MessageTypeAndFinal type, cherry-picked from chunking_callback

Julius Pfrommer 8 years ago
parent
commit
999bdef64a

+ 1 - 0
examples/client.c

@@ -38,6 +38,7 @@ int main(int argc, char *argv[]) {
     //listing endpoints
     UA_EndpointDescription* endpointArray = NULL;
     size_t endpointArraySize = 0;
+
     UA_StatusCode retval =
         UA_Client_getEndpoints(client, "opc.tcp://localhost:16664",
                                &endpointArraySize, &endpointArray);

+ 1 - 1
examples/client_stateless.c

@@ -86,7 +86,7 @@ int main(int argc , char *argv[]) {
 			UA_ReadRequest_calcSizeBinary(&req);**/
 
 	UA_TcpMessageHeader_init(&reqTcpHeader);
-	reqTcpHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_MSGF;
+	reqTcpHeader.messageTypeAndChunkType = UA_MESSAGETYPE_MSG + UA_CHUNKTYPE_FINAL;
 
 	UA_TcpMessageHeader_encodeBinary(&reqTcpHeader, &message, &messagepos);
 	UA_UInt32_encodeBinary(&reqSecureChannelId, &message, &messagepos);

+ 7 - 5
src/client/ua_client.c

@@ -101,7 +101,7 @@ UA_ClientState UA_EXPORT UA_Client_getState(UA_Client *client) {
 
 static UA_StatusCode HelAckHandshake(UA_Client *client) {
     UA_TcpMessageHeader messageHeader;
-    messageHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_HELF;
+    messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL;
 
     UA_TcpHelloMessage hello;
     UA_String_copy(&client->endpointUrl, &hello.endpointUrl); /* must be less than 4096 bytes */
@@ -184,11 +184,12 @@ static UA_StatusCode SecureChannelHandshake(UA_Client *client, UA_Boolean renew)
         return UA_STATUSCODE_BADSERVERNOTCONNECTED;
 
     UA_SecureConversationMessageHeader messageHeader;
-    messageHeader.messageHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_OPNF;
-    if(renew)
+    messageHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL;
+    if(renew){
         messageHeader.secureChannelId = client->channel.securityToken.channelId;
-    else
+    }else{
         messageHeader.secureChannelId = 0;
+    }
 
     UA_SequenceHeader seqHeader;
     seqHeader.sequenceNumber = ++client->channel.sequenceNumber;
@@ -488,7 +489,7 @@ static UA_StatusCode CloseSecureChannel(UA_Client *client) {
     request.requestHeader.authenticationToken = client->authenticationToken;
 
     UA_SecureConversationMessageHeader msgHeader;
-    msgHeader.messageHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_CLOF;
+    msgHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_CLO + UA_CHUNKTYPE_FINAL;
     msgHeader.secureChannelId = client->channel.securityToken.channelId;
 
     UA_SymmetricAlgorithmSecurityHeader symHeader;
@@ -535,6 +536,7 @@ UA_Client_getEndpoints(UA_Client *client, const char *serverUrl,
     if(client->state == UA_CLIENTSTATE_ERRORED)
         UA_Client_reset(client);
 
+
     UA_StatusCode retval = UA_STATUSCODE_GOOD;
     client->connection = client->config.connectionFunc(UA_ConnectionConfig_standard, serverUrl, client->config.logger);
     if(client->connection.state != UA_CONNECTION_OPENING) {

+ 16 - 19
src/server/ua_server_binary.c

@@ -20,12 +20,12 @@ static void processHEL(UA_Connection *connection, const UA_ByteString *msg, size
     connection->remoteConf.maxChunkCount = helloMessage.maxChunkCount;
     connection->remoteConf.maxMessageSize = helloMessage.maxMessageSize;
     connection->remoteConf.protocolVersion = helloMessage.protocolVersion;
-    if(connection->remoteConf.recvBufferSize > helloMessage.receiveBufferSize)
-        connection->remoteConf.recvBufferSize = helloMessage.receiveBufferSize;
-    if(connection->remoteConf.sendBufferSize > helloMessage.sendBufferSize)
-        connection->remoteConf.sendBufferSize = helloMessage.sendBufferSize;
+    connection->remoteConf.recvBufferSize = helloMessage.receiveBufferSize;
     if(connection->localConf.sendBufferSize > helloMessage.receiveBufferSize)
         connection->localConf.sendBufferSize = helloMessage.receiveBufferSize;
+    if(connection->localConf.recvBufferSize > helloMessage.sendBufferSize)
+        connection->localConf.recvBufferSize = helloMessage.sendBufferSize;
+    connection->remoteConf.sendBufferSize = helloMessage.sendBufferSize;
     connection->state = UA_CONNECTION_ESTABLISHED;
     UA_TcpHelloMessage_deleteMembers(&helloMessage);
 
@@ -38,11 +38,12 @@ static void processHEL(UA_Connection *connection, const UA_ByteString *msg, size
     ackMessage.maxChunkCount = connection->localConf.maxChunkCount;
 
     UA_TcpMessageHeader ackHeader;
-    ackHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_ACKF;
-    ackHeader.messageSize =  8 + 20; /* ackHeader + ackMessage */
+    ackHeader.messageTypeAndChunkType = UA_MESSAGETYPE_ACK + UA_CHUNKTYPE_FINAL;
+    ackHeader.messageSize = 8 + 20; /* ackHeader + ackMessage */
 
     UA_ByteString ack_msg;
-    if(connection->getSendBuffer(connection, connection->remoteConf.recvBufferSize,
+    UA_ByteString_init(&ack_msg);
+    if(connection->getSendBuffer(connection, connection->localConf.sendBufferSize,
                                  &ack_msg) != UA_STATUSCODE_GOOD)
         return;
 
@@ -115,7 +116,7 @@ static void processOPN(UA_Connection *connection, UA_Server *server, const UA_By
 #endif
 
     UA_SecureConversationMessageHeader respHeader;
-    respHeader.messageHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_OPNF;
+    respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL;
     respHeader.messageHeader.messageSize = 0;
     respHeader.secureChannelId = p.securityToken.channelId;
 
@@ -123,7 +124,8 @@ static void processOPN(UA_Connection *connection, UA_Server *server, const UA_By
                                                UA_ENCODINGOFFSET_BINARY);
 
     UA_ByteString resp_msg;
-    retval = connection->getSendBuffer(connection, connection->remoteConf.recvBufferSize, &resp_msg);
+    UA_ByteString_init(&resp_msg);
+    retval = connection->getSendBuffer(connection, connection->localConf.sendBufferSize, &resp_msg);
     if(retval != UA_STATUSCODE_GOOD) {
         UA_OpenSecureChannelResponse_deleteMembers(&p);
         UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
@@ -146,7 +148,6 @@ static void processOPN(UA_Connection *connection, UA_Server *server, const UA_By
         resp_msg.length = respHeader.messageHeader.messageSize;
         connection->send(connection, &resp_msg);
     }
-
     UA_OpenSecureChannelResponse_deleteMembers(&p);
     UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
 }
@@ -625,18 +626,16 @@ void UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection
         }
 
         size_t targetpos = pos - 8 + tcpMessageHeader.messageSize;
-        switch(tcpMessageHeader.messageTypeAndFinal & 0xffffff) {
-        case UA_MESSAGETYPEANDFINAL_HELF & 0xffffff:
+        switch(tcpMessageHeader.messageTypeAndChunkType & 0x00ffffff) {
+        case UA_MESSAGETYPE_HEL:
             UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_NETWORK,
                          "Process a HEL on Connection %i", connection->sockfd);
             processHEL(connection, msg, &pos);
             break;
-        case UA_MESSAGETYPEANDFINAL_OPNF & 0xffffff:
-            UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_NETWORK,
-                         "Process a OPN on Connection %i", connection->sockfd);
+        case UA_MESSAGETYPE_OPN:
             processOPN(connection, server, msg, &pos);
             break;
-        case UA_MESSAGETYPEANDFINAL_MSGF & 0xffffff:
+        case UA_MESSAGETYPE_MSG:
 #ifndef UA_ENABLE_NONSTANDARD_STATELESS
             if(connection->state != UA_CONNECTION_ESTABLISHED) {
                 UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_NETWORK,
@@ -650,9 +649,7 @@ void UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection
                          "Process a MSG on Connection %i", connection->sockfd);
             processMSG(connection, server, msg, &pos);
             break;
-        case UA_MESSAGETYPEANDFINAL_CLOF & 0xffffff:
-            UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_NETWORK,
-                         "Process a CLO on Connection %i", connection->sockfd);
+        case UA_MESSAGETYPE_CLO:
             processCLO(connection, server, msg, &pos);
             connection->close(connection);
             return;

+ 2 - 2
src/ua_connection.c

@@ -6,8 +6,8 @@
 
 // max message size is 64k
 const UA_ConnectionConfig UA_ConnectionConfig_standard =
-    {.protocolVersion = 0, .sendBufferSize = 65536, .recvBufferSize  = 65536,
-     .maxMessageSize = 65536, .maxChunkCount   = 1};
+    {.protocolVersion = 0, .sendBufferSize = 65536, .recvBufferSize = 65536,
+     .maxMessageSize = 65536, .maxChunkCount = 1};
 
 void UA_Connection_init(UA_Connection *connection) {
     connection->state = UA_CONNECTION_CLOSED;

+ 1 - 1
src/ua_securechannel.c

@@ -135,7 +135,7 @@ UA_StatusCode UA_SecureChannel_sendBinaryMessage(UA_SecureChannel *channel, UA_U
     typeId.identifier.numeric += UA_ENCODINGOFFSET_BINARY;
 
     UA_SecureConversationMessageHeader respHeader;
-    respHeader.messageHeader.messageTypeAndFinal = UA_MESSAGETYPEANDFINAL_MSGF;
+    respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_MSG + UA_CHUNKTYPE_FINAL;
     respHeader.messageHeader.messageSize = 0;
     respHeader.secureChannelId = channel->securityToken.channelId;
 

+ 1 - 1
src/ua_util.h

@@ -64,7 +64,7 @@
 /********************/
 
 #ifdef _WIN32
-# include <winsock2.h> //needed for amalgation
+# include <winsock2.h> //needed for amalgamation
 # include <windows.h>
 # undef SLIST_ENTRY
 #endif

+ 16 - 8
tools/schema/Custom.Opc.Ua.Transport.bsd

@@ -11,18 +11,26 @@
 
 <!-- Transport types begin  -->
 
-  <opc:EnumeratedType Name="MessageTypeAndFinal" LengthInBits="32">
-    <opc:Documentation>Message Type and whether the message contains the final chunk</opc:Documentation>
-    <opc:EnumeratedValue Name="ACKF" Value="1179337537" />
-    <opc:EnumeratedValue Name="CLOF" Value="1179601987" />
-    <opc:EnumeratedValue Name="HELF" Value="1179403592" />
-    <opc:EnumeratedValue Name="MSGF" Value="1179079501" />
-    <opc:EnumeratedValue Name="OPNF" Value="1179537487" />
+  <opc:EnumeratedType Name="MessageType" LengthInBits="32">
+    <opc:Documentation>Message Type and whether the message contains an intermediate chunk</opc:Documentation>
+    <opc:EnumeratedValue Name="ACK" Value="0x4B4341" />
+    <opc:EnumeratedValue Name="HEL" Value="0x4C4548" />
+    <opc:EnumeratedValue Name="MSG" Value="0x47534D" />
+    <opc:EnumeratedValue Name="OPN" Value="0x4E504F" />
+    <opc:EnumeratedValue Name="CLO" Value="0x4F4C43" />
+  </opc:EnumeratedType>
+  
+  <opc:EnumeratedType Name="ChunkType" LengthInBits="32">
+    <opc:Documentation>Type of the chunk</opc:Documentation>
+    <opc:EnumeratedValue Name="FINAL" Value="0x46000000" />
+    <opc:EnumeratedValue Name="INTERMEDIATE" Value="0x43000000" />
+    <opc:EnumeratedValue Name="ABORT" Value="0x41000000" />
+
   </opc:EnumeratedType>
 
    <opc:StructuredType Name="TcpMessageHeader">
     <opc:Documentation>TCP Header</opc:Documentation>
-    <opc:Field Name="MessageTypeAndFinal" TypeName="opc:UInt32" />
+    <opc:Field Name="MessageTypeAndChunkType" TypeName="opc:UInt32" />
     <opc:Field Name="MessageSize" TypeName="opc:UInt32" />
   </opc:StructuredType>
   

+ 2 - 1
tools/schema/datatypes_transport.txt

@@ -1,4 +1,5 @@
-MessageTypeAndFinal
+MessageType
+ChunkType
 TcpMessageHeader
 TcpHelloMessage
 TcpAcknowledgeMessage