diff options
author | Anders Broman <anders.broman@ericsson.com> | 2012-11-16 14:18:27 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2012-11-16 14:18:27 +0000 |
commit | c6cf5703f564498c2b19b1e688d50d157c4db726 (patch) | |
tree | 5139bd32991b0ac74078eff9d43f5ef2ecb7d405 /epan/dissectors/packet-osi.c | |
parent | 22d1aa1f6c027219eaf05fc420a401b6e56b0ad6 (diff) |
From guettler:
ATN decoding fixes for CLNP and COTP dissectors (configurable by option).
ATN decoding fixes for CLNP and COTP dissectors (configurable by option).
ATN specifics may be
selected/deseleted per CLNP/COTP dissector configuration (as requested).
CLNP dissector
1) configurable decoding of "ATN security label"
COTP dissector
1) configurable decoding of ATN TPDU's
2) checksum calculation (none,OSI,ATN 16-bit, ATN 32-bit)
3) VP decoding for DR TPDU's
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5622
svn path=/trunk/; revision=46043
Diffstat (limited to 'epan/dissectors/packet-osi.c')
-rw-r--r-- | epan/dissectors/packet-osi.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/epan/dissectors/packet-osi.c b/epan/dissectors/packet-osi.c index bbe763cff4..1ea35d1b25 100644 --- a/epan/dissectors/packet-osi.c +++ b/epan/dissectors/packet-osi.c @@ -194,6 +194,155 @@ check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum, in return( CKSUM_OK ); } +/* 4 octet ATN extended checksum: ICAO doc 9705 Ed3 Volume V section 5.5.4.6.4 */ +/* It is calculated over TP4 userdata (all checksums set to zero ) and a pseudo tailer */ +/* of length SRC-NSAP, SRC-NSAP, length DST-NSAP, DST-NSAP and ATN extended checksum. */ +/* In case of a CR TPDU, the value of the ISO 8073 16-bit fletcher checksum parameter shall */ +/* be set to zero. */ +gboolean check_atn_ec_32( + tvbuff_t *tvb, guint tdpu_len, + guint offset_ec_32_val, /* offset ATN extended checksum value, calculated at last as part of pseudo trailer */ + guint offset_iso8073_val, /* offset ISO 8073 fletcher checksum, CR only*/ + guint clnp_pt_len, /* length of NSAP part of pseudo trailer */ + guint8 * clnp_pt_buffer){ /* NSAP part of pseudo trailer */ + + guint i = 0; + guint32 c0 = 0; + guint32 c1 = 0; + guint32 c2 = 0; + guint32 c3 = 0; + guint32 sum = 0; + + /* sum accross complete TDPU */ + for ( i =0; i< tdpu_len; i++){ + + c0 += tvb_get_guint8(tvb, i) ; + + if( ( i >= offset_ec_32_val ) && /* ignore 32 bit ATN extended checksum value */ + ( i < ( offset_ec_32_val + 4 ) ) ){ + c0 -= tvb_get_guint8(tvb, i); } + + if( ( offset_iso8073_val ) && /* ignore 16 bit ISO 8073 checksum, if present*/ + ( i >= offset_iso8073_val ) && + ( i < ( offset_iso8073_val + 2 ) ) ){ + c0 -= tvb_get_guint8(tvb, i); } + + if ( c0 >= 0x000000FF ) + c0 -= 0x00000FF; + c1 += c0; + if ( c1 >= 0x000000FF ) + c1 -= 0x000000FF; + c2 += c1; + if ( c2 >= 0x000000FF ) + c2 -= 0x000000FF; + c3 += c2; + if ( c3 >= 0x000000FF ) + c3 -= 0x000000FF; + + } + /* add NSAP part of pseudo trailer */ + for ( i =0; i< clnp_pt_len; i++){ + c0 += clnp_pt_buffer[i]; + if ( c0 >= 0x000000FF ) + c0 -= 0x000000FF; + c1 += c0; + if ( c1 >= 0x000000FF ) + c1 -= 0x000000FF; + c2 += c1; + if ( c2 >= 0x000000FF ) + c2 -= 0x000000FF; + c3 += c2; + if ( c3 >= 0x000000FF ) + c3 -= 0x000000FF; + } + /* add with extended checksum as last part of the pseudo trailer */ + for ( i = offset_ec_32_val; i< (offset_ec_32_val+4); i++){ + c0 += tvb_get_guint8(tvb, i) ; + + if ( c0 >= 0x000000FF ) + c0 -= 0x00000FF; + c1 += c0; + if ( c1 >= 0x000000FF ) + c1 -= 0x000000FF; + c2 += c1; + if ( c2 >= 0x000000FF ) + c2 -= 0x000000FF; + c3 += c2; + if ( c3 >= 0x000000FF ) + c3 -= 0x000000FF; + } + + sum = (c3 << 24) + (c2 << 16 ) + (c1 << 8) + c0 ; + + if(!sum) + return TRUE; + else + return FALSE; +} + +/* 2 octet ATN extended checksum: ICAO doc 9705 Ed3 Volume V section 5.5.4.6.4 */ +/* It is calculated over TP4 userdata (all checksums set to zero ) and a pseudo tailer */ +/* of length SRC-NSAP, SRC-NSAP, length DST-NSAP, DST-NSAP and ATN extended checksum. */ +/* In case of a CR TPDU, the value of the ISO 8073 16-bit fletcher checksum parameter shall */ +/* be set to zero. */ +/* this routine is currently *untested* because of the unavailability of samples.*/ +gboolean check_atn_ec_16( + tvbuff_t *tvb, + guint tdpu_len, + guint offset_ec_16_val, /* offset ATN extended checksum value, calculated at last as part of pseudo trailer */ + guint offset_iso8073_val, /* offset ISO 8073 fletcher checksum, CR only*/ + guint clnp_pt_len, /* length of NSAP part of pseudo trailer */ + guint8 * clnp_pt_buffer ){ /* NSAP part of pseudo trailer */ + + guint i = 0; + guint16 c0 = 0; + guint16 c1 = 0; + guint16 sum = 0; + + /* sum accross complete TDPU */ + for ( i =0; i< tdpu_len; i++){ + + c0 += tvb_get_guint8(tvb, i); + + if( (i >= offset_ec_16_val) && /* ignore 16 bit extended checksum */ + (i < (offset_ec_16_val + 2) ) ) { + c0 -= tvb_get_guint8(tvb, i) ; } + + if( (i >= offset_iso8073_val) && /* ignore 16 bit ISO 8073 checksum, if present*/ + (i < (offset_iso8073_val + 2) ) ) { + c0 -= tvb_get_guint8(tvb, i) ; } + + if ( c0 >= 0x00FF ) + c0 -= 0x00FF; + c1 += c0; + if ( c1 >= 0x00FF ) + c1 -= 0x00FF; + + } + /* sum with NSAP part of the pseudo trailer */ + for ( i =0; i< clnp_pt_len; i++){ + c0 += clnp_pt_buffer[i] ; + c1 += c0; + } + + /* add extended checksum as last part of the pseudo trailer */ + for ( i = offset_ec_16_val; i< (offset_ec_16_val+2); i++){ + c0 += tvb_get_guint8(tvb, i) ; + + if ( c0 >= 0x00FF ) + c0 -= 0x00FF; + c1 += c0; + if ( c1 >= 0x00FF ) + c1 -= 0x00FF; + } + + sum = (c1 << 8) + c0 ; + + if(!sum) + return TRUE; + else + return FALSE; +} /* main entry point */ @@ -350,5 +499,6 @@ proto_register_osi(void) "Whether segmented TPKT datagrams should be reassembled", &tpkt_desegment); + } |