diff options
author | Anders Broman <anders.broman@ericsson.com> | 2008-03-05 20:42:58 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2008-03-05 20:42:58 +0000 |
commit | 7a5b90df340479218367ca8fe3bbfd382f06da98 (patch) | |
tree | 7afdfd866c8dfeaa6a239f4a7c07b398052e3f30 /plugins | |
parent | 2cd5211e9548bf830096e075b650787e926c9a32 (diff) | |
download | wireshark-7a5b90df340479218367ca8fe3bbfd382f06da98.tar.gz wireshark-7a5b90df340479218367ca8fe3bbfd382f06da98.tar.bz2 wireshark-7a5b90df340479218367ca8fe3bbfd382f06da98.zip |
From Peter Johansson :
Support for EtherCAT subdissectors.
svn path=/trunk/; revision=24566
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/ethercat/moduleinfo.h | 3 | ||||
-rw-r--r-- | plugins/ethercat/packet-ams.c | 92 | ||||
-rw-r--r-- | plugins/ethercat/packet-ecatmb.c | 536 | ||||
-rw-r--r-- | plugins/ethercat/packet-ethercat-datagram.c | 403 | ||||
-rw-r--r-- | plugins/ethercat/packet-ethercat-frame.c | 26 |
5 files changed, 591 insertions, 469 deletions
diff --git a/plugins/ethercat/moduleinfo.h b/plugins/ethercat/moduleinfo.h index 2a9a0ff1cc..2feb328130 100644 --- a/plugins/ethercat/moduleinfo.h +++ b/plugins/ethercat/moduleinfo.h @@ -18,4 +18,5 @@ /*#define VERSION "0.0.10" */ /*#define VERSION "0.0.11" * support of AoE protocol */ /*#define VERSION "0.0.12" * port to Wireshark */ -#define VERSION "0.1.0" /* First version integrated into the Wireshark sources*/ +/*#define VERSION "0.1.0" * First version integrated into the Wireshark sources*/ +#define VERSION "0.1.1" /* Added the ability for sub dissectors to decode the data section of EtherCAT using heuristics */ diff --git a/plugins/ethercat/packet-ams.c b/plugins/ethercat/packet-ams.c index 7a2e7ff40d..c58d8fa11b 100644 --- a/plugins/ethercat/packet-ams.c +++ b/plugins/ethercat/packet-ams.c @@ -52,8 +52,6 @@ int proto_ams = -1; /* Define the tree for ams */ static int ett_ams = -1; -static int ett_ams_sender = -1; -static int ett_ams_target = -1; static int ett_ams_stateflags = -1; static int ett_ams_adsreadrequest = -1; static int ett_ams_adsreadresponse = -1; @@ -72,8 +70,6 @@ static int ett_ams_adsadddnresponse = -1; static int ett_ams_adsdeldnrequest = -1; static int ett_ams_adsdeldnresponse = -1; static int ett_ams_adsdnrequest = -1; -static int ett_ams_adsdnresponse = -1; -static int ett_ams_noteblockstamp = -1; static int hf_ams_sendernetid = -1; static int hf_ams_senderport = -1; @@ -392,7 +388,7 @@ static void NetIdFormater(tvbuff_t *tvb, guint offset, char *szText, gint nMax) /*ams*/ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *ti, *aitem; + proto_item *ti, *anItem; proto_tree *ams_tree = NULL, *ams_adstree, *ams_statetree; gint offset = 0; guint ams_length = tvb_reported_length(tvb); @@ -443,8 +439,8 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) cmdId = tvb_get_letohs(tvb, offset); offset+=sizeof(guint16); - aitem = proto_tree_add_item(ams_tree, hf_ams_stateflags, tvb, offset, sizeof(guint16), TRUE); - ams_statetree = proto_item_add_subtree(aitem, ett_ams_stateflags); + anItem = proto_tree_add_item(ams_tree, hf_ams_stateflags, tvb, offset, sizeof(guint16), TRUE); + ams_statetree = proto_item_add_subtree(anItem, ett_ams_stateflags); proto_tree_add_item(ams_statetree, hf_ams_stateresponse,tvb, offset, sizeof(guint16), TRUE); proto_tree_add_item(ams_statetree, hf_ams_statenoreturn,tvb, offset, sizeof(guint16), TRUE); proto_tree_add_item(ams_statetree, hf_ams_stateadscmd,tvb, offset, sizeof(guint16), TRUE); @@ -486,10 +482,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreadrequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadrequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadReq_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreadrequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadrequest); proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -509,10 +505,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adswriterequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adswriterequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsWriteReq_Len - sizeof(guint16) ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adswriterequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswriterequest); proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, 4, TRUE); offset+=sizeof(guint32); @@ -534,10 +530,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreadwriterequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadwriterequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadWriteReq_Len - sizeof(guint16)) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreadwriterequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadwriterequest); proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -562,10 +558,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreadstaterequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadstaterequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadStateReq_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreadstaterequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadstaterequest); proto_tree_add_item(ams_adstree, hf_ams_adsinvokeid, tvb, offset, sizeof(guint32), TRUE); } } @@ -578,10 +574,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adswritectrlrequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adswritectrlrequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsWriteControlReq_Len - sizeof(guint16) ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adswritectrlrequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswritectrlrequest); proto_tree_add_item(ams_adstree, hf_ams_adsstate, tvb, offset, 2, TRUE); offset+=sizeof(guint16); @@ -603,10 +599,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreaddinforequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreaddinforequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadDeviceInfoReq_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreaddinforequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreaddinforequest); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); } } @@ -619,10 +615,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsadddnrequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsadddnrequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsAddDeviceNotificationReq_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsadddnrequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsadddnrequest); proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -651,10 +647,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsdeldnrequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsdeldnrequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsDelDeviceNotificationReq_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsdeldnrequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsdeldnrequest); proto_tree_add_item(ams_adstree, hf_ams_adsnotificationhandle, tvb, offset, sizeof(guint32), TRUE); } } @@ -670,10 +666,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /*guint32 cbLength; guint32 nStamps;*/ - aitem = proto_tree_add_item(ams_tree, hf_ams_adsdnrequest, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsdnrequest, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsDeviceNotificationReq_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsdnrequest); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsdnrequest); proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, sizeof(guint32), TRUE); /*cbLength = tvb_get_letohs(tvb, offset);*/ offset+=sizeof(guint32); @@ -701,10 +697,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreadresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadRes_Len - sizeof(guint16) ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreadresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -723,10 +719,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adswriteresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adswriteresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsWriteRes_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adswriteresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswriteresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); } } @@ -739,10 +735,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreadwriteresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadwriteresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadWriteRes_Len - sizeof(guint16) ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreadwriteresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadwriteresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -761,10 +757,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreadstateresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadstateresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadStateRes_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreadstateresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadstateresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -783,10 +779,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adswritectrlresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adswritectrlresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsWriteControlRes_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adswritectrlresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswritectrlresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); } } @@ -799,10 +795,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsreaddinforesponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsreaddinforesponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsReadDeviceInfoRes_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsreaddinforesponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreaddinforesponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -823,10 +819,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsadddnresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsadddnresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsAddDeviceNotificationRes_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsadddnresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsadddnresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); offset+=sizeof(guint32); @@ -842,10 +838,10 @@ static void dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( tree ) { - aitem = proto_tree_add_item(ams_tree, hf_ams_adsdeldnresponse, tvb, offset, ams_length-offset, TRUE); + anItem = proto_tree_add_item(ams_tree, hf_ams_adsdeldnresponse, tvb, offset, ams_length-offset, TRUE); if( ams_length-offset >= TAdsDelDeviceNotificationRes_Len ) { - ams_adstree = proto_item_add_subtree(aitem, ett_ams_adsdeldnresponse); + ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsdeldnresponse); proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, sizeof(guint32), TRUE); } } @@ -1210,8 +1206,6 @@ void proto_register_ams(void) static gint *ett[] = { &ett_ams, - &ett_ams_sender, - &ett_ams_target, &ett_ams_stateflags, &ett_ams_adsreadrequest, &ett_ams_adsreadresponse, @@ -1229,15 +1223,13 @@ void proto_register_ams(void) &ett_ams_adsadddnresponse, &ett_ams_adsdeldnrequest, &ett_ams_adsdeldnresponse, - &ett_ams_adsdnrequest, - &ett_ams_adsdnresponse, - &ett_ams_noteblockstamp + &ett_ams_adsdnrequest }; proto_ams = proto_register_protocol("AMS", - "AMS","ams"); - proto_register_field_array(proto_ams,hf,array_length(hf)); - proto_register_subtree_array(ett,array_length(ett)); + "AMS", "ams"); + proto_register_field_array(proto_ams, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); register_dissector("ams", dissect_ams, proto_ams); } @@ -1248,7 +1240,7 @@ void proto_reg_handoff_ams(void) { static dissector_handle_t ams_handle; - ams_handle = create_dissector_handle(dissect_ams,proto_ams); + ams_handle = create_dissector_handle(dissect_ams, proto_ams); dissector_add("tcp.port", 0xbf02, ams_handle); dissector_add("ecatf.type", 2, ams_handle); } diff --git a/plugins/ethercat/packet-ecatmb.c b/plugins/ethercat/packet-ecatmb.c index 8d00b63c83..0f6c59b3a3 100644 --- a/plugins/ethercat/packet-ecatmb.c +++ b/plugins/ethercat/packet-ecatmb.c @@ -1,5 +1,5 @@ /* packet-ecatmb.c - * Routines for ethercat packet disassembly + * Routines for EtherCAT packet disassembly * * $Id$ * @@ -70,16 +70,14 @@ static int ett_ecat_mailbox_coe_sdoccs = -1; static int ett_ecat_mailbox_coe_sdoscs = -1; static int ett_ecat_mailbox_foe = -1; static int ett_ecat_mailbox_foe_efw = -1; -static int ett_ecat_mailbox_soeopmode = -1; static int ett_ecat_mailbox_soeflag = -1; static int ett_ecat_mailbox_soe = -1; static int ett_ecat_mailbox_fraghead = -1; +static int ett_ecat_mailbox_header = -1; static int hf_ecat_mailbox = -1; static int hf_ecat_mailboxlength = -1; static int hf_ecat_mailboxaddress = -1; -static int hf_ecat_mailboxtype = -1; -static int hf_ecat_mailboxcounter = -1; static int hf_ecat_mailbox_eoe = -1; static int hf_ecat_mailbox_eoe_fraghead = -1; static int hf_ecat_mailbox_eoe_type = -1; @@ -210,11 +208,12 @@ static int hf_ecat_mailbox_soe_error = -1; static const value_string EcMBoxType[] = { { 0, "Invalid", }, - { 1, "AoE", }, - { 2, "EoE", }, - { 3, "CoE", }, - { 4, "FoE", }, - { 5, "SoE", }, + { 1, "AoE (Vendor specific; Beckhoff ADS over EtherCAT)", }, + { 2, "EoE (Ethernet over EtherCAT)", }, + { 3, "CoE (CANopen over EtherCAT)", }, + { 4, "FoE (File access over EtherCAT)", }, + { 5, "SoE (Servo profile over EtherCAT)", }, + { 15, "VoE (Vendor specific over EtherCAT)"}, { 0x80+1, "AoE - Err", }, { 0x80+2, "EoE - Err", }, { 0x80+3, "CoE - Err", }, @@ -314,7 +313,7 @@ void init_sdo_info_header(PETHERCAT_SDO_INFO_HEADER pInfo, tvbuff_t *tvb, gint o } -static void MailboxTypeFormater(PETHERCAT_MBOX_HEADER pMbx, char *szText, gint nMax) +static void MailboxTypeFormatter(PETHERCAT_MBOX_HEADER pMbx, char *szText, gint nMax) { guint32 i; @@ -329,7 +328,7 @@ static void MailboxTypeFormater(PETHERCAT_MBOX_HEADER pMbx, char *szText, gint n g_snprintf ( szText, nMax,"Type : %d", pMbx->aControlUnion.v.Type); } -static void EoETypeFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) +static void EoETypeFormatter(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) { switch (pEoE->anEoeHeaderInfoUnion.v.Type) { @@ -357,12 +356,12 @@ static void EoETypeFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) } } -static void EoEFragNoFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) +static void EoEFragNoFormatter(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) { g_snprintf ( szText, nMax, "FragNo : %d", pEoE->anEoeHeaderDataUnion.v.Fragment); } -static void EoEOffsetFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) +static void EoEOffsetFormatter(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) { if ( pEoE->anEoeHeaderDataUnion.v.Fragment == 0 ) g_snprintf ( szText, nMax, "BufferSize : %d", 32*pEoE->anEoeHeaderDataUnion.v.OffsetBuffer); @@ -370,12 +369,12 @@ static void EoEOffsetFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax g_snprintf ( szText, nMax, "Offset : %d", 32*pEoE->anEoeHeaderDataUnion.v.OffsetBuffer); } -static void EoEFrameFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) +static void EoEFrameFormatter(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) { g_snprintf ( szText, nMax, "FrameNo : %d", pEoE->anEoeHeaderDataUnion.v.FrameNo); } -static void EoELastFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) +static void EoELastFormatter(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) { if ( pEoE->anEoeHeaderInfoUnion.v.LastFragment != 0 ) g_snprintf ( szText, nMax, "Last Frag"); @@ -383,12 +382,12 @@ static void EoELastFormater(PETHERCAT_EOE_HEADER pEoE, char *szText, gint nMax) g_snprintf ( szText, nMax, "More Frags..."); } -static void CANopenNumberFormater(PETHERCAT_COE_HEADER pCoE, char *szText, gint nMax) +static void CANopenNumberFormatter(PETHERCAT_COE_HEADER pCoE, char *szText, gint nMax) { g_snprintf( szText, nMax, "Number : %d", pCoE->v.Number); } -static void CANopenTypeFormater(PETHERCAT_COE_HEADER pCoE, char *szText, gint nMax) +static void CANopenTypeFormatter(PETHERCAT_COE_HEADER pCoE, char *szText, gint nMax) { switch ( pCoE->v.Type) { @@ -418,7 +417,7 @@ static void CANopenTypeFormater(PETHERCAT_COE_HEADER pCoE, char *szText, gint nM } } -static void CANopenSdoReqFormater(PETHERCAT_SDO_HEADER pSdo, char *szText, gint nMax) +static void CANopenSdoReqFormatter(PETHERCAT_SDO_HEADER pSdo, char *szText, gint nMax) { switch ( pSdo->anSdoHeaderUnion.Idq.Ccs ) { @@ -442,12 +441,12 @@ static void CANopenSdoReqFormater(PETHERCAT_SDO_HEADER pSdo, char *szText, gint } } -static void CANopenSdoResFormater(PETHERCAT_SDO_HEADER pSdo, char *szText, gint nMax) +static void CANopenSdoResFormatter(PETHERCAT_SDO_HEADER pSdo, char *szText, gint nMax) { g_snprintf ( szText, nMax, "SDO Res : Scs %d", pSdo->anSdoHeaderUnion.Ids.Scs); } -static void CANopenSdoInfoFormater(PETHERCAT_SDO_INFO_HEADER pHead, char *szText, gint nMax) +static void CANopenSdoInfoFormatter(PETHERCAT_SDO_INFO_HEADER pHead, char *szText, gint nMax) { guint8 opCode = pHead->anSdoControlUnion.v.OpCode & 0x7F; char* txt2 = ""; @@ -481,7 +480,7 @@ static void CANopenSdoInfoFormater(PETHERCAT_SDO_INFO_HEADER pHead, char *szText } } -static void FoeFormater(tvbuff_t *tvb, gint offset, char *szText, gint nMax, guint foe_length) +static void FoeFormatter(tvbuff_t *tvb, gint offset, char *szText, gint nMax, guint foe_length) { ETHERCAT_FOE_HEADER foe; char tmp[50]; @@ -533,7 +532,7 @@ static void SoEIdToString( char* txt, guint16 id, int nMax) g_snprintf(txt, nMax, "S-%d-%04d", id>>12, id & 0x0FFF ); } -static void SoeFormater(tvbuff_t *tvb, gint offset, char *szText, gint nMax, guint soe_length) +static void SoeFormatter(tvbuff_t *tvb, gint offset, char *szText, gint nMax, guint soe_length) { ETHERCAT_SOE_HEADER soe; char tmp[50]; @@ -593,13 +592,12 @@ static void SoeFormater(tvbuff_t *tvb, gint offset, char *szText, gint nMax, gui g_snprintf ( szText, nMax, "SoE: Error %04x", tvb_get_letohs(tvb, offset)); } - -/*ethercat mailbox*/ +/* ethercat mailbox */ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree) { proto_tree *ecat_coe_tree = NULL, *ecat_sdo_tree, *ecat_coe_sdoccs_tree, *ecat_coe_sdoscs_tree; - proto_item *aitem = NULL, *aparent = NULL; + proto_item *anItem = NULL, *aparent = NULL; char szText[200]; int nMax = sizeof(szText)-1; @@ -608,9 +606,9 @@ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro if( tree ) { - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_coe, tvb, offset, coe_length, TRUE); - proto_item_set_text(aitem,"CoE"); - aparent = proto_item_get_parent(aitem); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_coe, tvb, offset, coe_length, TRUE); + proto_item_set_text(anItem,"CoE"); + aparent = proto_item_get_parent(anItem); proto_item_append_text(aparent,":CoE "); } @@ -623,15 +621,15 @@ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro init_coe_header(&coe, tvb, offset); if( tree ) { - ecat_coe_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe); + ecat_coe_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe); - CANopenNumberFormater(&coe, szText, nMax); - aitem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_number, tvb, offset, ETHERCAT_COE_HEADER_LEN, coe.v.Number); - proto_item_set_text(aitem, szText); + CANopenNumberFormatter(&coe, szText, nMax); + anItem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_number, tvb, offset, ETHERCAT_COE_HEADER_LEN, coe.v.Number); + proto_item_set_text(anItem, szText); - CANopenTypeFormater(&coe, szText, nMax); - aitem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_type, tvb, offset, ETHERCAT_COE_HEADER_LEN, coe.v.Type); - proto_item_set_text(aitem, szText); + CANopenTypeFormatter(&coe, szText, nMax); + anItem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_type, tvb, offset, ETHERCAT_COE_HEADER_LEN, coe.v.Type); + proto_item_set_text(anItem, szText); } offset += ETHERCAT_COE_HEADER_LEN; @@ -651,7 +649,7 @@ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro init_sdo_header(&sdo, tvb, offset); - CANopenSdoReqFormater(&sdo, szText, nMax); + CANopenSdoReqFormatter(&sdo, szText, nMax); if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, szText); @@ -659,71 +657,71 @@ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro { proto_item_append_text(aparent, szText); - aitem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_sdoreq, tvb, offset, 1, sdo.anSdoHeaderUnion.Idq.Ccs); - proto_item_set_text(aitem, szText); - ecat_sdo_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_sdo); + anItem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_sdoreq, tvb, offset, 1, sdo.anSdoHeaderUnion.Idq.Ccs); + proto_item_set_text(anItem, szText); + ecat_sdo_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_sdo); switch ( sdo.anSdoHeaderUnion.Idq.Ccs ) { case SDO_CCS_INITIATE_DOWNLOAD: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsid, tvb, offset, 1, TRUE); - ecat_coe_sdoccs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoccs); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_sizeind, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_expedited, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_size0, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_size1, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_complete, tvb, offset, 1, TRUE); - - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsid, tvb, offset, 1, TRUE); + ecat_coe_sdoccs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoccs); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_sizeind, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_expedited, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_size0, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_size1, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_complete, tvb, offset, 1, TRUE); + + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); if ( sdo.anSdoHeaderUnion.Idq.SizeInd && !sdo.anSdoHeaderUnion.Idq.Expedited ) { len = coe_length - ETHERCAT_COE_HEADER_LEN - ETHERCAT_SDO_HEADER_LEN; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdolength, tvb, offset+4, 4, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdolength, tvb, offset+4, 4, TRUE); offset+=ETHERCAT_SDO_HEADER_LEN; if ( len > 0 ) - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, len, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, len, TRUE); } else { if ( sdo.anSdoHeaderUnion.Idq.Size == 3 ) - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata1, tvb, offset+4, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata1, tvb, offset+4, 1, TRUE); else if ( sdo.anSdoHeaderUnion.Idq.Size == 2 ) - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata2, tvb, offset+4, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata2, tvb, offset+4, 2, TRUE); else - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata, tvb, offset+4, 4, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata, tvb, offset+4, 4, TRUE); } break; case SDO_CCS_INITIATE_UPLOAD: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsiu, tvb, offset, 1, TRUE); - ecat_coe_sdoccs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoccs); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_complete, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsiu, tvb, offset, 1, TRUE); + ecat_coe_sdoccs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoccs); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsid_complete, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); break; case SDO_CCS_DOWNLOAD_SEGMENT: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsds, tvb, offset, 1, TRUE); - ecat_coe_sdoccs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoccs); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsds_lastseg, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsds_size, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsds_toggle, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsds, tvb, offset, 1, TRUE); + ecat_coe_sdoccs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoccs); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsds_lastseg, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsds_size, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsds_toggle, tvb, offset, 1, TRUE); offset+=1; if ( coe_length-offset > 0 ) { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, coe_length-offset, TRUE); - proto_item_append_text(aitem, "(len = %d)", coe_length-offset); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, coe_length-offset, TRUE); + proto_item_append_text(anItem, "(len = %d)", coe_length-offset); } break; case SDO_CCS_UPLOAD_SEGMENT: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsus, tvb, offset, 1, TRUE); - ecat_coe_sdoccs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoccs); - aitem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsus_toggle, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoccsus, tvb, offset, 1, TRUE); + ecat_coe_sdoccs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoccs); + anItem = proto_tree_add_item(ecat_coe_sdoccs_tree, hf_ecat_mailbox_coe_sdoccsus_toggle, tvb, offset, 1, TRUE); break; case SDO_CCS_ABORT_TRANSFER: - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+4, 4, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+4, 4, TRUE); break; } } @@ -742,65 +740,65 @@ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro init_sdo_header(&sdo, tvb, offset); - CANopenSdoResFormater(&sdo, szText, nMax); + CANopenSdoResFormatter(&sdo, szText, nMax); if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, szText); if( tree ) { - aitem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_sdores, tvb, offset, 1, sdo.anSdoHeaderUnion.Ids.Scs); - proto_item_set_text(aitem, szText); - ecat_sdo_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_sdo); + anItem = proto_tree_add_uint(ecat_coe_tree, hf_ecat_mailbox_coe_sdores, tvb, offset, 1, sdo.anSdoHeaderUnion.Ids.Scs); + proto_item_set_text(anItem, szText); + ecat_sdo_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_sdo); switch ( sdo.anSdoHeaderUnion.Ids.Scs ) { case SDO_SCS_INITIATE_DOWNLOAD: - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); break; case SDO_SCS_INITIATE_UPLOAD: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoscsiu, tvb, offset, 1, TRUE); - ecat_coe_sdoscs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoscs); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_sizeind, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_expedited, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_size0, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_size1, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_complete, tvb, offset, 1, TRUE); - - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoscsiu, tvb, offset, 1, TRUE); + ecat_coe_sdoscs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoscs); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_sizeind, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_expedited, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_size0, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_size1, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsiu_complete, tvb, offset, 1, TRUE); + + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoidx, tvb, offset+1, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdosub, tvb, offset+3, 1, TRUE); if ( sdo.anSdoHeaderUnion.Ius.SizeInd && !sdo.anSdoHeaderUnion.Ius.Expedited ) { len = coe_length - ETHERCAT_COE_HEADER_LEN - ETHERCAT_SDO_HEADER_LEN; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdolength, tvb, offset+4, 4, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdolength, tvb, offset+4, 4, TRUE); offset+=ETHERCAT_SDO_HEADER_LEN; if ( len > 0 ) - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, len, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, len, TRUE); } else if ( sdo.anSdoHeaderUnion.Ius.SizeInd && sdo.anSdoHeaderUnion.Ius.Expedited && sdo.anSdoHeaderUnion.Ius.Size == 3 ) - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata1, tvb, offset+4, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata1, tvb, offset+4, 1, TRUE); else if ( sdo.anSdoHeaderUnion.Ius.SizeInd && sdo.anSdoHeaderUnion.Ius.Expedited && sdo.anSdoHeaderUnion.Ius.Size == 2 ) - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata2, tvb, offset+4, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata2, tvb, offset+4, 2, TRUE); else - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata, tvb, offset+4, 4, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdodata, tvb, offset+4, 4, TRUE); break; case SDO_SCS_DOWNLOAD_SEGMENT: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoscsds, tvb, offset, 1, TRUE); - ecat_coe_sdoscs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoscs); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsds_toggle, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoscsds, tvb, offset, 1, TRUE); + ecat_coe_sdoscs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoscs); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsds_toggle, tvb, offset, 1, TRUE); break; case SDO_SCS_UPLOAD_SEGMENT: - aitem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoscsus, tvb, offset, 1, TRUE); - ecat_coe_sdoscs_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_coe_sdoscs); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsus_lastseg, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsus_bytes, tvb, offset, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsus_toggle, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_sdo_tree, hf_ecat_mailbox_coe_sdoscsus, tvb, offset, 1, TRUE); + ecat_coe_sdoscs_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_coe_sdoscs); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsus_lastseg, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsus_bytes, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_sdoscs_tree, hf_ecat_mailbox_coe_sdoscsus_toggle, tvb, offset, 1, TRUE); offset+=1; if ( coe_length-offset> 0 ) { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, coe_length-offset, TRUE); - proto_item_append_text(aitem, "(len = %d)", coe_length-offset); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoldata, tvb, offset, coe_length-offset, TRUE); + proto_item_append_text(anItem, "(len = %d)", coe_length-offset); } break; } @@ -821,107 +819,107 @@ static void dissect_ecat_coe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro init_sdo_info_header(&info, tvb, offset); - CANopenSdoInfoFormater(&info, szText, nMax); + CANopenSdoInfoFormatter(&info, szText, nMax); if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, szText); if( tree ) { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoopcode, tvb, offset++, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoopcode, tvb, offset++, 1, TRUE); offset++; /*Reserved*/ - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfofrag, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfofrag, tvb, offset, 2, TRUE); offset+=2; switch ( info.anSdoControlUnion.v.OpCode ) { case ECAT_COE_INFO_OPCODE_LIST_Q: { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfolisttype, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfolisttype, tvb, offset, 2, TRUE); } break; case ECAT_COE_INFO_OPCODE_LIST_S: { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfolisttype, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfolisttype, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfolist, tvb, offset, coe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfolist, tvb, offset, coe_length-offset, TRUE); } break; case ECAT_COE_INFO_OPCODE_OBJ_Q: - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); break; case ECAT_COE_INFO_OPCODE_OBJ_S: { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfodatatype, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfodatatype, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfomaxsub, tvb, offset++, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoobjcode, tvb, offset++, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfomaxsub, tvb, offset++, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoobjcode, tvb, offset++, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoname, tvb, offset, coe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoname, tvb, offset, coe_length-offset, TRUE); } break; case ECAT_COE_INFO_OPCODE_ENTRY_Q: { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfosubindex, tvb, offset++, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfovalueinfo, tvb, offset, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfosubindex, tvb, offset++, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfovalueinfo, tvb, offset, 1, TRUE); } break; case ECAT_COE_INFO_OPCODE_ENTRY_S: { guint16 objlen; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoindex, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfosubindex, tvb, offset++, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfovalueinfo, tvb, offset++, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfosubindex, tvb, offset++, 1, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfovalueinfo, tvb, offset++, 1, TRUE); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfodatatype, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfodatatype, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfobitlen, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfobitlen, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoobjaccess, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoobjaccess, tvb, offset, 2, TRUE); offset+=2; if ( (info.anSdoInfoUnion.Entry.ValueInfo & 0x08) != 0 ) { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfounittype, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfounittype, tvb, offset, 2, TRUE); offset+=2; } if ( (info.anSdoInfoUnion.Entry.ValueInfo & 0x10) != 0 ) { objlen = BIT2BYTE(info.anSdoInfoUnion.Entry.Res.BitLen); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfodefaultvalue, tvb, offset, objlen, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfodefaultvalue, tvb, offset, objlen, TRUE); offset+=objlen; } if ( (info.anSdoInfoUnion.Entry.ValueInfo & 0x20) != 0 ) { objlen = BIT2BYTE(info.anSdoInfoUnion.Entry.Res.BitLen); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfominvalue, tvb, offset, objlen, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfominvalue, tvb, offset, objlen, TRUE); offset+=objlen; } if ( (info.anSdoInfoUnion.Entry.ValueInfo & 0x40) != 0 ) { objlen = BIT2BYTE(info.anSdoInfoUnion.Entry.Res.BitLen); - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfomaxvalue, tvb, offset, objlen, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfomaxvalue, tvb, offset, objlen, TRUE); offset+=objlen; } - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoname, tvb, offset, coe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoname, tvb, offset, coe_length-offset, TRUE); } break; case ECAT_COE_INFO_OPCODE_ERROR_S: { - aitem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoerrorcode, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_coe_tree, hf_ecat_mailbox_coe_sdoinfoerrorcode, tvb, offset, 4, TRUE); } break; } @@ -941,7 +939,7 @@ static void dissect_ecat_soe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro { proto_tree *ecat_soeflag_tree, *ecat_soe_tree; - proto_item *aitem = NULL ,*aparent = NULL; + proto_item *anItem = NULL ,*aparent = NULL; char szText[200]; int nMax = sizeof(szText)-1; @@ -949,15 +947,15 @@ static void dissect_ecat_soe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro if( tree ) { - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_soe, tvb, offset, soe_length, TRUE); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_soe, tvb, offset, soe_length, TRUE); - aparent = proto_item_get_parent(aitem); + aparent = proto_item_get_parent(anItem); proto_item_append_text(aparent,":SoE "); } if( soe_length >= ETHERCAT_SOE_HEADER_LEN ) { - SoeFormater(tvb, offset, szText, nMax, soe_length); + SoeFormatter(tvb, offset, szText, nMax, soe_length); if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, szText); @@ -967,24 +965,24 @@ static void dissect_ecat_soe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro init_soe_header(&soe, tvb, offset); proto_item_append_text(aparent, szText); - proto_item_set_text(aitem, szText); - - ecat_soe_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_soe); - aitem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_header, tvb, offset , 2, TRUE); - - ecat_soeflag_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_soeflag); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_opcode, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_incomplete, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_error, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_driveno, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_datastate, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_name, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_attribute, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_unit, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_min, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_max, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_value, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_reserved, tvb, offset, 2, TRUE); + proto_item_set_text(anItem, szText); + + ecat_soe_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_soe); + anItem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_header, tvb, offset , 2, TRUE); + + ecat_soeflag_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_soeflag); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_opcode, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_incomplete, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_error, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_driveno, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_datastate, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_name, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_attribute, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_unit, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_min, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_max, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_value, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soeflag_tree, hf_ecat_mailbox_soe_header_reserved, tvb, offset, 2, TRUE); offset+=2; if ( !soe.anSoeHeaderControlUnion.v.Error ) @@ -995,29 +993,29 @@ static void dissect_ecat_soe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro { case ECAT_SOE_OPCODE_RRQ: case ECAT_SOE_OPCODE_WRS: - aitem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_idn, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_idn, tvb, offset, 2, TRUE); break; case ECAT_SOE_OPCODE_RRS: case ECAT_SOE_OPCODE_WRQ: case ECAT_SOE_OPCODE_NFC: - aitem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_idn, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_idn, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_soe_data, tvb, offset, soe_length-offset, TRUE); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_soe_data, tvb, offset, soe_length-offset, TRUE); break; } } else { - aitem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_frag, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_frag, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_soe_data, tvb, offset, soe_length-offset, TRUE); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_soe_data, tvb, offset, soe_length-offset, TRUE); } } else { - aitem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_idn, tvb, offset, 2, TRUE); - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_soe_error, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_soe_tree, hf_ecat_mailbox_soe_idn, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_soe_error, tvb, offset, 2, TRUE); } } } @@ -1033,7 +1031,7 @@ static void dissect_ecat_eoe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro proto_tree *ecat_eoe_tree = 0, *ecat_fraghead_tree, *ecat_eoe_init_tree, *ecat_eoe_macfilter_tree, *ecat_eoe_macfilter_filter_tree, *ecat_eoe_macfilter_filtermask_tree; tvbuff_t *next_tvb; - proto_item *aitem = NULL, *aparent = NULL; + proto_item *anItem = NULL, *aparent = NULL; char szText[200]; int nMax = sizeof(szText)-1; int nCnt; @@ -1042,10 +1040,10 @@ static void dissect_ecat_eoe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro if( tree ) { - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_eoe, tvb, offset, eoe_length, TRUE); - proto_item_set_text(aitem, "EoE Fragment"); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_eoe, tvb, offset, eoe_length, TRUE); + proto_item_set_text(anItem, "EoE Fragment"); - aparent = proto_item_get_parent(aitem); + aparent = proto_item_get_parent(anItem); proto_item_append_text(aparent,":EoE "); } @@ -1064,49 +1062,49 @@ static void dissect_ecat_eoe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro if( tree ) { - ecat_eoe_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_eoe); + ecat_eoe_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_eoe); - aitem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_fraghead, tvb, offset, 4, TRUE); - proto_item_set_text(aitem, "Header"); - ecat_fraghead_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_fraghead); + anItem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_fraghead, tvb, offset, 4, TRUE); + proto_item_set_text(anItem, "Header"); + ecat_fraghead_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_fraghead); - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_type, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.Type); - EoETypeFormater(&eoe, szText, nMax); - proto_item_set_text(aitem,szText); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_type, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.Type); + EoETypeFormatter(&eoe, szText, nMax); + proto_item_set_text(anItem,szText); switch ( eoe.anEoeHeaderInfoUnion.v.Type ) { case EOE_TYPE_FRAME_FRAG: - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_fragno, tvb, offset, 4, eoe.anEoeHeaderDataUnion.v.Fragment); - EoEFragNoFormater(&eoe, szText, nMax); - proto_item_set_text(aitem,szText); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_fragno, tvb, offset, 4, eoe.anEoeHeaderDataUnion.v.Fragment); + EoEFragNoFormatter(&eoe, szText, nMax); + proto_item_set_text(anItem,szText); - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_offset, tvb, offset, 4, 32*eoe.anEoeHeaderDataUnion.v.OffsetBuffer); - EoEOffsetFormater(&eoe, szText, nMax); - proto_item_set_text(aitem,szText); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_offset, tvb, offset, 4, 32*eoe.anEoeHeaderDataUnion.v.OffsetBuffer); + EoEOffsetFormatter(&eoe, szText, nMax); + proto_item_set_text(anItem,szText); - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_frame, tvb, offset, 4, eoe.anEoeHeaderDataUnion.v.FrameNo); - EoEFrameFormater(&eoe, szText, nMax); - proto_item_set_text(aitem,szText); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_frame, tvb, offset, 4, eoe.anEoeHeaderDataUnion.v.FrameNo); + EoEFrameFormatter(&eoe, szText, nMax); + proto_item_set_text(anItem,szText); - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_last, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.LastFragment); - EoELastFormater(&eoe, szText, nMax); - proto_item_set_text(aitem,szText); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_last, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.LastFragment); + EoELastFormatter(&eoe, szText, nMax); + proto_item_set_text(anItem,szText); if ( eoe.anEoeHeaderInfoUnion.v.TimeStampRequested ) { - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_timestampreq, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.TimeStampRequested); - proto_item_set_text(aitem, "Time Stamp Requested"); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_timestampreq, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.TimeStampRequested); + proto_item_set_text(anItem, "Time Stamp Requested"); } if ( eoe.anEoeHeaderInfoUnion.v.TimeStampAppended ) { - aitem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_timestampapp, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.TimeStampAppended); - proto_item_set_text(aitem, "Time Stamp Appended"); + anItem = proto_tree_add_uint(ecat_fraghead_tree, hf_ecat_mailbox_eoe_timestampapp, tvb, offset, 4, eoe.anEoeHeaderInfoUnion.v.TimeStampAppended); + proto_item_set_text(anItem, "Time Stamp Appended"); } offset+=ETHERCAT_EOE_HEADER_LEN; - aitem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_fragment, tvb, offset, eoe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_fragment, tvb, offset, eoe_length-offset, TRUE); if ( eoe.anEoeHeaderDataUnion.v.Fragment == 0 ) { @@ -1116,78 +1114,78 @@ static void dissect_ecat_eoe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro if ( eoe.anEoeHeaderInfoUnion.v.TimeStampAppended ) { - aitem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_timestamp, tvb, eoe_length-ETHERCAT_EOE_TIMESTAMP_LEN, ETHERCAT_EOE_TIMESTAMP_LEN, TRUE); + anItem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_timestamp, tvb, eoe_length-ETHERCAT_EOE_TIMESTAMP_LEN, ETHERCAT_EOE_TIMESTAMP_LEN, TRUE); } break; case EOE_TYPE_TIMESTAMP_RES: - aitem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_timestamp, tvb, offset+ETHERCAT_EOE_HEADER_LEN, ETHERCAT_EOE_TIMESTAMP_LEN, TRUE); + anItem = proto_tree_add_item(ecat_eoe_tree, hf_ecat_mailbox_eoe_timestamp, tvb, offset+ETHERCAT_EOE_HEADER_LEN, ETHERCAT_EOE_TIMESTAMP_LEN, TRUE); break; case EOE_TYPE_INIT_REQ: offset+=ETHERCAT_EOE_HEADER_LEN; - aitem = proto_tree_add_item(ecat_fraghead_tree, hf_ecat_mailbox_eoe_init, tvb, offset, MIN(eoe_length-offset,ETHERCAT_EOE_INIT_LEN), TRUE); + anItem = proto_tree_add_item(ecat_fraghead_tree, hf_ecat_mailbox_eoe_init, tvb, offset, MIN(eoe_length-offset,ETHERCAT_EOE_INIT_LEN), TRUE); if( eoe_length-offset >= ETHERCAT_EOE_INIT_LEN ) { - ecat_eoe_init_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_eoe_init); - - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_macaddr, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_ipaddr, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_subnetmask, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_defaultgateway, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_dnsserver, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_dnsname, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_append_timestamp, tvb, offset, 4, TRUE); + ecat_eoe_init_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_eoe_init); + + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_macaddr, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_ipaddr, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_subnetmask, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_defaultgateway, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_dnsserver, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_contains_dnsname, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_append_timestamp, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_macaddr, tvb, offset, ETHERNET_ADDRESS_LEN, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_macaddr, tvb, offset, ETHERNET_ADDRESS_LEN, TRUE); offset+=ETHERNET_ADDRESS_LEN; - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_ipaddr, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_ipaddr, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_subnetmask, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_subnetmask, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_defaultgateway, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_defaultgateway, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_dnsserver, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_dnsserver, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_dnsname, tvb, offset, 32, TRUE); + anItem = proto_tree_add_item(ecat_eoe_init_tree, hf_ecat_mailbox_eoe_init_dnsname, tvb, offset, 32, TRUE); } else - proto_item_append_text(aitem, " - Invalid length!"); + proto_item_append_text(anItem, " - Invalid length!"); break; case EOE_TYPE_MACFILTER_REQ: { EoeMacFilterOptionsUnion options; offset+=ETHERCAT_EOE_HEADER_LEN; - aitem = proto_tree_add_item(ecat_fraghead_tree, hf_ecat_mailbox_eoe_macfilter, tvb, offset, MIN(eoe_length-offset, ETHERCAT_EOE_MACFILTER_LEN), TRUE); + anItem = proto_tree_add_item(ecat_fraghead_tree, hf_ecat_mailbox_eoe_macfilter, tvb, offset, MIN(eoe_length-offset, ETHERCAT_EOE_MACFILTER_LEN), TRUE); if( eoe_length-offset >= ETHERCAT_EOE_MACFILTER_LEN ) { - ecat_eoe_macfilter_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_eoe_macfilter); - aitem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_macfiltercount, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_maskcount, tvb, offset, 4, TRUE); - aitem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_nobroadcasts, tvb, offset, 4, TRUE); + ecat_eoe_macfilter_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_eoe_macfilter); + anItem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_macfiltercount, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_maskcount, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_nobroadcasts, tvb, offset, 4, TRUE); options.Options = tvb_get_letohs(tvb, offset); offset+=4; - aitem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_filter, tvb, offset, 16*ETHERNET_ADDRESS_LEN, TRUE); - ecat_eoe_macfilter_filter_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_eoe_macfilter_filter); + anItem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_filter, tvb, offset, 16*ETHERNET_ADDRESS_LEN, TRUE); + ecat_eoe_macfilter_filter_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_eoe_macfilter_filter); for( nCnt=0; nCnt<options.v.MacFilterCount; nCnt++) - aitem = proto_tree_add_item(ecat_eoe_macfilter_filter_tree, hf_ecat_mailbox_eoe_macfilter_filters[nCnt], tvb, offset+nCnt*ETHERNET_ADDRESS_LEN, ETHERNET_ADDRESS_LEN, TRUE); + anItem = proto_tree_add_item(ecat_eoe_macfilter_filter_tree, hf_ecat_mailbox_eoe_macfilter_filters[nCnt], tvb, offset+nCnt*ETHERNET_ADDRESS_LEN, ETHERNET_ADDRESS_LEN, TRUE); offset+=16*ETHERNET_ADDRESS_LEN; - aitem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_filtermask, tvb, offset, 4*sizeof(guint32), TRUE); - ecat_eoe_macfilter_filtermask_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_eoe_macfilter_filtermask); + anItem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_filtermask, tvb, offset, 4*sizeof(guint32), TRUE); + ecat_eoe_macfilter_filtermask_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_eoe_macfilter_filtermask); for( nCnt=0; nCnt<options.v.MacFilterMaskCount; nCnt++) - aitem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_filtermasks[nCnt], tvb, offset+nCnt*sizeof(guint32), sizeof(guint32), TRUE); + anItem = proto_tree_add_item(ecat_eoe_macfilter_tree, hf_ecat_mailbox_eoe_macfilter_filtermasks[nCnt], tvb, offset+nCnt*sizeof(guint32), sizeof(guint32), TRUE); } else - proto_item_append_text(aitem, " - Invalid length!"); + proto_item_append_text(anItem, " - Invalid length!"); } break; @@ -1214,7 +1212,7 @@ static void dissect_ecat_foe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro { proto_tree *ecat_foe_tree,*ecat_foe_efw_tree; - proto_item *aitem= NULL,*aparent = NULL; + proto_item *anItem= NULL,*aparent = NULL; char szText[200]; int nMax = sizeof(szText)-1; @@ -1222,16 +1220,16 @@ static void dissect_ecat_foe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro if( tree ) { - aitem = proto_tree_add_item(tree, hf_ecat_mailbox_foe, tvb, offset, foe_length, TRUE); - proto_item_set_text(aitem, ":Foe"); + anItem = proto_tree_add_item(tree, hf_ecat_mailbox_foe, tvb, offset, foe_length, TRUE); + proto_item_set_text(anItem, ":Foe"); - aparent = proto_item_get_parent(aitem); + aparent = proto_item_get_parent(anItem); proto_item_append_text(aparent,"FoE "); } if( foe_length >= ETHERCAT_FOE_HEADER_LEN ) { - FoeFormater(tvb, offset, szText, nMax, foe_length); + FoeFormatter(tvb, offset, szText, nMax, foe_length); if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, szText); @@ -1240,64 +1238,64 @@ static void dissect_ecat_foe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro ETHERCAT_FOE_HEADER foe; init_foe_header(&foe, tvb, offset); - ecat_foe_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_foe); - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_opmode, tvb, offset++, 1, TRUE); + ecat_foe_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_foe); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_opmode, tvb, offset++, 1, TRUE); offset++; /*Reserved1;*/ switch (foe.OpMode) { case ECAT_FOE_OPMODE_RRQ: case ECAT_FOE_OPMODE_WRQ: - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_filelength, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_filelength, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_filename, tvb, offset, foe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_filename, tvb, offset, foe_length-offset, TRUE); break; case ECAT_FOE_OPMODE_DATA: { - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_packetno, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_packetno, tvb, offset, 2, TRUE); offset+=4; /*+2 for Reserved2*/ - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_data, tvb, offset, foe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_data, tvb, offset, foe_length-offset, TRUE); if( foe_length-offset >= sizeof(TEFWUPDATE_HEADER) ) { - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_efw, tvb, offset, foe_length-offset, TRUE); - ecat_foe_efw_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox_foe_efw); - aitem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_cmd, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_efw, tvb, offset, foe_length-offset, TRUE); + ecat_foe_efw_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_foe_efw); + anItem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_cmd, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_size, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_size, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_addresslw, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_addresslw, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_addresshw, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_addresshw, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_data, tvb, offset, foe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_foe_efw_tree, hf_ecat_mailbox_foe_efw_data, tvb, offset, foe_length-offset, TRUE); } } break; case ECAT_FOE_OPMODE_ACK: - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_packetno, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_packetno, tvb, offset, 2, TRUE); break; case ECAT_FOE_OPMODE_ERR: - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_errcode, tvb, offset, 4, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_errcode, tvb, offset, 4, TRUE); offset+=4; - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_errtext, tvb, offset, foe_length-offset, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_errtext, tvb, offset, foe_length-offset, TRUE); break; case ECAT_FOE_OPMODE_BUSY: - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_busydone, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_busydone, tvb, offset, 2, TRUE); offset+=2; - aitem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_busyentire, tvb, offset, 2, TRUE); + anItem = proto_tree_add_item(ecat_foe_tree, hf_ecat_mailbox_foe_busyentire, tvb, offset, 2, TRUE); break; } } @@ -1311,9 +1309,10 @@ static void dissect_ecat_foe(tvbuff_t *tvb, gint offset, packet_info *pinfo, pro static void dissect_ecat_mailbox(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_tree *ecat_mailbox_tree=NULL; + proto_tree *ecat_mailbox_tree = NULL; + proto_tree *ecat_mailbox_header_tree = NULL; tvbuff_t *next_tvb; - proto_item *aitem; + proto_item *anItem; gint offset = 0; char szText[200]; int nMax = sizeof(szText)-1; @@ -1334,21 +1333,32 @@ static void dissect_ecat_mailbox(tvbuff_t *tvb, packet_info *pinfo, proto_tree * if( tree ) { - aitem = proto_tree_add_item(tree, proto_ecat_mailbox, tvb, 0, ETHERCAT_MBOX_HEADER_LEN+hdr.Length, TRUE); - ecat_mailbox_tree = proto_item_add_subtree(aitem, ett_ecat_mailbox); + /* Create the mailbox sub tree */ + anItem = proto_tree_add_item(tree, proto_ecat_mailbox, tvb, 0, ETHERCAT_MBOX_HEADER_LEN+hdr.Length, TRUE); + ecat_mailbox_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox); + + /* Create a mailbox header subtree */ + anItem = proto_tree_add_text(ecat_mailbox_tree, tvb, offset, ETHERCAT_MBOX_HEADER_LEN, "Header"); + ecat_mailbox_header_tree = proto_item_add_subtree(anItem, ett_ecat_mailbox_header); - aitem = proto_tree_add_item(ecat_mailbox_tree, hf_ecat_mailboxlength, tvb, offset, sizeof(hdr.Length), TRUE); + /* Add length information to the mailbox header */ + anItem = proto_tree_add_item(ecat_mailbox_header_tree, hf_ecat_mailboxlength, tvb, offset, sizeof(hdr.Length), TRUE); offset+=sizeof(hdr.Length); - aitem = proto_tree_add_item(ecat_mailbox_tree, hf_ecat_mailboxaddress, tvb, offset, sizeof(hdr.Address), TRUE); - offset+=sizeof(hdr.Address)+sizeof(guint8); + /* Add address information to the mailbox header */ + anItem = proto_tree_add_item(ecat_mailbox_header_tree, hf_ecat_mailboxaddress, tvb, offset, sizeof(hdr.Address), TRUE); + offset+=sizeof(hdr.Address); + + /* Add priority information to the mailbox header */ + proto_tree_add_text(ecat_mailbox_header_tree, tvb, offset, 1, "Priority: %d", tvb_get_guint8(tvb, offset) & 0x3); + offset+=sizeof(guint8); - aitem = proto_tree_add_item(ecat_mailbox_tree, hf_ecat_mailboxtype, tvb, offset, 1, TRUE); - MailboxTypeFormater(&hdr, szText, nMax); - proto_item_set_text(aitem,szText); + /* Add type information to the mailbox header */ + MailboxTypeFormatter(&hdr, szText, nMax); + proto_tree_add_text(ecat_mailbox_header_tree, tvb, offset, 1, szText); - aitem = proto_tree_add_item(ecat_mailbox_tree, hf_ecat_mailboxcounter, tvb, offset, 1,TRUE); - proto_item_set_text(aitem,"Counter : %d",hdr.aControlUnion.v.Counter); + /* Add counter information to the mailbox header */ + proto_tree_add_text(ecat_mailbox_header_tree, tvb, offset, 1, "Counter : %d",hdr.aControlUnion.v.Counter); offset++; } else @@ -1378,7 +1388,7 @@ static void dissect_ecat_mailbox(tvbuff_t *tvb, packet_info *pinfo, proto_tree * break; default: - aitem = proto_tree_add_item(ecat_mailbox_tree, hf_ecat_mailboxdata, tvb, offset, hdr.Length, TRUE); + anItem = proto_tree_add_item(ecat_mailbox_tree, hf_ecat_mailboxdata, tvb, offset, hdr.Length, TRUE); } if (check_col(pinfo->cinfo, COL_INFO)) @@ -1389,7 +1399,7 @@ static void dissect_ecat_mailbox(tvbuff_t *tvb, packet_info *pinfo, proto_tree * void proto_register_ecat_mailbox(void) { - static const true_false_string flags_set_truth = + static const true_false_string flags_set_truth[] = { "Set", "Not set" @@ -1412,16 +1422,6 @@ void proto_register_ecat_mailbox(void) FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL } }, - { &hf_ecat_mailboxtype, - { "Type ", "ecat_mailbox.type", - FT_UINT8, BASE_HEX, VALS(EcMBoxType), 0x0F, - "", 0x0F, 0, 0, 0, NULL, NULL } - }, - { &hf_ecat_mailboxcounter, - { "Counter ", "ecat_mailbox.counter", - FT_UINT8, BASE_HEX, NULL, 0x70, - "", 0x70, 0, 0, 0, NULL, NULL } - }, { &hf_ecat_mailbox_eoe, { "EoE Fragment", "ecat_mailbox.eoe", FT_BYTES, BASE_NONE, NULL, 0x0, @@ -2057,16 +2057,16 @@ void proto_register_ecat_mailbox(void) &ett_ecat_mailbox_coe_sdoscs, &ett_ecat_mailbox_foe, &ett_ecat_mailbox_foe_efw, - &ett_ecat_mailbox_soeopmode, &ett_ecat_mailbox_soeflag, &ett_ecat_mailbox_soe, - &ett_ecat_mailbox_fraghead + &ett_ecat_mailbox_fraghead, + &ett_ecat_mailbox_header }; proto_ecat_mailbox = proto_register_protocol("EtherCAT Mailbox Protocol", - "ECAT_MAILBOX","ecat_mailbox"); - proto_register_field_array(proto_ecat_mailbox,hf,array_length(hf)); - proto_register_subtree_array(ett,array_length(ett)); + "ECAT_MAILBOX", "ecat_mailbox"); + proto_register_field_array(proto_ecat_mailbox, hf,array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); register_dissector("ecat_mailbox", dissect_ecat_mailbox, proto_ecat_mailbox); } diff --git a/plugins/ethercat/packet-ethercat-datagram.c b/plugins/ethercat/packet-ethercat-datagram.c index debd76ddf7..96bec0d1dc 100644 --- a/plugins/ethercat/packet-ethercat-datagram.c +++ b/plugins/ethercat/packet-ethercat-datagram.c @@ -46,25 +46,26 @@ #include "packet-ethercat-datagram.h" #include "packet-ecatmb.h" - void proto_reg_handoff_ecat(void); +static heur_dissector_list_t heur_subdissector_list; static dissector_handle_t ecat_mailbox_handle; -/* Define the ethercat proto */ +/* Define the EtherCAT proto */ static int proto_ecat_datagram = -1; -/* Define the tree for ethercat */ +/* Define the tree for EtherCAT */ static int ett_ecat = -1; -static int ett_ecat_summary = -1; -static int ett_ecat_sub; static int ett_ecat_header = -1; -static int ett_ecat_fmmu = -1; static int ett_ecat_syncman = -1; static int ett_ecat_syncflag = -1; +static int ett_ecat_fmmu = -1; static int ett_ecat_fmmu_type = -1; static int ett_ecat_fmmu_active = -1; static int ett_ecat_dc = -1; +static int ett_ecat_length = -1; +static int ett_ecat_padding = -1; +static int ett_ecat_datagram_subtree = -1; static int hf_ecat_sub; static int hf_ecat_sub_data[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; @@ -128,28 +129,74 @@ static int hf_ecat_dc_diff_cd = -1; static int hf_ecat_dc_diff_ba = -1; static int hf_ecat_dc_diff_ca = -1; +static int hf_ecat_length_len = -1; +static int hf_ecat_length_r = -1; +static int hf_ecat_length_c = -1; +static int hf_ecat_length_m = -1; + +static int hf_ecat_padding = -1; -static const value_string EcCmd[] = +static const value_string EcCmdShort[] = { - { 0, "NOP", }, - { 1, "APRD", }, - { 2, "APWR", }, - { 3, "APRW", }, - { 4, "FPRD", }, - { 5, "FPWR", }, - { 6, "FPRW", }, - { 7, "BRD", }, - { 8, "BWR", }, - { 9, "BRW", }, - { 10, "LRD", }, - { 11, "LWR", }, - { 12, "LRW", }, - { 13, "ARMW", }, - { 14, "FRMW", }, - { 255, "EXT", }, + { 0, "NOP" }, + { 1, "APRD" }, + { 2, "APWR" }, + { 3, "APRW" }, + { 4, "FPRD" }, + { 5, "FPWR" }, + { 6, "FPRW" }, + { 7, "BRD" }, + { 8, "BWR" }, + { 9, "BRW" }, + { 10, "LRD" }, + { 11, "LWR" }, + { 12, "LRW" }, + { 13, "ARMW" }, + { 14, "FRMW" }, + { 255, "EXT" }, { 0, NULL } }; +static const value_string EcCmdLong[] = +{ + { 0, "No operation" }, + { 1, "Auto increment read" }, + { 2, "Auto increment write" }, + { 3, "Auto increment read write" }, + { 4, "Configured address read" }, + { 5, "Configured address write" }, + { 6, "Configured address read write" }, + { 7, "Broadcast read" }, + { 8, "Broadcast write" }, + { 9, "Broadcast read write" }, + { 10, "Logical memory read" }, + { 11, "Logical memory write" }, + { 12, "Logical memory read write" }, + { 13, "Auto increment read multiple write" }, + { 14, "Configured read multiple write" }, + { 255, "EXT" }, + { 0, NULL } +}; + +static const value_string ecat_subframe_reserved_vals[] = +{ + { 0, "Valid"}, + { 0, NULL} +}; + +static const value_string ecat_subframe_circulating_vals[] = +{ + { 0, "Frame is not circulating" }, + { 1, "Frame has circulated once" }, + { 0, NULL } +}; + +static const value_string ecat_subframe_more_vals[] = +{ + { 0, "Last EtherCAT datagram"}, + { 1, "More EtherCAT datagrams will follow"}, + { 0, NULL} +}; static const true_false_string tfs_ecat_fmmu_typeread = { @@ -226,9 +273,9 @@ static const true_false_string tfs_ecat_syncman_flag16 = "SyncMan enabled", "SyncMan disabled", }; -static const char* convertEcCmdToText(int cmd) +static const char* convertEcCmdToText(int cmd, const value_string ec_cmd[]) { - return val_to_str(cmd, EcCmd, "<UNKNOWN: %d>"); + return val_to_str(cmd, ec_cmd, "<UNKNOWN: %d>"); } #define ENDOF(p) ((p)+1) /* pointer to end of *p*/ @@ -326,30 +373,30 @@ static void EcSummaryFormater(guint32 datalength, tvbuff_t *tvb, gint offset, ch { guint16 len = ecFirst.len&0x07ff; guint16 cnt = get_wc(&ecFirst, tvb, offset); - g_snprintf ( szText, nMax, "'%s', Len: %d, Adp 0x%x, Ado 0x%x, Wc %d ", - convertEcCmdToText(ecFirst.cmd), len, ecFirst.anAddrUnion.a.adp, ecFirst.anAddrUnion.a.ado, cnt ); + g_snprintf ( szText, nMax, "'%s': Len: %d, Adp 0x%x, Ado 0x%x, Wc %d ", + convertEcCmdToText(ecFirst.cmd, EcCmdShort), len, ecFirst.anAddrUnion.a.adp, ecFirst.anAddrUnion.a.ado, cnt ); } else if ( nSub == 2 ) { - g_snprintf ( szText, nMax, "%d Cmds, '%s', Len %d, '%s', Len %d ", - nSub, convertEcCmdToText(nCmds[0]), nLens[0], convertEcCmdToText(nCmds[1]), nLens[1]); + g_snprintf ( szText, nMax, "%d Cmds, '%s': len %d, '%s': len %d ", + nSub, convertEcCmdToText(nCmds[0], EcCmdShort), nLens[0], convertEcCmdToText(nCmds[1], EcCmdShort), nLens[1]); } else if ( nSub == 3 ) { - g_snprintf ( szText, nMax, "%d Cmds, '%s', Len %d, '%s', Len %d, '%s', Len %d", - nSub, convertEcCmdToText(nCmds[0]), nLens[0], convertEcCmdToText(nCmds[1]), nLens[1], convertEcCmdToText(nCmds[2]), nLens[2]); + g_snprintf ( szText, nMax, "%d Cmds, '%s': len %d, '%s': len %d, '%s': len %d", + nSub, convertEcCmdToText(nCmds[0], EcCmdShort), nLens[0], convertEcCmdToText(nCmds[1], EcCmdShort), nLens[1], convertEcCmdToText(nCmds[2], EcCmdShort), nLens[2]); } else if ( nSub == 4 ) { - g_snprintf ( szText, nMax, "%d Cmds, '%s', L %d, '%s', L %d, '%s', L %d, '%s', L %d", - nSub, convertEcCmdToText(nCmds[0]), nLens[0], convertEcCmdToText(nCmds[1]), nLens[1], convertEcCmdToText(nCmds[2]), nLens[2], convertEcCmdToText(nCmds[3]), nLens[3]); + g_snprintf ( szText, nMax, "%d Cmds, '%s': len %d, '%s': len %d, '%s': len %d, '%s': len %d", + nSub, convertEcCmdToText(nCmds[0], EcCmdShort), nLens[0], convertEcCmdToText(nCmds[1], EcCmdShort), nLens[1], convertEcCmdToText(nCmds[2], EcCmdShort), nLens[2], convertEcCmdToText(nCmds[3], EcCmdShort), nLens[3]); } else g_snprintf ( szText, nMax, "%d Cmds, SumLen %d, '%s'... ", - nSub, nLen, convertEcCmdToText(ecFirst.cmd)); + nSub, nLen, convertEcCmdToText(ecFirst.cmd, EcCmdShort)); } -static void EcSubFormater(tvbuff_t *tvb, gint offset, char *szText, gint nMax) +static void EcSubFormatter(tvbuff_t *tvb, gint offset, char *szText, gint nMax) { EcParserHDR ecParser; guint16 len, cnt; @@ -372,41 +419,39 @@ static void EcSubFormater(tvbuff_t *tvb, gint offset, char *szText, gint nMax) case EC_CMD_TYPE_BRW: case EC_CMD_TYPE_ARMW: case EC_CMD_TYPE_FRMW: - g_snprintf ( szText, nMax, "Sub Frame: Cmd: '%s' (%d), Len: %d, Adp 0x%x, Ado 0x%x, Cnt %d", - convertEcCmdToText(ecParser.cmd), ecParser.cmd, len, ecParser.anAddrUnion.a.adp, ecParser.anAddrUnion.a.ado, cnt); + g_snprintf ( szText, nMax, "EtherCAT datagram: Cmd: '%s' (%d), Len: %d, Adp 0x%x, Ado 0x%x, Cnt %d", + convertEcCmdToText(ecParser.cmd, EcCmdShort), ecParser.cmd, len, ecParser.anAddrUnion.a.adp, ecParser.anAddrUnion.a.ado, cnt); break; case EC_CMD_TYPE_LRD: case EC_CMD_TYPE_LWR: case EC_CMD_TYPE_LRW: - g_snprintf ( szText, nMax, "Sub Frame: Cmd: '%s' (%d), Len: %d, Addr 0x%x, Cnt %d", - convertEcCmdToText(ecParser.cmd), ecParser.cmd, len, ecParser.anAddrUnion.addr, cnt); + g_snprintf ( szText, nMax, "EtherCAT datagram: Cmd: '%s' (%d), Len: %d, Addr 0x%x, Cnt %d", + convertEcCmdToText(ecParser.cmd, EcCmdShort), ecParser.cmd, len, ecParser.anAddrUnion.addr, cnt); break; case EC_CMD_TYPE_EXT: - g_snprintf ( szText, nMax, "Sub Frame: Cmd: 'EXT' (%d), Len: %d", ecParser.cmd, len); + g_snprintf ( szText, nMax, "EtherCAT datagram: Cmd: 'EXT' (%d), Len: %d", ecParser.cmd, len); break; default: - g_snprintf ( szText, nMax, "Sub Frame: Cmd: 'Unknown' (%d), Len: %d", ecParser.cmd, len); + g_snprintf ( szText, nMax, "EtherCAT datagram: Cmd: 'Unknown' (%d), Len: %d", ecParser.cmd, len); } } -static void EcLenFormater(guint16 len, char *szText, gint nMax) -{ - g_snprintf( szText, nMax, "(0x%x) - %s - %s", len&0x07ff, len&0x4000 ? "Roundtrip" : "No Roundtrip", len&0x8000 ? "More Follows...":"Last Sub Command" ); -} - /* Ethercat Datagram */ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { tvbuff_t *next_tvb; proto_item *ti, *aitem; - proto_tree *ecat_tree = NULL; - gint offset = 0; + proto_tree *ecat_datagrams_tree = NULL; + guint offset = 0; char szText[200]; int nMax = sizeof(szText)-1; guint b; - guint32 ecLength=0; + guint ecLength=0; guint subCount = 0; + const guint datagram_length = tvb_length_remaining(tvb, offset); + guint datagram_padding_bytes = 0; + EcParserHDR ecHdr; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "ECAT"); @@ -414,14 +459,26 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree if (check_col(pinfo->cinfo, COL_INFO)) col_clear(pinfo->cinfo, COL_INFO); - while ( TRUE ) + /* If the data portion of an EtherCAT datagram is less than 44 bytes, then + it must have been padded with an additional n number of bytes to reach a + total Ethernet frame length of 64 bytes (Ethernet header + Ethernet Data + + FCS). Hence at least 44 bytes data shall always be available in any + EtherCAT datagram. */ + tvb_ensure_bytes_exist(tvb, offset, 44); + + /* Count the length of the individual EtherCAT datagrams (sub datagrams) + that are part of this EtherCAT frame. Stop counting when the current + sub datagram header tells that there are no more sub datagrams or when + there is no more data available in the PDU. */ + do { - EcParserHDR ecHdr; init_EcParserHDR(&ecHdr, tvb, ecLength); - ecLength+=get_cmd_len(&ecHdr); - if ( (ecHdr.len&0x8000) == 0 ) - break; - } + ecLength += get_cmd_len(&ecHdr); + } while ((ecLength < datagram_length) && + (ecHdr.len & 0x8000)); + + /* Calculate the amount of padding data available in the PDU */ + datagram_padding_bytes = datagram_length - ecLength; EcSummaryFormater(ecLength, tvb, offset, szText, nMax); if (check_col(pinfo->cinfo, COL_INFO)) @@ -429,35 +486,37 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree if( tree ) { + /* Create the EtherCAT datagram(s) subtree */ ti = proto_tree_add_item(tree, proto_ecat_datagram, tvb, 0, -1, TRUE); - ecat_tree = proto_item_add_subtree(ti, ett_ecat); + ecat_datagrams_tree = proto_item_add_subtree(ti, ett_ecat); - proto_item_append_text(ti,": %s",szText); + proto_item_append_text(ti,": %s", szText); } - while ( TRUE ) + /* Dissect all sub frames of this EtherCAT PDU */ + do { - proto_tree *ecat_sub_tree = 0, *ecat_header_tree, *ecat_fmmu_tree, *ecat_fmmu_active_tree, - *ecat_fmmu_type_tree, *ecat_syncman_tree, *ecat_syncflag_tree, *ecat_dc_tree; + proto_tree *ecat_datagram_tree = NULL, *ecat_header_tree = NULL, *ecat_fmmu_tree = NULL, + *ecat_fmmu_active_tree = NULL, *ecat_fmmu_type_tree = NULL, *ecat_syncman_tree = NULL, + *ecat_syncflag_tree = NULL, *ecat_dc_tree = NULL; gint bMBox = FALSE; guint32 subsize; guint32 suboffset; guint32 len; + ETHERCAT_MBOX_HEADER mbox; - EcParserHDR ecHdr; suboffset = offset; init_EcParserHDR(&ecHdr, tvb, suboffset); subsize = get_cmd_len(&ecHdr); - len = ecHdr.len&0x07ff; + len = ecHdr.len & 0x07ff; if ( len >= sizeof(ETHERCAT_MBOX_HEADER_LEN) && - (ecHdr.cmd==EC_CMD_TYPE_FPWR || ecHdr.cmd==EC_CMD_TYPE_FPRD || ecHdr.cmd==EC_CMD_TYPE_APWR || ecHdr.cmd==EC_CMD_TYPE_APRD) && - ecHdr.anAddrUnion.a.ado>=0x1000 + (ecHdr.cmd==EC_CMD_TYPE_FPWR || ecHdr.cmd==EC_CMD_TYPE_FPRD || ecHdr.cmd==EC_CMD_TYPE_APWR || ecHdr.cmd==EC_CMD_TYPE_APRD) && + ecHdr.anAddrUnion.a.ado>=0x1000 ) { - ETHERCAT_MBOX_HEADER mbox; init_mbx_header(&mbox, tvb, suboffset+EcParserHDR_Len); switch ( mbox.aControlUnion.v.Type ) @@ -477,15 +536,15 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree if( tree ) { - aitem = proto_tree_add_item(ecat_tree, hf_ecat_sub, tvb, suboffset, subsize, TRUE); - EcSubFormater(tvb, suboffset, szText, nMax); - proto_item_set_text(aitem,szText); - - ecat_sub_tree = proto_item_add_subtree(aitem, ett_ecat_sub); - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_header, tvb, suboffset, EcParserHDR_Len, TRUE); - proto_item_set_text(aitem, "Header"); + /* Create the sub tree for the current datagram */ + EcSubFormatter(tvb, suboffset, szText, nMax); + aitem = proto_tree_add_text(ecat_datagrams_tree, tvb, suboffset, subsize, szText); + ecat_datagram_tree = proto_item_add_subtree(aitem, ett_ecat_datagram_subtree); + /* Create a subtree placeholder for the Header */ + aitem = proto_tree_add_text(ecat_datagram_tree, tvb, offset, EcParserHDR_Len, "Header"); ecat_header_tree = proto_item_add_subtree(aitem, ett_ecat_header); + aitem = proto_tree_add_item(ecat_header_tree, hf_ecat_cmd, tvb, suboffset, sizeof(ecHdr.cmd), TRUE); if( subCount < 10 ) aitem = proto_tree_add_item_hidden(ecat_header_tree, hf_ecat_sub_cmd[subCount], tvb, suboffset, sizeof(ecHdr.cmd), TRUE); @@ -520,11 +579,23 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree suboffset+= sizeof(ecHdr.anAddrUnion.a.ado); } - aitem = proto_tree_add_uint(ecat_header_tree, hf_ecat_len, tvb, suboffset, sizeof(ecHdr.len), ecHdr.len&0x07FF); - EcLenFormater(ecHdr.len, szText, nMax); - proto_item_append_text(aitem,szText); + { + proto_tree *length_sub_tree; + + /* Add information about the length field (11 bit length, 3 bits + reserved, 1 bit circulating frame and 1 bit more in a sub tree */ + aitem = proto_tree_add_text(ecat_header_tree, tvb, suboffset, sizeof(ecHdr.len), + "Length : %d (0x%x) - %s - %s", + len, len, ecHdr.len & 0x4000 ? "Roundtrip" : "No Roundtrip", ecHdr.len & 0x8000 ? "More Follows..." : "Last Sub Command"); + length_sub_tree = proto_item_add_subtree(aitem, ett_ecat_length); + + proto_tree_add_item(length_sub_tree, hf_ecat_length_len, tvb, suboffset, sizeof(ecHdr.len), TRUE); + proto_tree_add_item(length_sub_tree, hf_ecat_length_r, tvb, suboffset, sizeof(ecHdr.len), TRUE); + proto_tree_add_item(length_sub_tree, hf_ecat_length_c, tvb, suboffset, sizeof(ecHdr.len), TRUE); + proto_tree_add_item(length_sub_tree, hf_ecat_length_m, tvb, suboffset, sizeof(ecHdr.len), TRUE); - suboffset+= sizeof(ecHdr.len); + suboffset+= sizeof(ecHdr.len); + } aitem = proto_tree_add_item(ecat_header_tree, hf_ecat_int, tvb, suboffset, sizeof(ecHdr.intr), TRUE); suboffset+= sizeof(ecHdr.intr); @@ -538,11 +609,11 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree { if( tree ) { - /* FMMU */ + /* Fieldbus Memory Management Units (FMMU) */ for ( b=0; b < MIN(16, len/16); b++ ) { - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_fmmu, tvb, suboffset, 16, TRUE); - proto_item_set_text(aitem, "FMMU"); + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_fmmu, tvb, suboffset, 16, TRUE); + proto_item_set_text(aitem, "Fieldbus Memory Management Units (FMMU)"); ecat_fmmu_tree = proto_item_add_subtree(aitem, ett_ecat_fmmu); @@ -573,9 +644,9 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree if ( len > 0x100 ) { len -= 0x100; - for ( b=0; b < MIN(32, len/8); b++ ) + for (b = 0; b < MIN(32, len / 8); b++) { - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_syncman, tvb, suboffset, 8, TRUE); + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_syncman, tvb, suboffset, 8, TRUE); proto_item_set_text(aitem, "SyncManager"); ecat_syncman_tree = proto_item_add_subtree(aitem, ett_ecat_syncman); @@ -607,10 +678,10 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree { if( tree ) { - /* SyncMan*/ - for ( b=0; b < MIN(32, len/8); b++ ) + /* SyncManager */ + for (b = 0; b < MIN(32, len / 8); b++) { - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_syncman, tvb, suboffset, 8, TRUE); + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_syncman, tvb, suboffset, 8, TRUE); proto_item_set_text(aitem, "SyncManager"); ecat_syncman_tree = proto_item_add_subtree(aitem, ett_ecat_syncman); @@ -644,110 +715,128 @@ static void dissect_ecat_datagram(tvbuff_t *tvb, packet_info *pinfo, proto_tree guint32 pDC[4]; init_dc_measure(pDC, tvb, suboffset); - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_data, tvb, suboffset, ecHdr.len & 0x07ff, TRUE); - ecat_dc_tree = proto_item_add_subtree(aitem, ett_ecat_dc); + /* Allow sub dissectors to have a chance with this data */ + if(!dissector_try_heuristic(heur_subdissector_list, tvb, pinfo, ecat_datagram_tree)) + { + /* No sub dissector did recognize this data, dissect it as data only */ + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_data, tvb, suboffset, ecHdr.len & 0x07ff, TRUE); + ecat_dc_tree = proto_item_add_subtree(aitem, ett_ecat_dc); + } + else + { + /* A sub dissector handled the data, allow the rest of the + to add data to the correct place in the tree hierarchy. */ + ecat_dc_tree = ecat_datagram_tree; + } if( subCount < 10 ) - aitem = proto_tree_add_item_hidden(ecat_sub_tree, hf_ecat_sub_data[subCount], tvb, offset + EcParserHDR_Len, ecHdr.len & 0x07ff, TRUE); + aitem = proto_tree_add_item_hidden(ecat_datagram_tree, hf_ecat_sub_data[subCount], tvb, offset + EcParserHDR_Len, ecHdr.len & 0x07ff, TRUE); if ( pDC[3] != 0 ) { - proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_da, tvb, suboffset, 4, pDC[3]-pDC[0]); + proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_da, tvb, suboffset, 4, pDC[3] - pDC[0]); if( subCount < 10 ) - proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_da[subCount], tvb, suboffset, 4, pDC[3]-pDC[0]); + proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_da[subCount], tvb, suboffset, 4, pDC[3] - pDC[0]); if ( pDC[1] != 0 ) { - proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_bd, tvb, suboffset, 4, pDC[1]-pDC[3]); + proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_bd, tvb, suboffset, 4, pDC[1] - pDC[3]); if( subCount < 10 ) - proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_bd[subCount], tvb, suboffset, 4, pDC[1]-pDC[3]); + proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_bd[subCount], tvb, suboffset, 4, pDC[1] - pDC[3]); } else if ( pDC[2] != 0 ) { - proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_cd, tvb, suboffset, 4, pDC[2]-pDC[3]); + proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_cd, tvb, suboffset, 4, pDC[2] - pDC[3]); if( subCount < 10 ) - proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_cd[subCount], tvb, suboffset, 4, pDC[2]-pDC[3]); + proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_cd[subCount], tvb, suboffset, 4, pDC[2] - pDC[3]); } } if ( pDC[1] != 0 ) { - proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_ba, tvb, suboffset, 4, pDC[1]-pDC[0]); + proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_ba, tvb, suboffset, 4, pDC[1] - pDC[0]); if( subCount < 10 ) - proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_ba[subCount], tvb, suboffset, 4, pDC[1]-pDC[0]); + proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_ba[subCount], tvb, suboffset, 4, pDC[1] - pDC[0]); if ( pDC[2] != 0 ) { - proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_cb, tvb, suboffset, 4, pDC[2]-pDC[1]); + proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_cb, tvb, suboffset, 4, pDC[2] - pDC[1]); if( subCount < 10 ) - proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_cb[subCount], tvb, suboffset, 4, pDC[2]-pDC[1]); + proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_cb[subCount], tvb, suboffset, 4, pDC[2] - pDC[1]); } } else if ( pDC[2] != 0 ) { - proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_ca, tvb, suboffset, 4, pDC[2]-pDC[0]); + proto_tree_add_uint(ecat_dc_tree, hf_ecat_dc_diff_ca, tvb, suboffset, 4, pDC[2] - pDC[0]); if( subCount < 10 ) - proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_ca[subCount], tvb, suboffset, 4, pDC[2]-pDC[0]); + proto_tree_add_uint_hidden(ecat_dc_tree, hf_ecat_sub_dc_diff_ca[subCount], tvb, suboffset, 4, pDC[2] - pDC[0]); } } } else if ( bMBox ) { - next_tvb = tvb_new_subset(tvb, suboffset, -1, -1); - call_dissector( ecat_mailbox_handle, next_tvb, pinfo, ecat_sub_tree); + const guint MBoxLength = mbox.Length + 6 /* MBOX header length */; + + next_tvb = tvb_new_subset(tvb, suboffset, MBoxLength, MBoxLength); + call_dissector(ecat_mailbox_handle, next_tvb, pinfo, ecat_datagram_tree); if( tree ) { - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_data, tvb, offset + EcParserHDR_Len, ecHdr.len & 0x07ff, TRUE); + const guint startOfData = offset + EcParserHDR_Len + MBoxLength; + const guint dataLength = ((ecHdr.len & 0x7ff) - startOfData) + EcParserHDR_Len; + + /* Allow sub dissectors to have a chance with this data */ + if(!dissector_try_heuristic(heur_subdissector_list, tvb, pinfo, ecat_datagram_tree)) + { + /* No sub dissector did recognize this data, dissect it as data only */ + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_data, tvb, startOfData, dataLength, TRUE); + } + if( subCount < 10 ) - aitem = proto_tree_add_item_hidden(ecat_sub_tree, hf_ecat_sub_data[subCount], tvb, offset + EcParserHDR_Len, ecHdr.len & 0x07ff, TRUE); + aitem = proto_tree_add_item_hidden(ecat_datagram_tree, hf_ecat_sub_data[subCount], tvb, startOfData, dataLength, TRUE); } } else { if( tree ) { - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_data, tvb, suboffset, ecHdr.len & 0x07ff, TRUE); - switch ( len ) + /* Allow sub dissectors to have a chance with this data */ + if(!dissector_try_heuristic(heur_subdissector_list, tvb, pinfo, ecat_datagram_tree)) { - case 1: - g_snprintf ( szText, nMax, "(0x%x)", tvb_get_guint8(tvb, suboffset)); - proto_item_append_text(aitem, szText); - break; - case 2: - g_snprintf ( szText, nMax, "(0x%x)", tvb_get_letohs(tvb, suboffset)); - proto_item_append_text(aitem, szText); - break; - case 4: - g_snprintf ( szText, nMax, "(0x%x)", tvb_get_letohl(tvb, suboffset)); - proto_item_append_text(aitem, szText); - break; + /* No sub dissector did recognize this data, dissect it as data only */ + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_data, tvb, suboffset, ecHdr.len & 0x07ff, TRUE); } + if( subCount < 10 ) - aitem = proto_tree_add_item_hidden(ecat_sub_tree, hf_ecat_sub_data[subCount], tvb, offset + EcParserHDR_Len, ecHdr.len & 0x07ff, TRUE); + aitem = proto_tree_add_item_hidden(ecat_datagram_tree, hf_ecat_sub_data[subCount], tvb, offset + EcParserHDR_Len, ecHdr.len & 0x07ff, TRUE); } } if( tree ) { - aitem = proto_tree_add_item(ecat_sub_tree, hf_ecat_cnt, tvb, offset + EcParserHDR_Len + len , 2, TRUE); + aitem = proto_tree_add_item(ecat_datagram_tree, hf_ecat_cnt, tvb, offset + EcParserHDR_Len + len , 2, TRUE); if( subCount < 10 ) - aitem = proto_tree_add_item_hidden(ecat_sub_tree, hf_ecat_sub_cnt[subCount], tvb, offset + EcParserHDR_Len + len , 2, TRUE); + aitem = proto_tree_add_item_hidden(ecat_datagram_tree, hf_ecat_sub_cnt[subCount], tvb, offset + EcParserHDR_Len + len , 2, TRUE); } - if ( (ecHdr.len&0x8000) == 0 ) - break; - offset+=subsize; subCount++; + } while((offset < datagram_length) && + (ecHdr.len & 0x8000)); + + /* Add information that states which portion of the PDU that is pad bytes. + These are added just to get an Ethernet frame size of at least 64 bytes, + which is required by the protocol specification */ + if(datagram_padding_bytes > 0) + { + proto_tree_add_item(tree, hf_ecat_padding, tvb, offset, tvb_length_remaining(tvb, offset), TRUE); } } - void proto_register_ecat(void) { static hf_register_info hf[] = { { &hf_ecat_sub, - { "Sub Frame", "ecat.sub", FT_BYTES, BASE_NONE, NULL, 0x0, + { "EtherCAT Frame", "ecat.sub", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } }, { &hf_ecat_header, @@ -800,7 +889,7 @@ void proto_register_ecat(void) }, { &hf_ecat_cnt, { "Working Cnt", "ecat.cnt", - FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } + FT_UINT16, BASE_DEC, NULL, 0x0, "The working counter is increased once for each addressed device if at least one byte/bit of the data was successfully read and/or written by that device, it is increased once for every operation made by that device - read/write/read and write", HFILL } }, { &hf_ecat_sub_cnt[0], { "Working Cnt", "ecat.sub1.cnt", @@ -844,47 +933,47 @@ void proto_register_ecat(void) }, { &hf_ecat_cmd, { "Command ", "ecat.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[0], { "Command ", "ecat.sub1.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[1], { "Command ", "ecat.sub2.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[2], { "Command ", "ecat.sub3.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[3], { "Command ", "ecat.sub4.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[4], { "Command ", "ecat.sub5.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[5], { "Command ", "ecat.sub6.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[6], { "Command ", "ecat.sub7.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[7], { "Command ", "ecat.sub8.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[8], { "Command ", "ecat.sub9.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_sub_cmd[9], { "Command ", "ecat.sub10.cmd", - FT_UINT8, BASE_HEX, VALS(EcCmd), 0x0, "", HFILL } + FT_UINT8, BASE_HEX, VALS(EcCmdLong), 0x0, "", HFILL } }, { &hf_ecat_idx, { "Index ", "ecat.idx", @@ -1530,27 +1619,51 @@ void proto_register_ecat(void) { &hf_ecat_sub_dc_diff_ca[9], { "DC C-A", "ecat.sub10.dc.dif.ca", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_ecat_length_len, + { "Length", "ecat.subframe.length", + FT_UINT16, BASE_DEC, NULL, 0x07ff, "", HFILL} + }, + { &hf_ecat_length_r, + { "Reserved", "ecat.subframe.reserved", + FT_UINT16, BASE_DEC, VALS(&ecat_subframe_reserved_vals), 0x3800, "", HFILL} + }, + { &hf_ecat_length_c, + { "Round trip", "ecat.subframe.circulating", + FT_UINT16, BASE_DEC, VALS(&ecat_subframe_circulating_vals), 0x4000, "", HFILL} + }, + { &hf_ecat_length_m, + { "Last indicator", "ecat.subframe.more", + FT_UINT16, BASE_DEC, VALS(&ecat_subframe_more_vals), 0x8000, "", HFILL} + }, + { &hf_ecat_padding, + { "Pad bytes", "ecat.subframe.pad_bytes", + FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL} } }; static gint *ett[] = { &ett_ecat, - &ett_ecat_summary, - &ett_ecat_sub, &ett_ecat_header, &ett_ecat_syncman, &ett_ecat_syncflag, &ett_ecat_fmmu, &ett_ecat_fmmu_type, &ett_ecat_fmmu_active, - &ett_ecat_dc + &ett_ecat_dc, + &ett_ecat_length, + &ett_ecat_padding, + &ett_ecat_datagram_subtree }; - proto_ecat_datagram = proto_register_protocol("EtherCAT datagram", - "ECAT","ecat"); - proto_register_field_array(proto_ecat_datagram,hf,array_length(hf)); - proto_register_subtree_array(ett,array_length(ett)); + proto_ecat_datagram = proto_register_protocol("EtherCAT datagram(s)", + "ECAT", "ecat"); + proto_register_field_array(proto_ecat_datagram, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + /* Sub dissector code */ + register_heur_dissector_list("ecat.data", &heur_subdissector_list); } /* The registration hand-off routing */ @@ -1561,7 +1674,7 @@ void proto_reg_handoff_ecat(void) /* Register this dissector as a sub dissector to EtherCAT frame based on ether type. */ ecat_handle = create_dissector_handle(dissect_ecat_datagram, proto_ecat_datagram); - dissector_add("ecatf.type", 1, ecat_handle); + dissector_add("ecatf.type", 1 /* EtherCAT type */, ecat_handle); ecat_mailbox_handle = find_dissector("ecat_mailbox"); } diff --git a/plugins/ethercat/packet-ethercat-frame.c b/plugins/ethercat/packet-ethercat-frame.c index 18e677563c..49c49064f0 100644 --- a/plugins/ethercat/packet-ethercat-frame.c +++ b/plugins/ethercat/packet-ethercat-frame.c @@ -57,17 +57,24 @@ static dissector_handle_t ethercat_frame_data_handle; /* Define the tree for the EtherCAT frame */ static int ett_ethercat_frame = -1; static int hf_ethercat_frame_length = -1; +static int hf_ethercat_frame_reserved = -1; static int hf_ethercat_frame_type = -1; static const value_string EthercatFrameTypes[] = { - { 1, "ECAT", }, + { 1, "EtherCAT command", }, { 2, "ADS", }, { 3, "RAW-IO", }, { 4, "NV", }, { 0, NULL } }; +static const value_string ethercat_frame_reserved_vals[] = +{ + { 0, "Valid"}, + { 1, "Invalid (must be zero for conformance with the protocol specification)"}, + { 0, NULL} +}; /* Ethercat Frame */ static void dissect_ethercat_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) @@ -94,16 +101,17 @@ static void dissect_ethercat_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree ethercat_frame_tree = proto_item_add_subtree(ti, ett_ethercat_frame); proto_tree_add_item(ethercat_frame_tree, hf_ethercat_frame_length, tvb, offset, EtherCATFrameParserHDR_Len, TRUE); + proto_tree_add_item(ethercat_frame_tree, hf_ethercat_frame_reserved, tvb, offset, EtherCATFrameParserHDR_Len, TRUE); proto_tree_add_item(ethercat_frame_tree, hf_ethercat_frame_type, tvb, offset, EtherCATFrameParserHDR_Len, TRUE); } hdr.hdr = tvb_get_letohs(tvb, offset); offset = EtherCATFrameParserHDR_Len; - /* The Ethercat frame header has now been processed, allow sub dissectors to + /* The EtherCAT frame header has now been processed, allow sub dissectors to handle the rest of the PDU. */ next_tvb = tvb_new_subset (tvb, offset, -1, -1); - if (!dissector_try_port (ethercat_frame_dissector_table, hdr.v.protocol, + if (!dissector_try_port(ethercat_frame_dissector_table, hdr.v.protocol, next_tvb, pinfo, tree)) { if (check_col (pinfo->cinfo, COL_PROTOCOL)) @@ -125,6 +133,13 @@ void proto_register_ethercat_frame(void) FT_UINT16, BASE_HEX, NULL, 0x07FF, "", HFILL } }, + + { &hf_ethercat_frame_reserved, + { "Reserved", "ecatf.reserved", + FT_UINT16, BASE_HEX, VALS(ðercat_frame_reserved_vals), 0x0800, + "", HFILL} + }, + { &hf_ethercat_frame_type, { "Type", "ecatf.type", FT_UINT16, BASE_HEX, VALS(EthercatFrameTypes), 0xF000, @@ -137,10 +152,10 @@ void proto_register_ethercat_frame(void) &ett_ethercat_frame }; - proto_ethercat_frame = proto_register_protocol("EtherCAT frame", + proto_ethercat_frame = proto_register_protocol("EtherCAT frame header", "ETHERCAT","ethercat"); proto_register_field_array(proto_ethercat_frame,hf,array_length(hf)); - proto_register_subtree_array(ett,array_length(ett)); + proto_register_subtree_array(ett, array_length(ett)); register_dissector("ecatf", dissect_ethercat_frame, proto_ethercat_frame); @@ -157,5 +172,6 @@ void proto_reg_handoff_ethercat_frame(void) ethercat_frame_handle = create_dissector_handle(dissect_ethercat_frame, proto_ethercat_frame); dissector_add("ethertype", ETHERTYPE_ECATF, ethercat_frame_handle); dissector_add("udp.port", ETHERTYPE_ECATF, ethercat_frame_handle); + dissector_add("tcp.port", ETHERTYPE_ECATF, ethercat_frame_handle); ethercat_frame_data_handle = find_dissector("data"); } |