diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2013-06-12 16:59:59 +0000 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2013-06-12 16:59:59 +0000 |
commit | 0975d03e8df9b1dd24215ccec50fbb93d6f18a1f (patch) | |
tree | cf12d5d45948d43612123fbff35080adf945db08 /epan/dissectors/packet-gsm_sms.c | |
parent | 855870768130ba53bcaaa61b243b4ba79cf5edc1 (diff) |
Fix dissection of 3GPP2 SMS messages when the User Data Header field is present (for fragmented SMS)
svn path=/trunk/; revision=49910
Diffstat (limited to 'epan/dissectors/packet-gsm_sms.c')
-rw-r--r-- | epan/dissectors/packet-gsm_sms.c | 111 |
1 files changed, 59 insertions, 52 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c index a29529f44d..b695aaaf01 100644 --- a/epan/dissectors/packet-gsm_sms.c +++ b/epan/dissectors/packet-gsm_sms.c @@ -2576,6 +2576,63 @@ dis_field_ud_iei(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length) } } +void +dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length, + guint8 *udl, gboolean uncomp_7bits, guint8 *fill_bits) +{ + guint8 oct; + proto_item *udh_item; + proto_tree *udh_subtree = NULL; + static guint8 fill_bits_mask[7] = { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f }; + + /* step over header */ + + oct = tvb_get_guint8(tvb, *offset); + + udh_item = + proto_tree_add_text(tree, tvb, + *offset, oct + 1, + "User-Data Header"); + + udh_subtree = proto_item_add_subtree(udh_item, ett_udh); + + proto_tree_add_text(udh_subtree, + tvb, *offset, 1, + "User Data Header Length (%u)", + oct); + + (*offset)++; + (*length)--; + + dis_field_ud_iei(tvb, udh_subtree, *offset, oct); + + *offset += oct; + *length -= oct; + + if (uncomp_7bits) + { + /* step over fill bits ? */ + + *fill_bits = 6 - ((oct * 8) % 7); + *udl -= (((oct + 1)*8) + *fill_bits) / 7; + if (*fill_bits) + { + oct = tvb_get_guint8(tvb, *offset); + + other_decode_bitfield_value(bigbuf, oct, fill_bits_mask[*fill_bits], 8); + proto_tree_add_text(udh_subtree, + tvb, *offset, 1, + "%s : Fill bits", + bigbuf); + /* Note: Could add an expert item here if ((oct & fill_bits_mask[*fill_bits]) != 0) */ + } + } + else + { + *udl -= oct + 1; + } +} + /* 9.2.3.24 */ #define SMS_MAX_MESSAGE_SIZE 160 static char messagebuf[SMS_MAX_MESSAGE_SIZE+1]; @@ -2583,15 +2640,11 @@ static void dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, gboolean udhi, guint8 udl, gboolean seven_bit, gboolean eight_bit, gboolean ucs2, gboolean compressed) { - static guint8 fill_bits_mask[7] = - { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f }; proto_item *item; - proto_item *udh_item; proto_tree *subtree = NULL; - proto_tree *udh_subtree = NULL; tvbuff_t *sm_tvb = NULL; fragment_data *fd_sm = NULL; - guint8 oct, fill_bits; + guint8 fill_bits; guint32 out_len, total_sms_len, len_sms, length_ucs2, i; char *ustr; proto_item *ucs2_item; @@ -2616,55 +2669,9 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset "TP-User-Data"); subtree = proto_item_add_subtree(item, ett_ud); - oct = tvb_get_guint8(tvb, offset); - if (udhi) { - - /* step over header */ - - udh_item = - proto_tree_add_text(subtree, tvb, - offset, oct + 1, - "User-Data Header"); - - udh_subtree = proto_item_add_subtree(udh_item, ett_udh); - - proto_tree_add_text(udh_subtree, - tvb, offset, 1, - "User Data Header Length (%u)", - oct); - - offset++; - length--; - - dis_field_ud_iei(tvb, udh_subtree, offset, oct); - - offset += oct; - length -= oct; - - if (seven_bit && !compressed) - { - /* step over fill bits ? */ - - fill_bits = 6 - ((oct * 8) % 7); - udl -= (((oct + 1)*8) + fill_bits) / 7; - if (fill_bits) - { - oct = tvb_get_guint8(tvb, offset); - - other_decode_bitfield_value(bigbuf, oct, fill_bits_mask[fill_bits], 8); - proto_tree_add_text(udh_subtree, - tvb, offset, 1, - "%s : Fill bits", - bigbuf); - /* Note: Could add an expert item here if ((oct & fill_bits_mask[fill_bits]) != 0) */ - } - } - else - { - udl -= oct + 1; - } + dis_field_udh(tvb, subtree, &offset, &length, &udl, (seven_bit && !compressed), &fill_bits); } if (g_frags > 1) |