aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-osi.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2012-11-16 14:18:27 +0000
committerAnders Broman <anders.broman@ericsson.com>2012-11-16 14:18:27 +0000
commitc6cf5703f564498c2b19b1e688d50d157c4db726 (patch)
tree5139bd32991b0ac74078eff9d43f5ef2ecb7d405 /epan/dissectors/packet-osi.c
parent22d1aa1f6c027219eaf05fc420a401b6e56b0ad6 (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.c150
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);
+
}