S2OPC OPCUA Toolkit
Loading...
Searching...
No Matches
sopc_network_layer.h File Reference
#include <inttypes.h>
#include "sopc_buffer.h"
#include "sopc_dataset_ll_layer.h"
#include "sopc_pub_fixed_buffer.h"
#include "sopc_pubsub_conf.h"
#include "sopc_pubsub_security.h"
#include "sopc_sub_scheduler.h"
#include "sopc_sub_target_variable.h"

Go to the source code of this file.

Data Structures

struct  SOPC_UADP_Network_Message
 
struct  SOPC_UADP_NetworkMessage_Reader_Callbacks
 
struct  SOPC_UADP_NetworkMessage_Reader_Configuration
 

Typedefs

typedef struct SOPC_UADP_Network_Message SOPC_UADP_NetworkMessage
 
typedef bool SOPC_UADP_IsWriterSequenceNumberNewer_Func(const SOPC_Conf_PublisherId *pubId, const uint16_t groupId, const uint16_t writerId, const uint16_t receivedSN)
 Function used to check if a DataSetMessage sequence number is newer for the identified DataSetWriter.
 
typedef void SOPC_UADP_UpdateTimeout_Func(const SOPC_Conf_PublisherId *pubId, const uint16_t groupId, const uint16_t writerId)
 Function used to update timeout state of an identified dataSetWriter. This function should be call if decode process was succesfull.
 
typedef const SOPC_ReaderGroupSOPC_UADP_NetworkMessage_GetReaderGroup(const SOPC_PubSubConnection *connection, const SOPC_UADP_Configuration *uadp_conf, const SOPC_Dataset_LL_PublisherId *pubid, const uint32_t groupVersion, const uint32_t groupId)
 A callback for ReaderGroup identification. When a network message is received, this callback is expected to return a matching SOPC_ReaderGroup. It is used to check if the remaining parts of the message has to be decoded or not.
 
typedef const SOPC_DataSetReaderSOPC_UADP_NetworkMessage_GetReader(const SOPC_ReaderGroup *group, const SOPC_UADP_Configuration *uadp_conf, const uint16_t dataSetWriterId)
 A callback for DataSetReader identification. When a DataSet content is received, this callback is expected to return a matching SOPC_DataSetReader. It is used to check if the content of the dataset has to be decoded or not, and to route decoding to the correct reader.
 
typedef SOPC_ReturnStatus SOPC_UADP_NetworkMessage_SetDsm(SOPC_Dataset_LL_DataSetMessage *dsm, SOPC_SubTargetVariableConfig *targetConfig, const SOPC_DataSetReader *reader, SOPC_TargetVariableCtx *targetVariable)
 A callback for DataSet message application. When a compliant DataSet is received, this callback is expected to forward all variables received in dsm to targetConfig, depending on filter parameters in reader.
 
typedef SOPC_TargetVariableCtxSOPC_UADP_GetTargetVariable_Func(const SOPC_Conf_PublisherId *pubId, const uint16_t groupId, const uint16_t writerId)
 A callback to retrieve a SOPC_TargetVariableCtx provided to user. The SOPC_TargetVariableCtx provided to the user cannot be modified. Ideally a SOPC_TargetVariableCtx has been created per dataSetMessage and can be identify by the tuple PublisherId, WriterId.
 

Enumerations

