Ethereal-dev: [Ethereal-dev] packet-clnp.c update
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: MEYER Laurent <laurent.meyer@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 25 Feb 2003 16:05:39 +0100
Thanx for SNDCF ... I'm working with cotp, and for aeronautical purpose, it is possible to have upper layer protocols after COTP Connection Request /Confirm. I also need to have heuristic dissector list in clnp datas (when not transpot datas) The patch in attachement add thoses features. Best regards. Laurent MEYER.
--- packet-clnp.c.orig Tue Feb 25 14:17:07 2003 +++ packet-clnp.c Tue Feb 25 15:28:34 2003 @@ -278,6 +278,8 @@ static heur_dissector_list_t cotp_is_heur_subdissector_list; /* List of dissectors to call for COTP packets put atop CLNP */ static heur_dissector_list_t cotp_heur_subdissector_list; +/* List of dissectors to call for CLNP packets */ +static heur_dissector_list_t clnp_heur_subdissector_list; /* * Reassembly of CLNP. @@ -1054,7 +1056,9 @@ } /* ositp_decode_RJ */ static int ositp_decode_CC(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu, - packet_info *pinfo, proto_tree *tree) + packet_info *pinfo, proto_tree *tree, + gboolean uses_inactive_subset, + gboolean *subdissector_found) { /* CC & CR decoding in the same function */ @@ -1063,6 +1067,7 @@ proto_item *ti; guint16 dst_ref, src_ref; guchar class_option; + tvbuff_t *next_tvb; src_ref = tvb_get_ntohs(tvb, offset + P_SRC_REF); class_option = (tvb_get_guint8(tvb, offset + P_CLASS_OPTION) >> 4 ) & 0x0F; @@ -1118,8 +1123,17 @@ ositp_decode_var_part(tvb, offset, li, class_option, cotp_tree); offset += li; - /* User data */ - call_dissector(data_handle, tvb_new_subset(tvb, offset, -1, -1), pinfo, tree); + next_tvb = tvb_new_subset(tvb, offset, -1, -1); + if (!uses_inactive_subset){ + if (dissector_try_heuristic(cotp_heur_subdissector_list, next_tvb, + pinfo, tree)) { + *subdissector_found = TRUE; + } else { + call_dissector(data_handle,next_tvb, pinfo, tree); + } + } + else + call_dissector(data_handle, next_tvb, pinfo, tree); offset += tvb_length_remaining(tvb, offset); /* we dissected all of the containing PDU */ @@ -1534,7 +1548,8 @@ switch (tpdu) { case CC_TPDU : case CR_TPDU : - new_offset = ositp_decode_CC(tvb, offset, li, tpdu, pinfo, tree); + new_offset = ositp_decode_CC(tvb, offset, li, tpdu, pinfo, tree, + uses_inactive_subset, &subdissector_found); break; case DR_TPDU : new_offset = ositp_decode_DR(tvb, offset, li, tpdu, pinfo, tree); @@ -1936,6 +1951,13 @@ return; /* yes, it appears to be COTP or CLTP */ } } + if (dissector_try_heuristic(clnp_heur_subdissector_list, next_tvb, + pinfo, tree)) + { + pinfo->fragmented = save_fragmented; + return; /* yes, it appears to be COTP or CLTP */ + } + break; case ER_NPDU: @@ -2065,7 +2087,7 @@ proto_register_field_array(proto_clnp, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); register_dissector("clnp", dissect_clnp, proto_clnp); - + register_heur_dissector_list("clnp", &clnp_heur_subdissector_list); clnp_module = prefs_register_protocol(proto_clnp, NULL); prefs_register_uint_preference(clnp_module, "tp_nsap_selector", "NSAP selector for Transport Protocol (last byte in hexa)",
- Follow-Ups:
- Re: [Ethereal-dev] packet-clnp.c update
- From: Guy Harris
- Re: [Ethereal-dev] packet-clnp.c update
- Prev by Date: [Ethereal-dev] IPsec dissecting
- Next by Date: [Ethereal-dev] packet-esis.c update
- Previous by thread: Re: [Ethereal-dev] IPsec dissecting
- Next by thread: Re: [Ethereal-dev] packet-clnp.c update
- Index(es):