Ethereal-dev: [Ethereal-dev] DSR,ICMP and dissector_try_port
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: david martinez <davidmfcg@xxxxxxxx>
Date: Tue, 21 Mar 2006 15:26:32 +0100 (CET)
Hi,i have the next problem when a DSR protocol dissector,in my captures sometimes i have to call icmp dissector after dsr dissector, but the ICMP dissector tell me malformed packet.I use the function dissecotr_try_port to find what dissector i have to call(it is indicated by nextheader field). It dissect correctly all types of pdus. I don`t know why it tell me malformed, becouse i believe that i use funcitons correctly(maybe in the function dissect_try_port). I put here my code with the types of pdus that i have problem: nextheader=tvb_get_guint8(tvb,0); reserved=tvb_get_guint8(tvb,1); payloadlength=tvb_get_ntohs(tvb,2); tp=proto_tree_add_protocol_format(tree,proto_dsr,tvb,0,4,"DynamicSourceRoute"); dsr_tree=proto_item_add_subtree(tp,ett_dsr); t0=proto_tree_add_uint(dsr_tree,hf_dsr_nextheader,tvb,0,1,nextheader); t1=proto_tree_add_uint(dsr_tree,hf_dsr_reserved,tvb,1,1,reserved); t2=proto_tree_add_uint(dsr_tree,hf_dsr_payloadlength,tvb,2,2,payloadlength); TRY { pdu_type=(tvb_get_guint8(tvb,4)&0xFF)>>0; } CATCH2(BoundsError,ReportedBoundsError) { ; } ENDTRY; offset=4; cuenta=payloadlength; while(payloadlength!=0) { switch(pdu_type) { case 0x07: t4=proto_tree_add_uint(dsr_tree,hf_dsr_optiontype6,tvb,offset+0,1,pdu_type); pdutype_tree=proto_item_add_subtree(t4,ett_pdutype); optdatalen6=tvb_get_guint8(tvb,offset+1); proto_tree_add_uint(pdutype_tree,hf_dsr_optdatalen6,tvb,offset+1,1,optdatalen6); f=tvb_get_guint8(tvb,offset+2); proto_tree_add_uint(pdutype_tree,hf_dsr_f,tvb,offset+2,1,f); l=tvb_get_guint8(tvb,offset+2); proto_tree_add_uint(pdutype_tree,hf_dsr_l,tvb,offset+2,1,l); reserved6=tvb_get_guint8(tvb,offset+2); proto_tree_add_uint(pdutype_tree,hf_dsr_reserved6,tvb,offset+2,1,reserved6); salvage=tvb_get_guint8(tvb,offset+3); proto_tree_add_uint(pdutype_tree,hf_dsr_salvage,tvb,offset+3,1,salvage); segsleft=tvb_get_guint8(tvb,offset+3); proto_tree_add_uint(pdutype_tree,hf_dsr_segsleft,tvb,offset+3,1,segsleft); payloadlength=payloadlength-optdatalen6+2-4; optdatalen6=optdatalen6-2; offset=offset+4; while(optdatalen6>=4) { address6=tvb_get_ipv4(tvb,offset); proto_tree_add_ipv4(pdutype_tree,hf_dsr_address6,tvb,offset,4,address6); optdatalen6=optdatalen6-4; offset=offset+4; } TRY { pdu_type=(tvb_get_guint8(tvb,offset+0)&0xFF)>>0; } CATCH2(BoundsError,ReportedBoundsError) { ; } ENDTRY; break; case 0x05: t4=proto_tree_add_uint(dsr_tree,hf_dsr_optiontype4,tvb,offset+0,1,pdu_type); pdutype_tree=proto_item_add_subtree(t4,ett_pdutype); optdatalen4=tvb_get_guint8(tvb,offset+1); proto_tree_add_uint(pdutype_tree,hf_dsr_optdatalen4,tvb,offset+1,1,optdatalen4); identification4=tvb_get_ntohs(tvb,offset+2); proto_tree_add_uint(pdutype_tree,hf_dsr_identification4,tvb,offset+2,2,identification4); payloadlength=payloadlength-optdatalen4+2-4; optdatalen4=optdatalen4-2; offset=offset+4; while(optdatalen4>=4) { addresackro=tvb_get_ipv4(tvb,offset); proto_tree_add_ipv4(pdutype_tree,hf_dsr_addresackro,tvb,offset,4,addresackro); optdatalen4=optdatalen4-4; offset=offset+4; } TRY { pdu_type=(tvb_get_guint8(tvb,offset+0)&0xFF)>>0; } CATCH2(BoundsError,ReportedBoundsError) { ; } ENDTRY; break; } } tvb_set_reported_length(tvb,4+cuenta); next_tvb=tvb_new_subset(tvb,offset,-1,-1); dissector_try_port(table_var,nextheader,next_tvb,pinfo,tree); } ............... void proto_reg_handoff_dsr(void) { dissector_handle_t dsr_handle; dsr_handle=create_dissector_handle(dissect_dsr,proto_dsr); dissector_add("ip.proto",IP_PROTO_DSR,dsr_handle); table_var=find_dissector_table("ip.proto"); } ______________________________________________ LLama Gratis a cualquier PC del Mundo. Llamadas a fijos y móviles desde 1 céntimo por minuto. http://es.voice.yahoo.com
- Prev by Date: [Ethereal-dev] tvb_get_ntohl and other
- Next by Date: [Ethereal-dev] access to previous packet data
- Previous by thread: Re: [Ethereal-dev] tvb_get_ntohl and other
- Next by thread: [Ethereal-dev] access to previous packet data
- Index(es):