enum  SOPC_NetworkMessage_Error_Code {
  SOPC_NetworkMessage_Error_Code_None = 0 , SOPC_NetworkMessage_Error_Code_InvalidParameters , SOPC_UADP_NetworkMessage_Error_Write_Buffer_Failed = 0x10000000 , SOPC_UADP_NetworkMessage_Error_Write_PubId_Failed ,
  SOPC_UADP_NetworkMessage_Error_Write_GroupId_Failed , SOPC_UADP_NetworkMessage_Error_Write_GroupVersion_Failed , SOPC_UADP_NetworkMessage_Error_Write_WriterId_Failed , SOPC_UADP_NetworkMessage_Error_Write_TokenId_Failed ,
  SOPC_UADP_NetworkMessage_Error_Write_SecuHdr_Failed , SOPC_UADP_NetworkMessage_Error_Write_SecuFooter_Failed , SOPC_NetworkMessage_Error_Write_Alloc_Failed , SOPC_UADP_NetworkMessage_Error_Write_DsmSize_Failed ,
  SOPC_UADP_NetworkMessage_Error_Write_DsmPreSize_Failed , SOPC_UADP_NetworkMessage_Error_Write_DsmField_Failed , SOPC_UADP_NetworkMessage_Error_Write_DsmSeqNum_Failed , SOPC_UADP_NetworkMessage_Error_Write_DsmTimestamp_Failed ,
  SOPC_UADP_NetworkMessage_Error_Write_EncryptPaylod_Failed , SOPC_UADP_NetworkMessage_Error_Write_PayloadFlush_Failed , SOPC_UADP_NetworkMessage_Error_Write_Sign_Failed , SOPC_UADP_NetworkMessage_Error_Read_Byte_Failed = 0x20000000 ,
  SOPC_UADP_NetworkMessage_Error_Read_Short_Failed , SOPC_UADP_NetworkMessage_Error_Read_Int_Failed , SOPC_UADP_NetworkMessage_Error_Read_Alloc_Failed , SOPC_UADP_NetworkMessage_Error_Read_Security_Failed ,
  SOPC_UADP_NetworkMessage_Error_Read_SecurityConf_Failed , SOPC_UADP_NetworkMessage_Error_Read_SecuritySign_Failed , SOPC_UADP_NetworkMessage_Error_Read_SecuritySignSize_Failed , SOPC_UADP_NetworkMessage_Error_Read_SecurityNonce_Failed ,
  SOPC_UADP_NetworkMessage_Error_Read_SecurityDecrypt_Failed , SOPC_UADP_NetworkMessage_Error_Read_SecurityNone_Failed , SOPC_UADP_NetworkMessage_Error_Read_SeqNum_Failed , SOPC_UADP_NetworkMessage_Error_Read_DsmSkip_Failed ,
  SOPC_UADP_NetworkMessage_Error_Read_DsmSize_Failed , SOPC_UADP_NetworkMessage_Error_Read_DsmSeqNum_Failed , SOPC_UADP_NetworkMessage_Error_Read_DsmSeqNumCheck_Failed , SOPC_UADP_NetworkMessage_Error_Read_InvalidBit ,
  SOPC_UADP_NetworkMessage_Error_Read_DsmFields_Failed , SOPC_UADP_NetworkMessage_Error_Read_DsmSizeCheck_Failed , SOPC_UADP_NetworkMessage_Error_Read_DsmTimeStamp , SOPC_UADP_NetworkMessage_Error_Read_NoMatchingGroup = 0x30000000 ,
  SOPC_UADP_NetworkMessage_Error_Read_NoMatchingReader , SOPC_UADP_NetworkMessage_Error_Read_BadMetaData , SOPC_UADP_NetworkMessage_Error_Unsupported_Version = 0x40000000 , SOPC_UADP_NetworkMessage_Error_Unsupported_Flags1 ,
  SOPC_UADP_NetworkMessage_Error_Unsupported_Flags2 , SOPC_UADP_NetworkMessage_Error_Unsupported_PubIdType , SOPC_UADP_NetworkMessage_Error_Unsupported_ClassId , SOPC_UADP_NetworkMessage_Error_Unsupported_MessageNum ,
  SOPC_UADP_NetworkMessage_Error_Unsupported_SeqNum , SOPC_UADP_NetworkMessage_Error_Unsupported_Timestamp , SOPC_UADP_NetworkMessage_Error_Unsupported_Picoseconds , SOPC_UADP_NetworkMessage_Error_Unsupported_SecurityFooterReset ,
  SOPC_UADP_NetworkMessage_Error_Unsupported_PromotedFields , SOPC_UADP_NetworkMessage_Error_Unsupported_EncodingType , SOPC_UADP_NetworkMessage_Error_Unsupported_DsmType , SOPC_UADP_NetworkMessage_Error_Unsupported_DsmSeqNum ,
  SOPC_UADP_NetworkMessage_Error_Unsupported_DsmPicoseconds , SOPC_JSON_NetworkMessage_Error_Generate_Unique_MessageId = 0x50000000 , SOPC_JSON_NetworkMessage_Error_Generate_Unique_VariantName , SOPC_JSON_NetworkMessage_Error_Encode ,
  SOPC_JSON_NetworkMessage_Error_DataSetMessage_Encode , SOPC_JSON_NetworkMessage_Error_Variant_Encode , SOPC_JSON_NetworkMessage_Error_Write_Closing_Structure , SOPC_JSON_NetworkMessage_Error_Security_Unsupported
}
 

