|
@@ -7,7 +7,7 @@
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
#include <memory.h> // memcpy
|
|
#include <memory.h> // memcpy
|
|
#include "opcua_transportLayer.h"
|
|
#include "opcua_transportLayer.h"
|
|
-#include "opcua_secureChannelLayer.h"
|
|
|
|
|
|
+#include "opcua_secureLayer.h"
|
|
|
|
|
|
#define SIZE_SECURECHANNEL_HEADER 12
|
|
#define SIZE_SECURECHANNEL_HEADER 12
|
|
#define SIZE_SEQHEADER_HEADER 8
|
|
#define SIZE_SEQHEADER_HEADER 8
|
|
@@ -470,7 +470,6 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
|
|
UA_SecureConversationMessageHeader secureConvHeader;
|
|
UA_SecureConversationMessageHeader secureConvHeader;
|
|
UA_AsymmetricAlgorithmSecurityHeader asymAlgSecHeader;
|
|
UA_AsymmetricAlgorithmSecurityHeader asymAlgSecHeader;
|
|
UA_SequenceHeader sequenceHeader;
|
|
UA_SequenceHeader sequenceHeader;
|
|
- UA_Int32 packetType = 0;
|
|
|
|
UA_Int32 pos = 0;
|
|
UA_Int32 pos = 0;
|
|
UA_Int32 iTmp;
|
|
UA_Int32 iTmp;
|
|
//TODO Error Handling, length checking
|
|
//TODO Error Handling, length checking
|
|
@@ -482,13 +481,13 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
|
|
if (secureChannelPacket.length > 0 && secureChannelPacket.data != NULL) {
|
|
if (secureChannelPacket.length > 0 && secureChannelPacket.data != NULL) {
|
|
|
|
|
|
printf("SL_receive - data received \n");
|
|
printf("SL_receive - data received \n");
|
|
- packetType = TL_getPacketType(&secureChannelPacket, &pos);
|
|
|
|
|
|
+ //packetType = TL_getPacketType(&secureChannelPacket, &pos);
|
|
|
|
|
|
UA_SecureConversationMessageHeader_decode(secureChannelPacket.data, &pos, &secureConvHeader);
|
|
UA_SecureConversationMessageHeader_decode(secureChannelPacket.data, &pos, &secureConvHeader);
|
|
|
|
|
|
- switch (secureConvHeader.messageType) {
|
|
|
|
|
|
+ switch (secureConvHeader.tcpMessageHeader->messageType) {
|
|
|
|
|
|
- case packetType_OPN: /* openSecureChannel Message received */
|
|
|
|
|
|
+ case UA_MESSAGETYPE_OPN: /* openSecureChannel Message received */
|
|
UA_AsymmetricAlgorithmSecurityHeader_encode(secureChannelPacket.data, &pos, &asymAlgSecHeader);
|
|
UA_AsymmetricAlgorithmSecurityHeader_encode(secureChannelPacket.data, &pos, &asymAlgSecHeader);
|
|
UA_ByteString_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
|
|
UA_ByteString_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
|
|
&(asymAlgSecHeader.receiverCertificateThumbprint));
|
|
&(asymAlgSecHeader.receiverCertificateThumbprint));
|
|
@@ -531,7 +530,7 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
|
|
SL_processMessage(connection, message);
|
|
SL_processMessage(connection, message);
|
|
|
|
|
|
break;
|
|
break;
|
|
- case packetType_MSG: /* secure Channel Message received */
|
|
|
|
|
|
+ case UA_MESSAGETYPE_MSG: /* secure Channel Message received */
|
|
if (connection->secureLayer.connectionState
|
|
if (connection->secureLayer.connectionState
|
|
== connectionState_ESTABLISHED) {
|
|
== connectionState_ESTABLISHED) {
|
|
|
|
|
|
@@ -544,7 +543,7 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
|
|
}
|
|
}
|
|
|
|
|
|
break;
|
|
break;
|
|
- case packetType_CLO: /* closeSecureChannel Message received */
|
|
|
|
|
|
+ case UA_MESSAGETYPE_CLO: /* closeSecureChannel Message received */
|
|
if (SL_check(connection, secureChannelPacket) == UA_NO_ERROR) {
|
|
if (SL_check(connection, secureChannelPacket) == UA_NO_ERROR) {
|
|
|
|
|
|
}
|
|
}
|
|
@@ -616,276 +615,3 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-UA_Int32 UA_OPCUATcpMessageHeader_calcSize(UA_OPCUATcpMessageHeader const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // messageType
|
|
|
|
- + sizeof(UA_Byte) // isFinal
|
|
|
|
- + sizeof(UA_UInt32) // messageSize
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpMessageHeader_encode(UA_OPCUATcpMessageHeader const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->messageType),pos,dst);
|
|
|
|
- retval |= UA_Byte_encode(&(src->isFinal),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->messageSize),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpMessageHeader_decode(char const * src, UA_Int32* pos, UA_OPCUATcpMessageHeader* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->messageType));
|
|
|
|
- retval |= UA_Byte_decode(src,pos,&(dst->isFinal));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->messageSize));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpHelloMessage_calcSize(UA_OPCUATcpHelloMessage const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // protocolVersion
|
|
|
|
- + sizeof(UA_UInt32) // receiveBufferSize
|
|
|
|
- + sizeof(UA_UInt32) // sendBufferSize
|
|
|
|
- + sizeof(UA_UInt32) // maxMessageSize
|
|
|
|
- + sizeof(UA_UInt32) // maxChunkCount
|
|
|
|
- + UA_String_calcSize(&(ptr->endpointUrl))
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpHelloMessage_encode(UA_OPCUATcpHelloMessage const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->protocolVersion),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->receiveBufferSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->sendBufferSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->maxMessageSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->maxChunkCount),pos,dst);
|
|
|
|
- retval |= UA_String_encode(&(src->endpointUrl),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpHelloMessage_decode(char const * src, UA_Int32* pos, UA_OPCUATcpHelloMessage* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->protocolVersion));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->receiveBufferSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->sendBufferSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->maxMessageSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->maxChunkCount));
|
|
|
|
- retval |= UA_String_decode(src,pos,&(dst->endpointUrl));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpAcknowledgeMessage_calcSize(UA_OPCUATcpAcknowledgeMessage const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // protocolVersion
|
|
|
|
- + sizeof(UA_UInt32) // receiveBufferSize
|
|
|
|
- + sizeof(UA_UInt32) // sendBufferSize
|
|
|
|
- + sizeof(UA_UInt32) // maxMessageSize
|
|
|
|
- + sizeof(UA_UInt32) // maxChunkCount
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpAcknowledgeMessage_encode(UA_OPCUATcpAcknowledgeMessage const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->protocolVersion),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->receiveBufferSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->sendBufferSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->maxMessageSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->maxChunkCount),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_OPCUATcpAcknowledgeMessage_decode(char const * src, UA_Int32* pos, UA_OPCUATcpAcknowledgeMessage* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->protocolVersion));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->receiveBufferSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->sendBufferSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->maxMessageSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->maxChunkCount));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageHeader_calcSize(UA_SecureConversationMessageHeader const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // messageType
|
|
|
|
- + sizeof(UA_Byte) // isFinal
|
|
|
|
- + sizeof(UA_UInt32) // messageSize
|
|
|
|
- + sizeof(UA_UInt32) // secureChannelId
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageHeader_encode(UA_SecureConversationMessageHeader const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->messageType),pos,dst);
|
|
|
|
- retval |= UA_Byte_encode(&(src->isFinal),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->messageSize),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->secureChannelId),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageHeader_decode(char const * src, UA_Int32* pos, UA_SecureConversationMessageHeader* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->messageType));
|
|
|
|
- retval |= UA_Byte_decode(src,pos,&(dst->isFinal));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->messageSize));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->secureChannelId));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_AsymmetricAlgorithmSecurityHeader_calcSize(UA_AsymmetricAlgorithmSecurityHeader const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + UA_ByteString_calcSize(&(ptr->securityPolicyUri))
|
|
|
|
- + UA_ByteString_calcSize(&(ptr->senderCertificate))
|
|
|
|
- + UA_ByteString_calcSize(&(ptr->receiverCertificateThumbprint))
|
|
|
|
- + sizeof(UA_UInt32) // requestId
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_AsymmetricAlgorithmSecurityHeader_encode(UA_AsymmetricAlgorithmSecurityHeader const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_ByteString_encode(&(src->securityPolicyUri),pos,dst);
|
|
|
|
- retval |= UA_ByteString_encode(&(src->senderCertificate),pos,dst);
|
|
|
|
- retval |= UA_ByteString_encode(&(src->receiverCertificateThumbprint),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->requestId),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_AsymmetricAlgorithmSecurityHeader_decode(char const * src, UA_Int32* pos, UA_AsymmetricAlgorithmSecurityHeader* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_ByteString_decode(src,pos,&(dst->securityPolicyUri));
|
|
|
|
- retval |= UA_ByteString_decode(src,pos,&(dst->senderCertificate));
|
|
|
|
- retval |= UA_ByteString_decode(src,pos,&(dst->receiverCertificateThumbprint));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->requestId));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SymmetricAlgorithmSecurityHeader_calcSize(UA_SymmetricAlgorithmSecurityHeader const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // tokenId
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SymmetricAlgorithmSecurityHeader_encode(UA_SymmetricAlgorithmSecurityHeader const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->tokenId),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SymmetricAlgorithmSecurityHeader_decode(char const * src, UA_Int32* pos, UA_SymmetricAlgorithmSecurityHeader* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->tokenId));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SequenceHeader_calcSize(UA_SequenceHeader const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // sequenceNumber
|
|
|
|
- + sizeof(UA_UInt32) // requestId
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SequenceHeader_encode(UA_SequenceHeader const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->sequenceNumber),pos,dst);
|
|
|
|
- retval |= UA_UInt32_encode(&(src->requestId),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SequenceHeader_decode(char const * src, UA_Int32* pos, UA_SequenceHeader* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->sequenceNumber));
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->requestId));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageFooter_calcSize(UA_SecureConversationMessageFooter const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + 0 //paddingSize is included in UA_Array_calcSize
|
|
|
|
- + UA_Array_calcSize(ptr->paddingSize, UA_BYTE, (void const**) ptr->padding)
|
|
|
|
- + sizeof(UA_Byte) // signature
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageFooter_encode(UA_SecureConversationMessageFooter const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_Int32_encode(&(src->paddingSize),pos,dst); // encode size
|
|
|
|
- retval |= UA_Array_encode((void const**) (src->padding),src->paddingSize, UA_BYTE,pos,dst);
|
|
|
|
- retval |= UA_Byte_encode(&(src->signature),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageFooter_decode(char const * src, UA_Int32* pos, UA_SecureConversationMessageFooter* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_Int32_decode(src,pos,&(dst->paddingSize)); // decode size
|
|
|
|
- retval |= UA_Array_decode(src,dst->paddingSize, UA_BYTE,pos,(void const**) (dst->padding));
|
|
|
|
- retval |= UA_Byte_decode(src,pos,&(dst->signature));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageAbortBody_calcSize(UA_SecureConversationMessageAbortBody const * ptr) {
|
|
|
|
- return 0
|
|
|
|
- + sizeof(UA_UInt32) // error
|
|
|
|
- + UA_String_calcSize(&(ptr->reason))
|
|
|
|
- ;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageAbortBody_encode(UA_SecureConversationMessageAbortBody const * src, UA_Int32* pos, char* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_encode(&(src->error),pos,dst);
|
|
|
|
- retval |= UA_String_encode(&(src->reason),pos,dst);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SecureConversationMessageAbortBody_decode(char const * src, UA_Int32* pos, UA_SecureConversationMessageAbortBody* dst) {
|
|
|
|
- UA_Int32 retval = UA_SUCCESS;
|
|
|
|
- retval |= UA_UInt32_decode(src,pos,&(dst->error));
|
|
|
|
- retval |= UA_String_decode(src,pos,&(dst->reason));
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
-UA_Int32 UA_SL_SequenceHeader_calcSize(UA_SL_SequenceHeader const * ptr);\
|
|
|
|
-UA_Int32 UA_SL_SequenceHeader_delete(UA_SL_SequenceHeader * p);\
|
|
|
|
-UA_Int32 UA_SL_SequenceHeader_deleteMembers(UA_SL_SequenceHeader * p);
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SL_SequenceHeader_decode(char const * src, UA_Int32* pos, UA_SL_SequenceHeader * dst){
|
|
|
|
- UA_Int32 retVal = 0;
|
|
|
|
- retVal |= UA_UInt32_decode(src, pos, &(dst->sequenceNumber));
|
|
|
|
- retVal |= UA_UInt32_decode(src, pos, &(dst->requestId));
|
|
|
|
- return UA_SUCCESS;
|
|
|
|
-}
|
|
|
|
-UA_Int32 UA_SL_SequenceHeader_encode(UA_SL_SequenceHeader const * src, UA_Int32* pos, char * dst){
|
|
|
|
- UA_Int32 retVal = 0;
|
|
|
|
- retVal |= UA_UInt32_encode(&(src->requestId),pos,dst);
|
|
|
|
- retVal |= UA_UInt32_encode(&(src->sequenceNumber),pos,dst);
|
|
|
|
- return retVal;
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-/*
|
|
|
|
- * get the asymmetric algorithm security header
|
|
|
|
- */
|
|
|
|
-/*
|
|
|
|
-UA_Int32 UA_SL_AsymmetricAlgorithmSecurityHeader_decode(char * const src, UA_Int32 *pos,
|
|
|
|
- UA_SL_AsymmetricAlgorithmSecurityHeader *dst){
|
|
|
|
- UA_Int32 retVal = 0;
|
|
|
|
- retVal |= UA_String_decode(src, pos,
|
|
|
|
- &(dst->securityPolicyUri));
|
|
|
|
- retVal |= UA_ByteString_decode(src, pos,
|
|
|
|
- &(dst->senderCertificate));
|
|
|
|
- retVal |= UA_String_decode(src, pos,
|
|
|
|
- &(dst->receiverThumbprint));
|
|
|
|
- return retVal;
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UA_Int32 UA_SL_AsymetricAlgorithmSecurityHeader_encode(UA_SL_AsymmetricAlgorithmSecurityHeader *const src,
|
|
|
|
- UA_Int32 *pos, char * dst) {
|
|
|
|
- UA_Int32 retVal = 0;
|
|
|
|
- retVal |= UA_String_encode(&(src->securityPolicyUri), pos,
|
|
|
|
- dst);
|
|
|
|
- retVal |= UA_ByteString_encode(&(src->senderCertificate), pos,
|
|
|
|
- dst);
|
|
|
|
- retVal |= UA_String_encode(&(src->receiverThumbprint), pos,
|
|
|
|
- dst);
|
|
|
|
- return UA_SUCCESS;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-*/
|
|
|