aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gprs-llc.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2005-02-12 21:20:38 +0000
committerAnders Broman <anders.broman@ericsson.com>2005-02-12 21:20:38 +0000
commit37a96cbad0ba4c6444f9b727da164af69b688dc6 (patch)
treee2318391b78f8e734faacf711bba99560d312f86 /epan/dissectors/packet-gprs-llc.c
parente42caa3d5562e20566efbfd64b768d9402fc8ded (diff)
From Rene Pilz :
BSSGP: - Does not dissect the LLC-PDU twice LLC: - Add CRC calculation to differ between ciphered and non-ciphered packets without taking care about the encryption bit. This solves crashes when the option "ignore ciphere bit" was activated GMM/SM: - Dissect detach_type now correctly ( fixed by Miklos Szurdi ) - Dissect timer correctly ( fixed by Miklos Szurdi ) - Update SM causes for Release 6 ( Miklos Szurdi ) - Update service_type for Release 6 ( Miklos Szurdi ) - Rearange pco code like Guy Harris has suggested ( Guy Harris ) - reimplement dissection of IPv4 and IPv6 addresses - Fix offset in pdp_addr - Fix offset in Traffic Flow Template (tft) svn path=/trunk/; revision=13386
Diffstat (limited to 'epan/dissectors/packet-gprs-llc.c')
-rw-r--r--epan/dissectors/packet-gprs-llc.c78
1 files changed, 71 insertions, 7 deletions
diff --git a/epan/dissectors/packet-gprs-llc.c b/epan/dissectors/packet-gprs-llc.c
index 82c0d0eabf..72d061f798 100644
--- a/epan/dissectors/packet-gprs-llc.c
+++ b/epan/dissectors/packet-gprs-llc.c
@@ -171,6 +171,53 @@ static const value_string cr_formats_ipluss[] = {
{ 0x3,"SACK" },
{ 0, NULL },
};
+
+/* CRC24 table - FCS */
+guint32 tbl_crc24[256] = {
+ 0x00000000, 0x00d6a776, 0x00f64557, 0x0020e221, 0x00b78115, 0x00612663, 0x0041c442, 0x00976334,
+ 0x00340991, 0x00e2aee7, 0x00c24cc6, 0x0014ebb0, 0x00838884, 0x00552ff2, 0x0075cdd3, 0x00a36aa5,
+ 0x00681322, 0x00beb454, 0x009e5675, 0x0048f103, 0x00df9237, 0x00093541, 0x0029d760, 0x00ff7016,
+ 0x005c1ab3, 0x008abdc5, 0x00aa5fe4, 0x007cf892, 0x00eb9ba6, 0x003d3cd0, 0x001ddef1, 0x00cb7987,
+ 0x00d02644, 0x00068132, 0x00266313, 0x00f0c465, 0x0067a751, 0x00b10027, 0x0091e206, 0x00474570,
+ 0x00e42fd5, 0x003288a3, 0x00126a82, 0x00c4cdf4, 0x0053aec0, 0x008509b6, 0x00a5eb97, 0x00734ce1,
+ 0x00b83566, 0x006e9210, 0x004e7031, 0x0098d747, 0x000fb473, 0x00d91305, 0x00f9f124, 0x002f5652,
+ 0x008c3cf7, 0x005a9b81, 0x007a79a0, 0x00acded6, 0x003bbde2, 0x00ed1a94, 0x00cdf8b5, 0x001b5fc3,
+ 0x00fb4733, 0x002de045, 0x000d0264, 0x00dba512, 0x004cc626, 0x009a6150, 0x00ba8371, 0x006c2407,
+ 0x00cf4ea2, 0x0019e9d4, 0x00390bf5, 0x00efac83, 0x0078cfb7, 0x00ae68c1, 0x008e8ae0, 0x00582d96,
+ 0x00935411, 0x0045f367, 0x00651146, 0x00b3b630, 0x0024d504, 0x00f27272, 0x00d29053, 0x00043725,
+ 0x00a75d80, 0x0071faf6, 0x005118d7, 0x0087bfa1, 0x0010dc95, 0x00c67be3, 0x00e699c2, 0x00303eb4,
+ 0x002b6177, 0x00fdc601, 0x00dd2420, 0x000b8356, 0x009ce062, 0x004a4714, 0x006aa535, 0x00bc0243,
+ 0x001f68e6, 0x00c9cf90, 0x00e92db1, 0x003f8ac7, 0x00a8e9f3, 0x007e4e85, 0x005eaca4, 0x00880bd2,
+ 0x00437255, 0x0095d523, 0x00b53702, 0x00639074, 0x00f4f340, 0x00225436, 0x0002b617, 0x00d41161,
+ 0x00777bc4, 0x00a1dcb2, 0x00813e93, 0x005799e5, 0x00c0fad1, 0x00165da7, 0x0036bf86, 0x00e018f0,
+ 0x00ad85dd, 0x007b22ab, 0x005bc08a, 0x008d67fc, 0x001a04c8, 0x00cca3be, 0x00ec419f, 0x003ae6e9,
+ 0x00998c4c, 0x004f2b3a, 0x006fc91b, 0x00b96e6d, 0x002e0d59, 0x00f8aa2f, 0x00d8480e, 0x000eef78,
+ 0x00c596ff, 0x00133189, 0x0033d3a8, 0x00e574de, 0x007217ea, 0x00a4b09c, 0x008452bd, 0x0052f5cb,
+ 0x00f19f6e, 0x00273818, 0x0007da39, 0x00d17d4f, 0x00461e7b, 0x0090b90d, 0x00b05b2c, 0x0066fc5a,
+ 0x007da399, 0x00ab04ef, 0x008be6ce, 0x005d41b8, 0x00ca228c, 0x001c85fa, 0x003c67db, 0x00eac0ad,
+ 0x0049aa08, 0x009f0d7e, 0x00bfef5f, 0x00694829, 0x00fe2b1d, 0x00288c6b, 0x00086e4a, 0x00dec93c,
+ 0x0015b0bb, 0x00c317cd, 0x00e3f5ec, 0x0035529a, 0x00a231ae, 0x007496d8, 0x005474f9, 0x0082d38f,
+ 0x0021b92a, 0x00f71e5c, 0x00d7fc7d, 0x00015b0b, 0x0096383f, 0x00409f49, 0x00607d68, 0x00b6da1e,
+ 0x0056c2ee, 0x00806598, 0x00a087b9, 0x007620cf, 0x00e143fb, 0x0037e48d, 0x001706ac, 0x00c1a1da,
+ 0x0062cb7f, 0x00b46c09, 0x00948e28, 0x0042295e, 0x00d54a6a, 0x0003ed1c, 0x00230f3d, 0x00f5a84b,
+ 0x003ed1cc, 0x00e876ba, 0x00c8949b, 0x001e33ed, 0x008950d9, 0x005ff7af, 0x007f158e, 0x00a9b2f8,
+ 0x000ad85d, 0x00dc7f2b, 0x00fc9d0a, 0x002a3a7c, 0x00bd5948, 0x006bfe3e, 0x004b1c1f, 0x009dbb69,
+ 0x0086e4aa, 0x005043dc, 0x0070a1fd, 0x00a6068b, 0x003165bf, 0x00e7c2c9, 0x00c720e8, 0x0011879e,
+ 0x00b2ed3b, 0x00644a4d, 0x0044a86c, 0x00920f1a, 0x00056c2e, 0x00d3cb58, 0x00f32979, 0x00258e0f,
+ 0x00eef788, 0x003850fe, 0x0018b2df, 0x00ce15a9, 0x0059769d, 0x008fd1eb, 0x00af33ca, 0x007994bc,
+ 0x00dafe19, 0x000c596f, 0x002cbb4e, 0x00fa1c38, 0x006d7f0c, 0x00bbd87a, 0x009b3a5b, 0x004d9d2d
+};
+
+#define GOOD_CRC24 0x0c91b6
+#define INIT_CRC24 0xffffff
+
+guint32 crc_calc(guint32 fcs, guchar *cp, int len)
+{
+ while (len--)
+ fcs = (fcs >> 8) ^ tbl_crc24[(fcs ^ *cp++) & 0xff];
+ return fcs;
+}
+
/* Code to actually dissect the packets */
static void
dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -180,6 +227,8 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_item *ti, *addres_field_item, *ctrl_field_item, *ui_ti;
proto_tree *llcgprs_tree=NULL , *ad_f_tree =NULL, *ctrl_f_tree=NULL, *ui_tree=NULL;
tvbuff_t *next_tvb;
+ guint32 fcs , fcs_calc;
+ guchar *data;
/* Make entries in Protocol column and Info column on summary display */
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "GPRS-LLC");
@@ -196,7 +245,15 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (check_col(pinfo->cinfo, COL_INFO))
col_add_fstr(pinfo->cinfo, COL_INFO, "SAPI: %s", match_strval(sapi,sapi_abrv));
-
+
+ data = (guchar*)tvb_get_ptr(tvb, 0, crc_start+3 );
+ fcs_calc = crc_calc ( INIT_CRC24 , data , crc_start );
+ fcs_calc = ~fcs_calc;
+
+ if ( memcmp ( &fcs_calc , data+crc_start , 3 ) == 0 )
+ fcs = GOOD_CRC24;
+ else
+ fcs = ~GOOD_CRC24;
/* In the interest of speed, if "tree" is NULL, don't do any work not
necessary to generate protocol tree items. */
@@ -207,7 +264,11 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
llcgprs_tree = proto_item_add_subtree(ti, ett_llcgprs);
/* add an item to the subtree, see section 1.6 for more information */
- proto_tree_add_text( llcgprs_tree, tvb, crc_start,3, "CRC of LLC layer" );
+ if ( fcs == GOOD_CRC24 )
+ proto_tree_add_text ( llcgprs_tree , tvb , crc_start , 3 , "FCS: 0x%06x (correct)" , fcs_calc&0xffffff );
+ else
+ proto_tree_add_text ( llcgprs_tree , tvb , crc_start , 3 , "FCS: 0x%02x%02x%02x (incorrect, should be 0x%06x)",
+ data[crc_start] , data[crc_start+1], data[crc_start+2], fcs_calc & 0xffffff );
addres_field_item = proto_tree_add_uint_format(llcgprs_tree,hf_llcgprs_sapi,
tvb, 0,1, sapi, "Address field SAPI: %s", match_strval(sapi,sapi_abrv));
ad_f_tree = proto_item_add_subtree(addres_field_item, ett_llcgprs_adf);
@@ -216,6 +277,8 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_uint(ad_f_tree, hf_llcgprs_sapib, tvb, 0, 1, addr_fld );
}
+
+
ctrl_fld_fb = tvb_get_guint8(tvb,offset);
if ( ctrl_fld_fb < 0xc0 ){
frame_format = ( ctrl_fld_fb < 0x80)? I_FORMAT : S_FORMAT;
@@ -267,12 +330,13 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_boolean( ctrl_f_tree, hf_llcgprs_PM_bit, tvb, offset-2,2,ctrl_fld_ui_s);
}
+
next_tvb = tvb_new_subset(tvb, offset,crc_start-3, -1 );
- if (ignore_cipher_bit || !(epm & 0x2)){
+ if ((ignore_cipher_bit && (fcs == GOOD_CRC24)) || !(epm & 0x2)){
/*
* Either we're ignoring the cipher bit
* (because the bit is set but the
- * data is unciphered), or the cipher
+ * data is unciphered), or the cipher
* bit isn't set (indicating that the
* data is unciphered). Try dissecting
* it with a subdissector.
@@ -383,9 +447,9 @@ proto_register_llcgprs(void)
register_dissector( "llcgprs", dissect_llcgprs, proto_llcgprs);
llcgprs_module = prefs_register_protocol ( proto_llcgprs, NULL );
- prefs_register_bool_preference ( llcgprs_module, "ignore_cipher_bit",
- "Ignore cipher bit",
- "Whether to ignore the cipher bit (because it might be set on unciphered data)",
+ prefs_register_bool_preference ( llcgprs_module, "autodetect_cipher_bit",
+ "autodetect cipher bit",
+ "Whether to autodetect the cipher bit (because it might be set on unciphered data)",
&ignore_cipher_bit );
}