Functions

bool SOPC_Is_UInt16_Sequence_Number_Newer (uint16_t received, uint16_t processed)
 check if received sequence number is newer than processsed sequence number following part 14 rules
 
SOPC_NetworkMessage_Error_Code SOPC_JSON_NetworkMessage_Encode (SOPC_Dataset_LL_NetworkMessage *message, SOPC_PubSub_SecurityType *security, SOPC_Buffer **buffer)
 Encode a NetworkMessage with JSON Mapping.
 
SOPC_NetworkMessage_Error_Code SOPC_UADP_NetworkMessage_Encode_Buffers (SOPC_Dataset_LL_NetworkMessage *nm, SOPC_PubSub_SecurityType *security, SOPC_Buffer **buffer_header, SOPC_Buffer **buffer_payload)
 Encode a NetworkMessage with UADP Mapping. Buffer is split in a Header buffer and payload buffer.
 
SOPC_NetworkMessage_Error_Code SOPC_UADP_NetworkMessage_BuildFinalMessage (SOPC_PubSub_SecurityType *security, SOPC_Buffer *buffer_header, SOPC_Buffer **buffer_payload)
 Sign and encrypt encoded buffer if necessary and merge header and payload buffer in one buffer.
 
SOPC_BufferSOPC_UADP_NetworkMessage_Get_PreencodedBuffer (SOPC_Dataset_LL_NetworkMessage *nm, SOPC_PubSub_SecurityType *security)
 Get updated preencoded buffer.
 
SOPC_NetworkMessage_Error_Code SOPC_UADP_NetworkMessage_Decode (SOPC_Buffer *buffer, const SOPC_UADP_NetworkMessage_Reader_Configuration *reader_config, const SOPC_PubSubConnection *connection, SOPC_UADP_NetworkMessage **uadp_nm)
 Decode a UADP packet into a NetworkMessage.
 
void SOPC_UADP_NetworkMessage_Delete (SOPC_UADP_NetworkMessage *uadp_nm)
 

Detailed Description

UADP Encoding is divided in two stages

  • UADP header and UADP payload are mapped in two distinct buffers
  • Depending on security configuration we sign and encrypt and merge the two buffers in one buffer.

The header buffer contains the final buffer to be sent. It is composed of non-encrypted headers followed by the payload buffer copy, which may be encrypted

The payload buffer contains the unencrypted payload

Typedef Documentation

◆ SOPC_UADP_NetworkMessage

◆ SOPC_UADP_IsWriterSequenceNumberNewer_Func

typedef bool SOPC_UADP_IsWriterSequenceNumberNewer_Func(const SOPC_Conf_PublisherId *pubId, const uint16_t groupId, const uint16_t writerId, const uint16_t receivedSN)

Function used to check if a DataSetMessage sequence number is newer for the identified DataSetWriter.

Parameters
pubIdthe publisher id associated to the DataSetWriter
groupIdthe WriterGroupId
writerIdthe DataSetWriter id
receivedSNthe dataset message sequence number
Returns
True if receivedSn is newer (valid) for this dataSetWriter. False otherwise

◆ SOPC_UADP_UpdateTimeout_Func

typedef void SOPC_UADP_UpdateTimeout_Func(const SOPC_Conf_PublisherId *pubId, const uint16_t groupId, const uint16_t writerId)

Function used to update timeout state of an identified dataSetWriter. This function should be call if decode process was succesfull.

Parameters
pubIdthe publisher id associated to the DataSetWriter
groupIdthe WriterGroupId
writerIdthe DataSetWriter id

◆ SOPC_UADP_NetworkMessage_GetReaderGroup

