From 07769dd88261b92ec23da010eccf835c3cfc1a2d Mon Sep 17 00:00:00 2001 From: martinm Date: Wed, 14 Feb 2007 15:41:43 +0000 Subject: Change fp_info struct to be more general by removing DCT2000-specific field. Also: - Fix a division-by-zero error in FP dissector - Correct the way DCT2000 IPPrim addresses and ports are dissected and displayed git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@20812 f5534014-38df-0310-8fa8-9805f1628bb7 --- epan/dissectors/packet-catapult-dct2000.c | 102 ++++++++++++++++++++++++------ epan/dissectors/packet-k12.c | 7 +- epan/dissectors/packet-umts_fp.c | 91 +++++++++++++++----------- epan/dissectors/packet-umts_fp.h | 20 ++++-- 4 files changed, 154 insertions(+), 66 deletions(-) (limited to 'epan/dissectors') diff --git a/epan/dissectors/packet-catapult-dct2000.c b/epan/dissectors/packet-catapult-dct2000.c index 53da620012..7d8916e50d 100644 --- a/epan/dissectors/packet-catapult-dct2000.c +++ b/epan/dissectors/packet-catapult-dct2000.c @@ -114,7 +114,7 @@ static void attach_fp_info(packet_info *pinfo, gboolean received, /* Look for the protocol data within an ipprim packet. Only set *data_offset if data field found. */ -static gboolean find_ipprim_data_offset(tvbuff_t *tvb, int *data_offset, +static gboolean find_ipprim_data_offset(tvbuff_t *tvb, int *data_offset, guint8 direction, guint32 *source_addr_offset, guint32 *dest_addr_offset, guint32 *source_port_offset, guint32 *dest_port_offset, port_type *type_of_port) @@ -160,24 +160,55 @@ static gboolean find_ipprim_data_offset(tvbuff_t *tvb, int *data_offset, if (tag == 0x31 && length >=4 && length <= 6) { - /* Dest IP address */ - *dest_addr_offset = offset; + /* Remote IP address */ + if (direction == 0) + { + /* Sent *to* remote, so dest */ + *dest_addr_offset = offset; + } + else + { + *source_addr_offset = offset; + } - /* Dest port follows (if present) */ + /* Remote port follows (if present) */ if (length > 4) { - *dest_port_offset = offset + 4; + if (direction == 0) + { + *dest_port_offset = offset + 4; + } + else + { + *source_port_offset = offset + 4; + } } } if (tag == 0x32 && length == 4) { - /* Source IP address */ - *source_addr_offset = offset; + /* Local IP address */ + if (direction == 0) + { + /* Sent *from* local, so source */ + *source_addr_offset = offset; + } + else + { + *dest_addr_offset = offset; + } } if (tag == 0x33 && length == 2) { - /* Get source port */ - *source_port_offset = offset; + /* Get local port */ + if (direction == 0) + { + /* Sent from local, so source */ + *source_port_offset = offset; + } + else + { + *dest_port_offset = offset; + } } /* Skip the following value */ @@ -474,17 +505,18 @@ void parse_outhdr_string(guchar *outhdr_string) dissector to use */ void attach_fp_info(packet_info *pinfo, gboolean received, const char *protocol_name, int variant) { - int i=0; - int chan; - int tf_start, num_chans_start; + int i=0; + int chan; + int tf_start, num_chans_start; + gint node_type; /* Allocate & zero struct */ - struct _fp_info *p_fp_info = se_alloc(sizeof(struct _fp_info)); + struct fp_info *p_fp_info = se_alloc(sizeof(struct fp_info)); if (!p_fp_info) { return; } - memset(p_fp_info, 0, sizeof(struct _fp_info)); + memset(p_fp_info, 0, sizeof(struct fp_info)); /* Check that the number of outhdr values looks sensible */ if (((strcmp(protocol_name, "fpiur_r5") == 0) && (outhdr_values_found != 2)) || @@ -519,22 +551,49 @@ void attach_fp_info(packet_info *pinfo, gboolean received, const char *protocol_ return; } - /* Variant number */ - p_fp_info->dct2000_variant = variant; + /* Release date is derived from variant number */ + /* Only R6 sub-versions currently influence format with a release */ + switch (p_fp_info->release) + { + case 6: + switch (variant % 256) + { + case 1: + p_fp_info->release_year = 2005; + p_fp_info->release_month = 6; + break; + case 2: + p_fp_info->release_year = 2005; + p_fp_info->release_month = 9; + break; + case 3: + default: + p_fp_info->release_year = 2006; + p_fp_info->release_month = 3; + break; + } + break; + + default: + p_fp_info->release_year = 0; + p_fp_info->release_month = 0; + } + /* Channel type */ p_fp_info->channel = outhdr_values[i++]; /* Node type */ - p_fp_info->node_type = outhdr_values[i++]; + node_type = outhdr_values[i++]; - p_fp_info->is_uplink = (( received && (p_fp_info->node_type == 2)) || - (!received && (p_fp_info->node_type == 1))); + p_fp_info->is_uplink = (( received && (node_type == 2)) || + (!received && (node_type == 1))); /* IUR only uses the above... */ if (strcmp(protocol_name, "fpiur_r5") == 0) { /* Store info in packet */ + p_fp_info->interface = IuR_Interface; p_add_proto_data(pinfo->fd, proto_fp, p_fp_info); return; } @@ -584,6 +643,9 @@ void attach_fp_info(packet_info *pinfo, gboolean received, const char *protocol_ } } + /* Interface must be IuB */ + p_fp_info->interface = IuB_Interface; + /* Store info in packet */ p_add_proto_data(pinfo->fd, proto_fp, p_fp_info); } @@ -801,7 +863,7 @@ dissect_catapult_dct2000(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) heur_protocol_handle = look_for_dissector(protocol_name); if ((heur_protocol_handle != 0) && - find_ipprim_data_offset(tvb, &offset, + find_ipprim_data_offset(tvb, &offset, direction, &source_addr_offset, &dest_addr_offset, &source_port_offset, &dest_port_offset, &type_of_port)) diff --git a/epan/dissectors/packet-k12.c b/epan/dissectors/packet-k12.c index ef98bf6613..380782d294 100644 --- a/epan/dissectors/packet-k12.c +++ b/epan/dissectors/packet-k12.c @@ -96,8 +96,11 @@ static void fill_fp_info(fp_info *p_fp_info, guchar *extra_info, guint length) { if (!p_fp_info || length < 22) return; - p_fp_info->release = 0; /* dummy */ - p_fp_info->dct2000_variant = 0; /* dummy */ + p_fp_info->interface = IuB_Interface; + + p_fp_info->release = 0; /* dummy */ + p_fp_info->release_year = 0; /* dummy */ + p_fp_info->release_month = 0; /* dummy */ /* 1=UL, 2=DL */ if (extra_info[15] == 1) diff --git a/epan/dissectors/packet-umts_fp.c b/epan/dissectors/packet-umts_fp.c index 1e56d67d99..cc201dc022 100644 --- a/epan/dissectors/packet-umts_fp.c +++ b/epan/dissectors/packet-umts_fp.c @@ -269,7 +269,7 @@ static const value_string common_control_frame_type_vals[] = { /* Dissect message parts */ static int dissect_tb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info, int *num_tbs); + int offset, struct fp_info *p_fp_info, int *num_tbs); static int dissect_macd_pdu_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, guint16 length, guint8 number_of_pdus); static int dissect_crci_bits(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, @@ -277,17 +277,17 @@ static int dissect_crci_bits(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree /* Dissect common control messages */ static void dissect_common_timing_adjustment(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_common_dl_node_synchronisation(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); static void dissect_common_ul_node_synchronisation(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); static void dissect_common_dl_syncronisation(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, - struct _fp_info *p_fp_info); + struct fp_info *p_fp_info); static void dissect_common_ul_syncronisation(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, - struct _fp_info *p_fp_info); + struct fp_info *p_fp_info); static void dissect_common_timing_advance(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); static void dissect_hsdpa_capacity_request(packet_info *pinfo, proto_tree *tree, @@ -295,27 +295,27 @@ static void dissect_hsdpa_capacity_request(packet_info *pinfo, proto_tree *tree, static void dissect_hsdpa_capacity_allocation(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); static void dissect_common_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_common_dynamic_pusch_assignment(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); /* Dissect common channel types */ static void dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_fach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_usch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_cpch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); static void dissect_iur_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info _U_); + int offset, struct fp_info *p_fp_info _U_); static void dissect_hsdsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); /* Dissect DCH control messages */ @@ -346,13 +346,16 @@ static void dissect_dch_control_frame(proto_tree *tree, packet_info *pinfo, tvbu /* Dissect a DCH channel */ static void dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); /* Dissect dedicated channels */ static void dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info); + int offset, struct fp_info *p_fp_info); + +/* Main dissection function */ static void dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +/* Protocol registration */ void proto_register_fp(void); void proto_reg_handoff_fp(void); @@ -361,7 +364,7 @@ void proto_reg_handoff_fp(void); /* Dissect the TBs of a data frame */ int dissect_tb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info, int *num_tbs) + int offset, struct fp_info *p_fp_info, int *num_tbs) { int chan; int bit_offset = 0; @@ -565,7 +568,7 @@ int dissect_crci_bits(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Common control message types */ void dissect_common_timing_adjustment(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { if (p_fp_info->channel != CHANNEL_PCH) { @@ -651,7 +654,7 @@ void dissect_common_ul_node_synchronisation(packet_info *pinfo, proto_tree *tree } void dissect_common_dl_syncronisation(packet_info *pinfo, proto_tree *tree, - tvbuff_t *tvb, int offset, struct _fp_info *p_fp_info) + tvbuff_t *tvb, int offset, struct fp_info *p_fp_info) { guint16 cfn; @@ -677,7 +680,7 @@ void dissect_common_dl_syncronisation(packet_info *pinfo, proto_tree *tree, } void dissect_common_ul_syncronisation(packet_info *pinfo, proto_tree *tree, - tvbuff_t *tvb, int offset, struct _fp_info *p_fp_info) + tvbuff_t *tvb, int offset, struct fp_info *p_fp_info) { dissect_common_timing_adjustment(pinfo, tree, tvb, offset, p_fp_info); } @@ -786,13 +789,18 @@ void dissect_hsdpa_capacity_allocation(packet_info *pinfo, proto_tree *tree, if (credits == 2047) { rate_ti = proto_tree_add_item(tree, hf_fp_hsdsch_unlimited_rate, tvb, 0, 0, FALSE); + PROTO_ITEM_SET_GENERATED(rate_ti); } else { - rate_ti = proto_tree_add_uint(tree, hf_fp_hsdsch_calculated_rate, tvb, 0, 0, - credits * max_pdu_length * (1000 / (interval*10))); + if (interval != 0) + { + rate_ti = proto_tree_add_uint(tree, hf_fp_hsdsch_calculated_rate, tvb, 0, 0, + credits * max_pdu_length * (1000 / (interval*10))); + PROTO_ITEM_SET_GENERATED(rate_ti); + } } - PROTO_ITEM_SET_GENERATED(rate_ti); + if (check_col(pinfo->cinfo, COL_INFO)) @@ -841,7 +849,7 @@ void dissect_common_dynamic_pusch_assignment(packet_info *pinfo, proto_tree *tre /* Dissect the control part of a common channel message */ void dissect_common_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { /* Common control frame type */ guint8 control_frame_type = tvb_get_guint8(tvb, offset); @@ -897,7 +905,7 @@ void dissect_common_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /**************************/ /* Dissect a RACH channel */ void dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; @@ -1021,7 +1029,7 @@ void dissect_rach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /**************************/ /* Dissect a FACH channel */ void dissect_fach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; @@ -1081,7 +1089,7 @@ void dissect_fach_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /**************************/ /* Dissect a DSCH channel */ void dissect_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; @@ -1174,7 +1182,7 @@ void dissect_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /**************************/ /* Dissect a USCH channel */ void dissect_usch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; @@ -1241,7 +1249,7 @@ void dissect_usch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /**************************/ /* Dissect a PCH channel */ void dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; guint16 pch_cfn; @@ -1314,7 +1322,7 @@ void dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre /**************************/ /* Dissect a CPCH channel */ void dissect_cpch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; @@ -1376,7 +1384,7 @@ void dissect_cpch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /********************************/ /* Dissect an IUR DSCH channel */ void dissect_iur_dsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info _U_) + int offset, struct fp_info *p_fp_info _U_) { gboolean is_control_frame; @@ -1610,7 +1618,7 @@ void dissect_dch_control_frame(proto_tree *tree, packet_info *pinfo, tvbuff_t *t /*******************************/ /* Dissect a DCH channel */ void dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; guint8 cfn; @@ -1689,7 +1697,7 @@ void dissect_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre /**********************************/ /* Dissect an E-DCH channel */ void dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; guint8 number_of_subframes; @@ -1730,8 +1738,9 @@ void dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t /* Number of subframes. This was 3 bits in early releases, is 4 bits offset by 1 in later releases */ - if (((p_fp_info->dct2000_variant / 256) >= 2) || - (p_fp_info->release > 6)) + if ((p_fp_info->release >= 6) && + ((p_fp_info->release_year > 2005) || + (p_fp_info->release_year == 2005 && p_fp_info->release_month >= 9))) { /* Use 4 bits plus offset of 1 */ number_of_subframes = (tvb_get_guint8(tvb, offset) & 0x0f) + 1; @@ -1970,7 +1979,7 @@ void dissect_e_dch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t /***********************************/ /* Dissect an HSDSCH channel */ void dissect_hsdsch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, struct _fp_info *p_fp_info) + int offset, struct fp_info *p_fp_info) { gboolean is_control_frame; @@ -2095,7 +2104,7 @@ void dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree *fp_tree; proto_item *ti; gint offset = 0; - struct _fp_info *p_fp_info; + struct fp_info *p_fp_info; /* Append this protocol name rather than replace. */ if (check_col(pinfo->cinfo, COL_PROTOCOL)) @@ -2135,6 +2144,12 @@ void dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) ti = proto_tree_add_uint(fp_tree, hf_fp_direction, tvb, 0, 0, p_fp_info->is_uplink); PROTO_ITEM_SET_GENERATED(ti); + /* Don't currently handle IuR-specific formats, but its useful to even see + the channel type and direction */ + if (p_fp_info->interface == IuR_Interface) + { + return; + } /*************************************/ /* Dissect according to channel type */ @@ -2166,7 +2181,6 @@ void dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case CHANNEL_CPCH: dissect_cpch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); break; - break; case CHANNEL_BCH: /* TODO? */ break; @@ -2174,8 +2188,10 @@ void dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_hsdsch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); break; case CHANNEL_IUR_CPCHF: + /* TODO: */ break; case CHANNEL_IUR_FACH: + /* TODO: */ break; case CHANNEL_IUR_DSCH: dissect_iur_dsch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info); @@ -2189,6 +2205,7 @@ void dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } + void proto_register_fp(void) { static hf_register_info hf[] = diff --git a/epan/dissectors/packet-umts_fp.h b/epan/dissectors/packet-umts_fp.h index c7013a7279..1874125579 100644 --- a/epan/dissectors/packet-umts_fp.h +++ b/epan/dissectors/packet-umts_fp.h @@ -42,14 +42,21 @@ #define CHANNEL_EDCH 17 #define CHANNEL_RACH_TDD_128 18 +enum fp_interface_type +{ + IuB_Interface, + IuR_Interface +}; + /* Info attached to each FP packet */ -struct _fp_info +typedef struct fp_info { - guint8 release; - guint dct2000_variant; + enum fp_interface_type interface; + guint8 release; /* e.g. 99, 4, 5, 6 */ + guint16 release_year; /* e.g. 2001 */ + guint8 release_month; /* e.g. 12 for December */ gboolean is_uplink; - gint channel; - gint node_type; + gint channel; /* see definitions above */ gboolean dch_crc_present; gint paging_indications; gint num_chans; @@ -61,6 +68,5 @@ struct _fp_info gint no_ddi_entries; guint8 edch_ddi[MAX_EDCH_DDIS]; guint edch_macd_pdu_size[MAX_EDCH_DDIS]; -}; +} fp_info; -typedef struct _fp_info fp_info; -- cgit v1.2.3