Ethereal-dev: [Ethereal-dev] packet-gsm_sms.c : fixed positions for TP-RP, TP-UDHI, TP-SRR/SR

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Viorel Suman <vsuman@xxxxxxxx>
Date: Wed, 8 Dec 2004 17:56:31 +0200 (EET)
Hello,

Attached is a "packet-gsm_sms.c" dissector patch, which fix
several bugs desribed below. Looking for feedback, comments and suggestions. I suppose it should be checked in.

Bug 1 :
-------
Wrong positions of the fields, located within the first octet
of the GSM SMS TPDU.

According to GSM 03.40 spec these fields have a well
defined position in the first byte :

1. TP-RP (Reply Path) field is allways located within
bit no 7 of the first octet.
2. TP-UDHI field  - located within bit no 6.
3. TP-SRR/SRI/SRQ - located within bit no 5.
4. TP-VPF - located within bits no 3-4.
5. TP-MMS and TP-RD - located within bit no 2.
6. TP-MTI - located within bits no 0-1.

Bug 2 :
-------
One byte is skipped during RP-ERROR vs. RP-ACK detecting :

Offset must be increased only when RP-ERROR is detected in
order to avoid one byte skipping.

Bug 3 :
-------
The improper dissect method is used to dissect SMS-DELIVER-REPORT.

pinfo->p2p_dir values may be :

a) P2P_DIR_RECV is set for SMS-SUBMIT
b) P2P_DIR_SENT is set for SMS-DELIVER
c) P2P_DIR_UNKNOWN is set for any SMS-SUBMIT/DELIVER-REPORT

Having P2P_DIR_UNKNOWN set for SMS-DELIVER-REPORT
the "dis_msg_deliver" is used (which is the BUG) instead of
the "dis_msg_deliver_report".

Thank you,

Viorel Suman
Software Developer

Avalanche Mobile NV (http://www.avmob.com)
Busitel 1, Orlyplein 85
1043 DS Amsterdam
The Netherlands

Phone: +31 (0) 20 403 74 70
Fax:   +31 (0) 20 403 73 10
--- ethereal-0.10.7-original/epan/dissectors/packet-gsm_sms.c	2004-10-21 01:34:59.000000000 +0300
+++ ethereal-0.10.7/epan/dissectors/packet-gsm_sms.c	2004-12-08 16:48:34.198095736 +0200
@@ -1952,11 +1952,11 @@
 
     oct = tvb_get_guint8(tvb, offset);
 
-    DIS_FIELD_SRI(tree, 0x20, offset);
+    DIS_FIELD_RP(tree, 0x80, offset);
 
-    DIS_FIELD_UDHI(tree, 0x10, offset, udhi);
+    DIS_FIELD_UDHI(tree, 0x40, offset, udhi);
 
-    DIS_FIELD_RP(tree, 0x08, offset);
+    DIS_FIELD_SRI(tree, 0x20, offset);
 
     DIS_FIELD_MMS(tree, 0x04, offset);
 
@@ -2017,7 +2017,7 @@
 
     oct = tvb_get_guint8(tvb, offset);
 
-    DIS_FIELD_UDHI(tree, 0x04, offset, udhi);
+    DIS_FIELD_UDHI(tree, 0x40, offset, udhi);
 
     DIS_FIELD_MTI(tree, 0x03, offset);
 
@@ -2046,9 +2046,9 @@
     if (oct & 0x80)
     {
 	dis_field_fcs(tvb, tree, offset, oct);
+	offset++;
     }
 
-    offset++;
     pi = tvb_get_guint8(tvb, offset);
 
     dis_field_pi(tvb, tree, offset, pi);
@@ -2136,11 +2136,11 @@
 
     oct = tvb_get_guint8(tvb, offset);
 
-    DIS_FIELD_SRR(tree, 0x80, offset);
+    DIS_FIELD_RP(tree, 0x80, offset);
 
     DIS_FIELD_UDHI(tree, 0x40, offset, udhi);
 
-    DIS_FIELD_RP(tree, 0x20, offset);
+    DIS_FIELD_SRR(tree, 0x20, offset);
 
     DIS_FIELD_VPF(tree, 0x18, offset, &vp_form);
 
@@ -2208,7 +2208,7 @@
 
     oct = tvb_get_guint8(tvb, offset);
 
-    DIS_FIELD_UDHI(tree, 0x04, offset, udhi);
+    DIS_FIELD_UDHI(tree, 0x40, offset, udhi);
 
     DIS_FIELD_MTI(tree, 0x03, offset);
 
@@ -2229,9 +2229,9 @@
     if (oct & 0x80)
     {
 	dis_field_fcs(tvb, tree, offset, oct);
+	offset++;
     }
 
-    offset++;
     pi = tvb_get_guint8(tvb, offset);
 
     dis_field_pi(tvb, tree, offset, pi);
@@ -2306,11 +2306,11 @@
 
     oct = tvb_get_guint8(tvb, offset);
 
-    DIS_FIELD_SRQ(tree, 0x10, offset);
+    DIS_FIELD_UDHI(tree, 0x40, offset, udhi);
 
-    DIS_FIELD_MMS(tree, 0x08, offset);
+    DIS_FIELD_SRQ(tree, 0x20, offset);
 
-    DIS_FIELD_UDHI(tree, 0x04, offset, udhi);
+    DIS_FIELD_MMS(tree, 0x04, offset);
 
     DIS_FIELD_MTI(tree, 0x03, offset);
 
@@ -2415,7 +2415,7 @@
 
     oct = tvb_get_guint8(tvb, offset);
 
-    DIS_FIELD_SRR(tree, 0x08, offset);
+    DIS_FIELD_SRR(tree, 0x20, offset);
 
     DIS_FIELD_UDHI(tree, 0x04, offset, udhi);
 
@@ -2514,7 +2514,18 @@
 	/*
 	 * convert the 2 bit value to one based on direction
 	 */
-	msg_type |= ((pinfo->p2p_dir == P2P_DIR_RECV) ? 0x04 : 0x00);
+	if (pinfo->p2p_dir == P2P_DIR_UNKNOWN)
+	{
+	    // Return Result ...
+	    if (msg_type == 0) // SMS-DELIVER
+	    {
+		msg_type |= 0x04; // see the msg_type_strings
+	    }
+	}
+	else
+	{
+	    msg_type |= ((pinfo->p2p_dir == P2P_DIR_RECV) ? 0x04 : 0x00);
+	}
 
 	str = my_match_strval(msg_type, msg_type_strings, &idx);