typedef const SOPC_ReaderGroup * SOPC_UADP_NetworkMessage_GetReaderGroup(const SOPC_PubSubConnection *connection, const SOPC_UADP_Configuration *uadp_conf, const SOPC_Dataset_LL_PublisherId *pubid, const uint32_t groupVersion, const uint32_t groupId)

A callback for ReaderGroup identification. When a network message is received, this callback is expected to return a matching SOPC_ReaderGroup. It is used to check if the remaining parts of the message has to be decoded or not.

Parameters
connectionis the Network connection
uadp_confConfiguration of the received message
pubidPublisher Id received
groupVersionGroup Version received
groupIdGroup Id received
Returns
A SOPC_ReaderGroup matching the received message or NULL if no configured connection matches.

◆ SOPC_UADP_NetworkMessage_GetReader

typedef const SOPC_DataSetReader * SOPC_UADP_NetworkMessage_GetReader(const SOPC_ReaderGroup *group, const SOPC_UADP_Configuration *uadp_conf, const uint16_t dataSetWriterId)

A callback for DataSetReader identification. When a DataSet content is received, this callback is expected to return a matching SOPC_DataSetReader. It is used to check if the content of the dataset has to be decoded or not, and to route decoding to the correct reader.

Parameters
groupis the Reader Group on which the DataSet is received
uadp_confConfiguration of the received message
dataSetWriterIdDataSetWriter Id received
Returns
A SOPC_DataSetReader matching the received DataSet or NULL if no matching Reader is configured for the given group.

◆ SOPC_UADP_NetworkMessage_SetDsm

typedef SOPC_ReturnStatus SOPC_UADP_NetworkMessage_SetDsm(SOPC_Dataset_LL_DataSetMessage *dsm, SOPC_SubTargetVariableConfig *targetConfig, const SOPC_DataSetReader *reader, SOPC_TargetVariableCtx *targetVariable)

A callback for DataSet message application. When a compliant DataSet is received, this callback is expected to forward all variables received in dsm to targetConfig, depending on filter parameters in reader.

Parameters
dsmThe received DataSetMessage
targetConfigConfiguration of the Subscriber receive event
readerThe matching reader.
targetVariableObject containing the data provided to user
Returns
- SOPC_STATUS_OK if all variables were written

◆ SOPC_UADP_GetTargetVariable_Func

typedef SOPC_TargetVariableCtx * SOPC_UADP_GetTargetVariable_Func(const SOPC_Conf_PublisherId *pubId, const uint16_t groupId, const uint16_t writerId)

A callback to retrieve a SOPC_TargetVariableCtx provided to user. The SOPC_TargetVariableCtx provided to the user cannot be modified. Ideally a SOPC_TargetVariableCtx has been created per dataSetMessage and can be identify by the tuple PublisherId, WriterId.

Parameters
pubIdPublisher Id of the networkMessage received
groupIdWriterGroup Id of the received message
writerIdDataSetWriter Id of the received message
Returns
An initialized and fill SOPC_TargetVariableCtx object associated to this dataSetMessage. NULL in case of error

Enumeration Type Documentation

◆ SOPC_NetworkMessage_Error_Code

Error code used by encoding and decoding functions

