diff options
author | Roland Knall <roland.knall@br-automation.com> | 2015-10-23 13:40:29 +0200 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2015-10-25 00:28:25 +0000 |
commit | 5c97a4802fdec9013eaf8df8628cbd987bf33978 (patch) | |
tree | eab79ba21fa3325b2339ac0ad7c789f55967e780 | |
parent | 2d2b1294930e8a3d6963da688ae633e10c28fe50 (diff) |
epl: Remove usage of subnum
pinfo->fd->subnum is not used in a way as it was documented
in frame_data.h. This uses a more generic approach and also
frees subnum in this case
Change-Id: I3aee0ffcdf1948c97a2d2f95c868e636362664a1
Reviewed-on: https://code.wireshark.org/review/11225
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
-rw-r--r-- | epan/dissectors/packet-epl.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/epan/dissectors/packet-epl.c b/epan/dissectors/packet-epl.c index af3fcb53f5..27a8acc263 100644 --- a/epan/dissectors/packet-epl.c +++ b/epan/dissectors/packet-epl.c @@ -1659,6 +1659,29 @@ gboolean show_soc_flags = FALSE; /* Define the tap for epl */ /*static gint epl_tap = -1;*/ +guint16 +epl_get_sequence_nr(packet_info *pinfo) +{ + guint16 seqnum = 0x00; + gpointer data = NULL; + + if ( ( data = p_get_proto_data ( wmem_file_scope(), pinfo, proto_epl, ETHERTYPE_EPL_V2 ) ) == NULL ) + p_add_proto_data ( wmem_file_scope(), pinfo, proto_epl, ETHERTYPE_EPL_V2, GUINT_TO_POINTER(seqnum) ); + else + seqnum = GPOINTER_TO_UINT(data); + + return seqnum; +} + +void +epl_set_sequence_nr(packet_info *pinfo, guint16 seqnum) +{ + if ( p_get_proto_data ( wmem_file_scope(), pinfo, proto_epl, ETHERTYPE_EPL_V2 ) != NULL ) + p_remove_proto_data( wmem_file_scope(), pinfo, proto_epl, ETHERTYPE_EPL_V2 ); + + p_add_proto_data ( wmem_file_scope(), pinfo, proto_epl, ETHERTYPE_EPL_V2, GUINT_TO_POINTER(seqnum) ); +} + static void elp_version( gchar *result, guint32 version ) { @@ -2628,10 +2651,13 @@ dissect_epl_asnd_sres(proto_tree *epl_tree, tvbuff_t *tvb, packet_info *pinfo, g gint dissect_epl_asnd_sdo(proto_tree *epl_tree, tvbuff_t *tvb, packet_info *pinfo, gint offset) { + guint16 seqnum = 0x00; offset = dissect_epl_sdo_sequence(epl_tree, tvb, pinfo, offset); + seqnum = epl_get_sequence_nr(pinfo); + /* if a frame is duplicated don't show the command layer */ - if(pinfo->fd->subnum == 0x00 || show_cmd_layer_for_duplicated == TRUE ) + if(seqnum == 0x00 || show_cmd_layer_for_duplicated == TRUE ) { if (tvb_reported_length_remaining(tvb, offset) > 0) { @@ -2652,6 +2678,7 @@ dissect_epl_sdo_sequence(proto_tree *epl_tree, tvbuff_t *tvb, packet_info *pinfo guint8 duplication = 0x00; gpointer key; guint32 saved_frame; + guint16 seqnum = 0; /* read buffer */ seq_recv = tvb_get_guint8(tvb, offset); @@ -2684,7 +2711,7 @@ dissect_epl_sdo_sequence(proto_tree *epl_tree, tvbuff_t *tvb, packet_info *pinfo /* remove all the keys of the specified src and dest address*/ epl_duplication_remove(epl_duplication_table,epl_segmentation.src,epl_segmentation.dest); /* There is no cmd layer */ - pinfo->fd->subnum = 0x02; + epl_set_sequence_nr(pinfo, 0x02); } /* if cooked/fuzzed capture*/ else if(seq_recv >= EPL_MAX_SEQUENCE || seq_send >= EPL_MAX_SEQUENCE @@ -2707,7 +2734,7 @@ dissect_epl_sdo_sequence(proto_tree *epl_tree, tvbuff_t *tvb, packet_info *pinfo expert_add_info(pinfo, epl_tree, &ei_sendcon_value); } duplication = 0x00; - pinfo->fd->subnum = 0x00; + epl_set_sequence_nr(pinfo, 0x00); } else { @@ -2743,9 +2770,11 @@ dissect_epl_sdo_sequence(proto_tree *epl_tree, tvbuff_t *tvb, packet_info *pinfo } } /* if the frame is a duplicated frame */ - if((duplication == 0x01 && pinfo->fd->subnum == 0x00)||(pinfo->fd->subnum == 0x01)) + seqnum = epl_get_sequence_nr(pinfo); + if((duplication == 0x01 && seqnum == 0x00)||(seqnum == 0x01)) { - pinfo->fd->subnum = 0x01; + seqnum = 0x01; + epl_set_sequence_nr(pinfo, seqnum); expert_add_info_format(pinfo, epl_tree, &ei_duplicated_frame, "Duplication of Frame: %d ReceiveSequenceNumber: %d and SendSequenceNumber: %d ", saved_frame,seq_recv,seq_send ); |