diff options
author | Ulf Lamping <ulf.lamping@web.de> | 2006-12-05 08:09:01 +0000 |
---|---|---|
committer | Ulf Lamping <ulf.lamping@web.de> | 2006-12-05 08:09:01 +0000 |
commit | 1ce7261136c0a05398dbe29db1f07776e3e2d778 (patch) | |
tree | 2a0bbbe7098df8e96b4c163178df6d78215f4d05 /plugins | |
parent | f611704fd222939bc85c36c5ba474591d562ada4 (diff) | |
download | wireshark-1ce7261136c0a05398dbe29db1f07776e3e2d778.tar.gz |
add dissection of the "IsochronousModeData" block
svn path=/trunk/; revision=20045
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/profinet/packet-dcerpc-pn-io.c | 171 |
1 files changed, 130 insertions, 41 deletions
diff --git a/plugins/profinet/packet-dcerpc-pn-io.c b/plugins/profinet/packet-dcerpc-pn-io.c index 5245ad55c4..da83fa860c 100644 --- a/plugins/profinet/packet-dcerpc-pn-io.c +++ b/plugins/profinet/packet-dcerpc-pn-io.c @@ -300,6 +300,13 @@ static int hf_pn_io_error_power_budget = -1; static int hf_pn_io_fiber_optic = -1; static int hf_pn_io_fiber_optic_cable = -1; +static int hf_pn_io_controller_appl_cycle_factor = -1; +static int hf_pn_io_time_data_cycle = -1; +static int hf_pn_io_time_io_input = -1; +static int hf_pn_io_time_io_output = -1; +static int hf_pn_io_time_io_input_valid = -1; +static int hf_pn_io_time_io_output_valid = -1; + static gint ett_pn_io = -1; static gint ett_pn_io_block = -1; static gint ett_pn_io_block_header = -1; @@ -887,6 +894,7 @@ static const value_string pn_io_index[] = { { 0xAFFE, "I&M14" }, { 0xAFFF, "I&M15" }, /*0xB000 - 0xBFFF reserved for profiles */ + { 0xB02E, "Reserved for profiles"}, /* slot specific */ { 0xC000, "ExpectedIdentificationData for one slot" }, @@ -3055,6 +3063,55 @@ dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset, } +/* dissect the IsochronousModeData block */ +static int +dissect_IsochronousModeData(tvbuff_t *tvb, int offset, + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) +{ + guint16 u16SlotNr; + guint16 u16SubslotNr; + guint16 u16ControllerApplicationCycleFactor; + guint16 u16TimeDataCycle; + guint32 u32TimeIOInput; + guint32 u32TimeIOOutput; + guint32 u32TimeIOInputValid; + guint32 u32TimeIOOutputValid; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* SlotNumber */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_slot_nr, &u16SlotNr); + /* Subslotnumber */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_subslot_nr, &u16SubslotNr); + + /* ControllerApplicationCycleFactor */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_controller_appl_cycle_factor, &u16ControllerApplicationCycleFactor); + /* TimeDataCycle */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_time_data_cycle, &u16TimeDataCycle); + /* TimeIOInput (ns) */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_time_io_input, &u32TimeIOInput); + /* TimeIOOutput (ns) */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_time_io_output, &u32TimeIOOutput); + /* TimeIOInputValid (ns) */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_time_io_input_valid, &u32TimeIOInputValid); + /* TimeIOOutputValid (ns) */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_time_io_output_valid, &u32TimeIOOutputValid); + + + return offset+1; +} + + /* dissect one PN-IO block (depending on the block type) */ static int dissect_block(tvbuff_t *tvb, int offset, @@ -3112,6 +3169,10 @@ dissect_block(tvbuff_t *tvb, int offset, case(0x0002): dissect_AlarmNotification_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength); break; + case(0x0008): + case(0x0009): + dissect_ReadWrite_rqst_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen); + break; case(0x0010): dissect_DiagnosisBlock(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength); break; @@ -3140,37 +3201,6 @@ dissect_block(tvbuff_t *tvb, int offset, case(0x0114): dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x0008): - case(0x0009): - dissect_ReadWrite_rqst_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen); - break; - case(0x8001): - case(0x8002): - dissect_Alarm_ack_block(tvb, offset, pinfo, sub_tree, sub_item, drep); - break; - case(0x8008): - case(0x8009): - dissect_ReadWrite_resp_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen); - break; - case(0x8101): - dissect_ARBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); - break; - case(0x8102): - dissect_IOCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); - break; - case(0x8103): - dissect_AlarmCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); - break; - case(0x8104): - dissect_ModuleDiffBlock(tvb, offset, pinfo, sub_tree, sub_item, drep); - break; - case(0x8110): - case(0x8111): - case(0x8112): - case(0x8113): - case(0x8114): - dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep); - break; case(0x0200): case(0x0202): dissect_PDPortData_Check_Adjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength); @@ -3178,6 +3208,9 @@ dissect_block(tvbuff_t *tvb, int offset, case(0x0203): dissect_PDSyncData_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; + case(0x0204): + dissect_IsochronousModeData(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; case(0x0205): dissect_PDIRData_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; @@ -3190,39 +3223,66 @@ dissect_block(tvbuff_t *tvb, int offset, case(0x0209): dissect_AdjustDomainBoundary_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x20A): + case(0x020A): dissect_CheckPeers_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x20B): + case(0x020B): dissect_CheckPropagationDelayFactor_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x20C): + case(0x020C): dissect_CheckMAUType_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x20E): + case(0x020E): dissect_AdjustMAUType_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x20F): + case(0x020F): dissect_PDPortDataReal_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0210): dissect_AdjustMulticastBoundary_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x21B): + case(0x021B): dissect_AdjustPortState_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x21C): + case(0x021C): dissect_CheckPortState_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x222): + case(0x0222): dissect_PDPortFODataAdjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x223): + case(0x0223): dissect_PDPortFODataCheck_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; - case(0x230): + case(0x0230): dissect_PDNCDataCheck_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; + case(0x8001): + case(0x8002): + dissect_Alarm_ack_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x8008): + case(0x8009): + dissect_ReadWrite_resp_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen); + break; + case(0x8101): + dissect_ARBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x8102): + dissect_IOCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x8103): + dissect_AlarmCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x8104): + dissect_ModuleDiffBlock(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x8110): + case(0x8111): + case(0x8112): + case(0x8113): + case(0x8114): + dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; default: header_item = proto_tree_add_string_format(sub_tree, hf_pn_io_data, tvb, offset, u16BodyLength, "undecoded", "Undecoded Block Data: %d bytes", u16BodyLength); expert_add_info_format(pinfo, header_item, PI_UNDECODED, PI_WARN, @@ -3388,6 +3448,14 @@ dissect_RecordDataRead(tvbuff_t *tvb, int offset, return offset; } + /* "reserved for profiles" */ + if(u16Index == 0xb02e) { + item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", + "RecordDataRead: %d bytes - undecoded as index is reserved for profiles", u32RecDataLen); + offset += u32RecDataLen; + return offset; + } + /* see: pn_io_index */ switch(u16Index) { case(0x8001): /* RealIdentificationData */ @@ -3451,6 +3519,13 @@ dissect_RecordDataWrite(tvbuff_t *tvb, int offset, offset += u32RecDataLen; return offset; } + /* "reserved for profiles" */ + if(u16Index == 0xb02e) { + item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", + "RecordDataWrite: %d bytes - undecoded as index is reserved for profiles", u32RecDataLen); + offset += u32RecDataLen; + return offset; + } /* see: pn_io_index */ switch(u16Index) { @@ -3459,6 +3534,7 @@ dissect_RecordDataWrite(tvbuff_t *tvb, int offset, case(0x802d): /* PDSyncData */ case(0x802e): /* PDSyncData */ case(0x802f): /* PDPortDataAdjust */ + case(0x8030): /* IsochronousModeData */ case(0x8061): /* PDPortFODataCheck */ case(0x8062): /* PDPortFODataAdjust */ case(0x8070): /* PDNCDataCheck */ @@ -4242,6 +4318,19 @@ proto_register_pn_io (void) { "FiberOptic", "pn_io.fiber_optic", FT_UINT32, BASE_HEX, VALS(pn_io_fiber_optic), 0x0, "", HFILL }}, { &hf_pn_io_fiber_optic_cable, { "FiberOpticCable", "pn_io.fiber_optic_cable", FT_UINT32, BASE_HEX, VALS(pn_io_fiber_optic_cable), 0x0, "", HFILL }}, + + { &hf_pn_io_controller_appl_cycle_factor, + { "ControllerApplicationCycleFactor", "pn_io.controller_appl_cycle_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, + { &hf_pn_io_time_data_cycle, + { "TimeDataCycle", "pn_io.time_data_cycle", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, + { &hf_pn_io_time_io_input, + { "TimeIOInput", "pn_io.time_io_input", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }}, + { &hf_pn_io_time_io_output, + { "TimeIOOutput", "pn_io.time_io_output", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }}, + { &hf_pn_io_time_io_input_valid, + { "TimeIOInput", "pn_io.time_io_input_valid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }}, + { &hf_pn_io_time_io_output_valid, + { "TimeIOOutputValid", "pn_io.time_io_output_valid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }}, }; static gint *ett[] = { |