Enumerator
SOPC_NetworkMessage_Error_Code_None 
SOPC_NetworkMessage_Error_Code_InvalidParameters 
SOPC_UADP_NetworkMessage_Error_Write_Buffer_Failed 
SOPC_UADP_NetworkMessage_Error_Write_PubId_Failed 
SOPC_UADP_NetworkMessage_Error_Write_GroupId_Failed 
SOPC_UADP_NetworkMessage_Error_Write_GroupVersion_Failed 
SOPC_UADP_NetworkMessage_Error_Write_WriterId_Failed 
SOPC_UADP_NetworkMessage_Error_Write_TokenId_Failed 
SOPC_UADP_NetworkMessage_Error_Write_SecuHdr_Failed 
SOPC_UADP_NetworkMessage_Error_Write_SecuFooter_Failed 
SOPC_NetworkMessage_Error_Write_Alloc_Failed 
SOPC_UADP_NetworkMessage_Error_Write_DsmSize_Failed 
SOPC_UADP_NetworkMessage_Error_Write_DsmPreSize_Failed 
SOPC_UADP_NetworkMessage_Error_Write_DsmField_Failed 
SOPC_UADP_NetworkMessage_Error_Write_DsmSeqNum_Failed 
SOPC_UADP_NetworkMessage_Error_Write_DsmTimestamp_Failed 
SOPC_UADP_NetworkMessage_Error_Write_EncryptPaylod_Failed 
SOPC_UADP_NetworkMessage_Error_Write_PayloadFlush_Failed 
SOPC_UADP_NetworkMessage_Error_Write_Sign_Failed 
SOPC_UADP_NetworkMessage_Error_Read_Byte_Failed 
SOPC_UADP_NetworkMessage_Error_Read_Short_Failed 
SOPC_UADP_NetworkMessage_Error_Read_Int_Failed 
SOPC_UADP_NetworkMessage_Error_Read_Alloc_Failed 
SOPC_UADP_NetworkMessage_Error_Read_Security_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SecurityConf_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SecuritySign_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SecuritySignSize_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SecurityNonce_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SecurityDecrypt_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SecurityNone_Failed 
SOPC_UADP_NetworkMessage_Error_Read_SeqNum_Failed 
SOPC_UADP_NetworkMessage_Error_Read_DsmSkip_Failed 
SOPC_UADP_NetworkMessage_Error_Read_DsmSize_Failed 
SOPC_UADP_NetworkMessage_Error_Read_DsmSeqNum_Failed 
SOPC_UADP_NetworkMessage_Error_Read_DsmSeqNumCheck_Failed 
SOPC_UADP_NetworkMessage_Error_Read_InvalidBit 
SOPC_UADP_NetworkMessage_Error_Read_DsmFields_Failed 
SOPC_UADP_NetworkMessage_Error_Read_DsmSizeCheck_Failed 
SOPC_UADP_NetworkMessage_Error_Read_DsmTimeStamp 
SOPC_UADP_NetworkMessage_Error_Read_NoMatchingGroup 
SOPC_UADP_NetworkMessage_Error_Read_NoMatchingReader 
SOPC_UADP_NetworkMessage_Error_Read_BadMetaData 
SOPC_UADP_NetworkMessage_Error_Unsupported_Version 
SOPC_UADP_NetworkMessage_Error_Unsupported_Flags1 
SOPC_UADP_NetworkMessage_Error_Unsupported_Flags2 
SOPC_UADP_NetworkMessage_Error_Unsupported_PubIdType 
SOPC_UADP_NetworkMessage_Error_Unsupported_ClassId 
SOPC_UADP_NetworkMessage_Error_Unsupported_MessageNum 
SOPC_UADP_NetworkMessage_Error_Unsupported_SeqNum 
SOPC_UADP_NetworkMessage_Error_Unsupported_Timestamp 
SOPC_UADP_NetworkMessage_Error_Unsupported_Picoseconds 
SOPC_UADP_NetworkMessage_Error_Unsupported_SecurityFooterReset 
SOPC_UADP_NetworkMessage_Error_Unsupported_PromotedFields 
SOPC_UADP_NetworkMessage_Error_Unsupported_EncodingType 
SOPC_UADP_NetworkMessage_Error_Unsupported_DsmType 
SOPC_UADP_NetworkMessage_Error_Unsupported_DsmSeqNum 
SOPC_UADP_NetworkMessage_Error_Unsupported_DsmPicoseconds 
SOPC_JSON_NetworkMessage_Error_Generate_Unique_MessageId 
SOPC_JSON_NetworkMessage_Error_Generate_Unique_VariantName 
SOPC_JSON_NetworkMessage_Error_Encode 
SOPC_JSON_NetworkMessage_Error_DataSetMessage_Encode 
SOPC_JSON_NetworkMessage_Error_Variant_Encode 
SOPC_JSON_NetworkMessage_Error_Write_Closing_Structure 
SOPC_JSON_NetworkMessage_Error_Security_Unsupported 

Function Documentation

◆ SOPC_Is_UInt16_Sequence_Number_Newer()

bool SOPC_Is_UInt16_Sequence_Number_Newer ( uint16_t received,
uint16_t processed )

