aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gsm_sms.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-12-05 06:23:17 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-12-05 06:23:17 +0000
commit03085a5c9a2550b2ecda441bff77c2f9b1fcad0e (patch)
tree07ce60d88a3a6485ebaf702ccda962967e99d4b3 /epan/dissectors/packet-gsm_sms.c
parent8d0dc9f935ec01eb2890251ac4e683d157638a22 (diff)
Fix https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9503 :
Fix dissection of STK SEND SHORT MESSAGE proactive command svn path=/trunk/; revision=53793
Diffstat (limited to 'epan/dissectors/packet-gsm_sms.c')
-rw-r--r--epan/dissectors/packet-gsm_sms.c85
1 files changed, 63 insertions, 22 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c
index aa5a8fbf8b..07a43a6b91 100644
--- a/epan/dissectors/packet-gsm_sms.c
+++ b/epan/dissectors/packet-gsm_sms.c
@@ -2649,8 +2649,9 @@ dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length,
#define SMS_MAX_MESSAGE_SIZE 160
static char messagebuf[SMS_MAX_MESSAGE_SIZE+1];
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)
+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, gsm_sms_data_t *data)
{
proto_item *item;
proto_tree *subtree;
@@ -2683,7 +2684,18 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
if (udhi)
{
- dis_field_udh(tvb, subtree, &offset, &length, &udl, (seven_bit && !compressed) ? GSM_7BITS : OTHER, &fill_bits);
+ enum character_set cset;
+
+ if (data && data->stk_packing_required)
+ {
+ cset = OTHER;
+ }
+ else
+ {
+ cset = (seven_bit && !compressed) ? GSM_7BITS : OTHER;
+ }
+
+ dis_field_udh(tvb, subtree, &offset, &length, &udl, cset, &fill_bits);
}
if (g_frags > 1)
@@ -2742,7 +2754,33 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
}
else
{
- if (seven_bit)
+ if (data && data->stk_packing_required)
+ {
+ /* STK requires SMS packing by the terminal */
+ /* Per 3GPP 31.111 chapter 6.4.10: */
+ /* It shall use the SMS default 7-bit coded alphabet */
+ /* as defined in TS 23.038 with bit 8 set to 0 */
+ if(!(reassembled && pinfo->fd->num == reassembled_in))
+ {
+ proto_tree_add_item(subtree, hf_gsm_sms_text, tvb, offset, length, ENC_ASCII|ENC_NA);
+ }
+ else
+ {
+ total_sms_len = 0;
+ for(i = 0 ; i < g_frags; i++)
+ {
+ p_frag_params = (sm_fragment_params*)g_hash_table_lookup(g_sm_fragment_params_table,
+ GUINT_TO_POINTER((guint)((g_sm_id<<16)|i)));
+
+ if (p_frag_params) {
+ proto_tree_add_item(subtree, hf_gsm_sms_text, sm_tvb, total_sms_len,
+ p_frag_params->length, ENC_ASCII|ENC_NA);
+ total_sms_len += p_frag_params->length;
+ }
+ }
+ }
+ }
+ else if (seven_bit)
{
if(!(reassembled && pinfo->fd->num == reassembled_in))
{
@@ -2929,7 +2967,7 @@ dis_field_pi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 oct)
* Section 9.2.2
*/
static void
-dis_msg_deliver(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset)
+dis_msg_deliver(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, gsm_sms_data_t *data)
{
guint32 saved_offset;
guint32 length;
@@ -2979,7 +3017,7 @@ dis_msg_deliver(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 off
offset++;
dis_field_ud(tvb, pinfo, tree, offset, length - (offset - saved_offset), udhi, udl,
- seven_bit, eight_bit, ucs2, compressed);
+ seven_bit, eight_bit, ucs2, compressed, data);
}
}
@@ -2988,7 +3026,7 @@ dis_msg_deliver(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 off
* Section 9.2.2
*/
static void
-dis_msg_deliver_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset)
+dis_msg_deliver_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, gsm_sms_data_t *data)
{
guint32 saved_offset;
guint32 length;
@@ -3099,7 +3137,7 @@ dis_msg_deliver_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guin
offset++;
dis_field_ud(tvb, pinfo, tree, offset, length - (offset - saved_offset), udhi, udl,
- seven_bit, eight_bit, ucs2, compressed);
+ seven_bit, eight_bit, ucs2, compressed, data);
}
}
@@ -3108,7 +3146,7 @@ dis_msg_deliver_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guin
* Section 9.2.2
*/
static void
-dis_msg_submit(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset)
+dis_msg_submit(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, gsm_sms_data_t *data)
{
guint32 saved_offset;
guint32 length;
@@ -3166,7 +3204,7 @@ dis_msg_submit(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offs
offset++;
dis_field_ud(tvb, pinfo, tree, offset, length - (offset - saved_offset), udhi, udl,
- seven_bit, eight_bit, ucs2, compressed);
+ seven_bit, eight_bit, ucs2, compressed, data);
}
}
@@ -3175,7 +3213,7 @@ dis_msg_submit(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offs
* Section 9.2.2
*/
static void
-dis_msg_submit_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset)
+dis_msg_submit_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, gsm_sms_data_t *data)
{
guint32 saved_offset;
guint32 length;
@@ -3276,7 +3314,7 @@ dis_msg_submit_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
if (udl > 0)
{
dis_field_ud(tvb, pinfo, tree, offset, length - (offset - saved_offset), udhi, udl,
- seven_bit, eight_bit, ucs2, compressed);
+ seven_bit, eight_bit, ucs2, compressed, data);
}
}
@@ -3285,7 +3323,7 @@ dis_msg_submit_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
* Section 9.2.2
*/
static void
-dis_msg_status_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset)
+dis_msg_status_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, gsm_sms_data_t *data)
{
guint32 saved_offset;
guint32 length;
@@ -3395,7 +3433,7 @@ dis_msg_status_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
offset++;
dis_field_ud(tvb, pinfo, tree, offset, length - (offset - saved_offset), udhi, udl,
- seven_bit, eight_bit, ucs2, compressed);
+ seven_bit, eight_bit, ucs2, compressed, data);
}
}
@@ -3404,7 +3442,7 @@ dis_msg_status_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
* Section 9.2.2
*/
static void
-dis_msg_command(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 offset)
+dis_msg_command(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 offset, gsm_sms_data_t *data _U_)
{
guint8 oct;
guint8 cdl;
@@ -3457,7 +3495,7 @@ dis_msg_command(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32
static gint ett_msgs[NUM_MSGS];
#endif
-static void (*gsm_sms_msg_fcn[])(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset) = {
+static void (*gsm_sms_msg_fcn[])(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, gsm_sms_data_t *data) = {
dis_msg_deliver, /* SMS-DELIVER */
dis_msg_deliver_report, /* SMS-DELIVER REPORT */
dis_msg_submit, /* SMS-SUBMIT */
@@ -3471,16 +3509,18 @@ static void (*gsm_sms_msg_fcn[])(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
/* GENERIC DISSECTOR FUNCTIONS */
-static void
-dissect_gsm_sms(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+static int
+dissect_gsm_sms(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
- void (*msg_fcn)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset) = NULL;
+ void (*msg_fcn)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ guint32 offset, gsm_sms_data_t *gsm_data) = NULL;
guint32 offset;
guint8 msg_type;
guint8 oct;
gint idx;
const gchar *str = NULL;
/*gint ett_msg_idx;*/
+ gsm_sms_data_t *gsm_data = (gsm_sms_data_t*) data;
g_is_wsp = 0;
g_sm_id = 0;
@@ -3531,7 +3571,7 @@ dissect_gsm_sms(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
(msg_type == 0x03) ||
(msg_type == 0x07))
{
- return;
+ return tvb_length(tvb);
}
else
{
@@ -3547,9 +3587,10 @@ dissect_gsm_sms(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
else
{
- (*msg_fcn)(tvb, pinfo, gsm_sms_tree, offset);
+ (*msg_fcn)(tvb, pinfo, gsm_sms_tree, offset, gsm_data);
}
}
+ return tvb_length(tvb);
}
@@ -3794,7 +3835,7 @@ proto_register_gsm_sms(void)
"Whether the dissector should reassemble SMS spanning multiple packets",
&reassemble_sms);
- register_dissector("gsm_sms", dissect_gsm_sms, proto_gsm_sms);
+ new_register_dissector("gsm_sms", dissect_gsm_sms, proto_gsm_sms);
/* GSM SMS UD dissector initialization routines */
register_init_routine (gsm_sms_defragment_init);