#include "opcua_simpletypes.h"
#include "opcua_hfindeces.h"
+extern const value_string g_requesttypes[];
+extern const int g_NumServices;
+
/* forward reference */
static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
void proto_reg_handoff_opcua(void);
/* declare parse function pointer */
-typedef void (*FctParse)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+typedef int (*FctParse)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
static int proto_opcua = -1;
static dissector_handle_t opcua_handle;
if (tree && pfctParse)
{
gint offset = 0;
+ int iServiceId = -1;
/* we are being asked for details */
proto_item *ti = NULL;
transport_tree = proto_item_add_subtree(ti, ett_opcua_transport);
/* call the transport message dissector */
- (*pfctParse)(transport_tree, tvb, &offset);
+ iServiceId = (*pfctParse)(transport_tree, tvb, &offset);
+
+ /* display the service type in addition to the message type */
+ if (iServiceId != -1)
+ {
+ int index = 0;
+ while (index < g_NumServices)
+ {
+ if (g_requesttypes[index].value == (guint32)iServiceId)
+ {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s", g_szMessageTypes[msgtype], g_requesttypes[index].strptr);
+ break;
+ }
+ index++;
+ }
+ }
}
}
}
/* Transport Layer: message parsers */
-void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+int parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
{
proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, TRUE); *pOffset+=3;
proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, TRUE); *pOffset+=1;
proto_tree_add_item(tree, hf_opcua_transport_mms, tvb, *pOffset, 4, TRUE); *pOffset+=4;
proto_tree_add_item(tree, hf_opcua_transport_mcc, tvb, *pOffset, 4, TRUE); *pOffset+=4;
parseString(tree, tvb, pOffset, hf_opcua_transport_endpoint);
+ return -1;
}
-void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+int parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
{
proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, TRUE); *pOffset+=3;
proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, TRUE); *pOffset+=1;
proto_tree_add_item(tree, hf_opcua_transport_sbs, tvb, *pOffset, 4, TRUE); *pOffset+=4;
proto_tree_add_item(tree, hf_opcua_transport_mms, tvb, *pOffset, 4, TRUE); *pOffset+=4;
proto_tree_add_item(tree, hf_opcua_transport_mcc, tvb, *pOffset, 4, TRUE); *pOffset+=4;
+ return -1;
}
-void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+int parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
{
proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, TRUE); *pOffset+=3;
proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, TRUE); *pOffset+=1;
proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, TRUE); *pOffset+=4;
proto_tree_add_item(tree, hf_opcua_transport_error, tvb, *pOffset, 4, TRUE); *pOffset+=4;
parseString(tree, tvb, pOffset, hf_opcua_transport_reason);
+ return -1;
}
-void parseMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+int parseMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
{
proto_item *ti;
proto_tree *encobj_tree;
ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset, "NodeId");
dispatchService(encobj_tree, tvb, pOffset, ServiceId);
+ return ServiceId;
}
-void parseOpenSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+int parseOpenSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
{
proto_item *ti;
proto_tree *encobj_tree;
ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset, "NodeId");
dispatchService(encobj_tree, tvb, pOffset, ServiceId);
+ return -1;
}
-void parseCloseSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+int parseCloseSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
{
proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, TRUE); *pOffset+=3;
proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, TRUE); *pOffset+=1;
proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, TRUE); *pOffset+=4;
proto_tree_add_item(tree, hf_opcua_transport_scid, tvb, *pOffset, 4, TRUE); *pOffset+=4;
+ return -1;
}
******************************************************************************/
/* Transport Layer: message parsers */
-void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
-void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
-void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
-void parseMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
-void parseOpenSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
-void parseCloseSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
-void registerTransportLayerTypes(int proto);
+int parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+int parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+int parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+int parseMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+int parseOpenSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+int parseCloseSecureChannel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+int registerTransportLayerTypes(int proto);