check if received sequence number is newer than processsed sequence number following part 14 rules

Parameters
receivedreceived sequence number
processedsequence number already processed
Returns
true in case received sequence number is newer than processed, false otherwise

◆ SOPC_JSON_NetworkMessage_Encode()

SOPC_NetworkMessage_Error_Code SOPC_JSON_NetworkMessage_Encode ( SOPC_Dataset_LL_NetworkMessage * message,
SOPC_PubSub_SecurityType * security,
SOPC_Buffer ** buffer )

Encode a NetworkMessage with JSON Mapping.

Parameters
messageis the NetworkMessage to encode
securityis the data use to encrypt and sign. Can be NULL if security is not used. No security possible for JSON encoding.
bufferpointer to a newly allocated buffer containing the JSON string
Returns
SOPC_NetworkMessage_Error_Code_None if buffer is successfully encoded. Appropriate error code otherwise

◆ SOPC_UADP_NetworkMessage_Encode_Buffers()

SOPC_NetworkMessage_Error_Code SOPC_UADP_NetworkMessage_Encode_Buffers ( SOPC_Dataset_LL_NetworkMessage * nm,
SOPC_PubSub_SecurityType * security,
SOPC_Buffer ** buffer_header,
SOPC_Buffer ** buffer_payload )

Encode a NetworkMessage with UADP Mapping. Buffer is split in a Header buffer and payload buffer.

Parameters
nmis the NetworkMessage to encode
securityis the data use to set security flags. Can be NULL if security is not used
buffer_header[OUT] pointer to a newly allocated buffer with header flags encoded.
buffer_payload[OUT] pointer to a newly allocated buffer with payload data encoded.
Returns
SOPC_NetworkMessage_Error_Code_None if header and payload buffer are successfully encoded. Appropriate error code otherwise

◆ SOPC_UADP_NetworkMessage_BuildFinalMessage()

SOPC_NetworkMessage_Error_Code SOPC_UADP_NetworkMessage_BuildFinalMessage ( SOPC_PubSub_SecurityType * security,
SOPC_Buffer * buffer_header,
SOPC_Buffer ** buffer_payload )

Sign and encrypt encoded buffer if necessary and merge header and payload buffer in one buffer.

Parameters
securityis the data used to encrypt and sign. Can be NULL if security is not used
buffer_header[IN/OUT] encoded header buffer which will become the final buffer
buffer_payloadencoded payload buffer. Freed in all cases by this function
Returns
SOPC_NetworkMessage_Error_Code_None in case of succes another code otherwise

◆ SOPC_UADP_NetworkMessage_Get_PreencodedBuffer()

SOPC_Buffer * SOPC_UADP_NetworkMessage_Get_PreencodedBuffer ( SOPC_Dataset_LL_NetworkMessage * nm,
SOPC_PubSub_SecurityType * security )

Get updated preencoded buffer.

Parameters
nmNetworkMessage containing preencoded structure
securitythe data used to encrypt and sign. Must be NULL, preencode mechanism cannot handle sign and encrypt
Returns
SOPC_Buffer* pointer to updated preencoded buffer, NULL if an error occur.

◆ SOPC_UADP_NetworkMessage_Decode()

SOPC_NetworkMessage_Error_Code SOPC_UADP_NetworkMessage_Decode ( SOPC_Buffer * buffer,
const SOPC_UADP_NetworkMessage_Reader_Configuration * reader_config,
const SOPC_PubSubConnection * connection,
SOPC_UADP_NetworkMessage ** uadp_nm )

Decode a UADP packet into a NetworkMessage.

Parameters
bufferthe UADP byte to decode
reader_configThe configuration for message parsing/filtering
connectionThe related connection
uadp_nma pointer to a new network message (must be freed by caller) if decoding succeeded
Returns
SOPC_NetworkMessage_Error_Code_None if buffer is successfully decoded and led to at least 1 variable update. Appropriate error code otherwise. Note that this can simply caused by the fact that the received message does not fit any Group/PublisherId/WriterId filters.

◆ SOPC_UADP_NetworkMessage_Delete()

void SOPC_UADP_NetworkMessage_Delete ( SOPC_UADP_NetworkMessage * uadp_nm)