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 :
-------
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 wrong) instead of
"dis_msg_deliver_report".
WBR,
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);