diff options
author | Guy Harris <guy@alum.mit.edu> | 2001-02-13 00:17:55 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2001-02-13 00:17:55 +0000 |
commit | 35dfa54307a12b8bdfb5857a33b9a233b889249d (patch) | |
tree | 3b712b923572e822b23b9fce4cbb3df12891192e /packet-wsp.c | |
parent | 30d13244ebccf956ea1511cf8bb331ab2e542df7 (diff) |
Updates from Neil Hunter.
svn path=/trunk/; revision=3026
Diffstat (limited to 'packet-wsp.c')
-rw-r--r-- | packet-wsp.c | 2899 |
1 files changed, 706 insertions, 2193 deletions
diff --git a/packet-wsp.c b/packet-wsp.c index ad20f64cf2..f37ae5c40a 100644 --- a/packet-wsp.c +++ b/packet-wsp.c @@ -1,15 +1,17 @@ -/* packet-wsp.c (c) 2000 Neil Hunter - * Based on original work by Ben Fowler - * Updated by Alexandre P. Ferreira (Splice IP) +/* packet-wsp.c * * Routines to dissect WSP component of WAP traffic. * - * $Id: packet-wsp.c,v 1.17 2001/02/10 09:28:04 guy Exp $ + * $Id: packet-wsp.c,v 1.18 2001/02/13 00:17:54 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> * Copyright 1998 Didier Jorand * + * WAP dissector based on original work by Ben Fowler + * Updated by Neil Hunter <neil.hunter@energis-squared.com> + * WTLS support by Alexandre P. Ferreira (Splice IP) + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -57,7 +59,6 @@ /* File scoped variables for the protocol and registered fields */ static int proto_wsp = HF_EMPTY; -static int proto_wtls = HF_EMPTY; /* These fields used by fixed part of header */ static int hf_wsp_header_tid = HF_EMPTY; @@ -81,9 +82,9 @@ static int hf_wsp_post_data = HF_EMPTY; static int hf_wsp_header_accept = HF_EMPTY; static int hf_wsp_header_accept_str = HF_EMPTY; static int hf_wsp_header_accept_charset = HF_EMPTY; -static int hf_wsp_header_accept_charset_str = HF_EMPTY; +static int hf_wsp_header_accept_charset_str = HF_EMPTY; static int hf_wsp_header_accept_language = HF_EMPTY; -static int hf_wsp_header_accept_language_str = HF_EMPTY; +static int hf_wsp_header_accept_language_str = HF_EMPTY; static int hf_wsp_header_accept_ranges = HF_EMPTY; static int hf_wsp_header_cache_control = HF_EMPTY; static int hf_wsp_header_content_length = HF_EMPTY; @@ -99,72 +100,9 @@ static int hf_wsp_header_user_agent = HF_EMPTY; static int hf_wsp_header_application_header = HF_EMPTY; static int hf_wsp_header_application_value = HF_EMPTY; static int hf_wsp_header_x_wap_tod = HF_EMPTY; -static int hf_wsp_header_transfer_encoding = HF_EMPTY; -static int hf_wsp_header_transfer_encoding_str = HF_EMPTY; -static int hf_wsp_header_via = HF_EMPTY; - -static int hf_wtls_record = HF_EMPTY; -static int hf_wtls_record_type = HF_EMPTY; -static int hf_wtls_record_length = HF_EMPTY; -static int hf_wtls_record_sequence = HF_EMPTY; -static int hf_wtls_record_ciphered = HF_EMPTY; -static int hf_wtls_hands = HF_EMPTY; -static int hf_wtls_hands_type = HF_EMPTY; -static int hf_wtls_hands_length = HF_EMPTY; -static int hf_wtls_hands_cli_hello = HF_EMPTY; -static int hf_wtls_hands_cli_hello_version = HF_EMPTY; -static int hf_wtls_hands_cli_hello_gmt = HF_EMPTY; -static int hf_wtls_hands_cli_hello_random = HF_EMPTY; -static int hf_wtls_hands_cli_hello_session = HF_EMPTY; -static int hf_wtls_hands_cli_hello_cli_key_id = HF_EMPTY; -static int hf_wtls_hands_cli_hello_trust_key_id = HF_EMPTY; -static int hf_wtls_hands_cli_hello_key_exchange =HF_EMPTY; -static int hf_wtls_hands_cli_hello_key_exchange_suite =HF_EMPTY; -static int hf_wtls_hands_cli_hello_key_parameter_index =HF_EMPTY; -static int hf_wtls_hands_cli_hello_key_parameter_set =HF_EMPTY; -static int hf_wtls_hands_cli_hello_key_identifier_type =HF_EMPTY; -static int hf_wtls_hands_cli_hello_cipher_suite =HF_EMPTY; -static int hf_wtls_hands_cli_hello_cipher_suite_item =HF_EMPTY; -static int hf_wtls_hands_cli_hello_cipher_bulk =HF_EMPTY; -static int hf_wtls_hands_cli_hello_cipher_mac =HF_EMPTY; -static int hf_wtls_hands_cli_hello_compression_methods =HF_EMPTY; -static int hf_wtls_hands_cli_hello_compression =HF_EMPTY; -static int hf_wtls_hands_cli_hello_sequence_mode =HF_EMPTY; -static int hf_wtls_hands_cli_hello_key_refresh =HF_EMPTY; -static int hf_wtls_hands_serv_hello = HF_EMPTY; -static int hf_wtls_hands_serv_hello_version = HF_EMPTY; -static int hf_wtls_hands_serv_hello_gmt = HF_EMPTY; -static int hf_wtls_hands_serv_hello_random = HF_EMPTY; -static int hf_wtls_hands_serv_hello_session = HF_EMPTY; -static int hf_wtls_hands_serv_hello_cli_key_id =HF_EMPTY; -static int hf_wtls_hands_serv_hello_cipher_suite_item =HF_EMPTY; -static int hf_wtls_hands_serv_hello_cipher_bulk =HF_EMPTY; -static int hf_wtls_hands_serv_hello_cipher_mac =HF_EMPTY; -static int hf_wtls_hands_serv_hello_compression =HF_EMPTY; -static int hf_wtls_hands_serv_hello_sequence_mode =HF_EMPTY; -static int hf_wtls_hands_serv_hello_key_refresh =HF_EMPTY; -static int hf_wtls_hands_certificates =HF_EMPTY; -static int hf_wtls_hands_certificate =HF_EMPTY; -static int hf_wtls_hands_certificate_type =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_version =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_signature_type =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_issuer_type =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_issuer_charset =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_issuer_name =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_valid_not_before =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_valid_not_after =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_subject_type =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_subject_charset =HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_subject_name = HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_public_key_type = HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_key_parameter_index = HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_key_parameter_set = HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_rsa_exponent = HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_rsa_modules = HF_EMPTY; -static int hf_wtls_hands_certificate_wtls_signature = HF_EMPTY; -static int hf_wtls_alert = HF_EMPTY; -static int hf_wtls_alert_level = HF_EMPTY; -static int hf_wtls_alert_description = HF_EMPTY; +static int hf_wsp_header_transfer_encoding = HF_EMPTY; +static int hf_wsp_header_transfer_encoding_str = HF_EMPTY; +static int hf_wsp_header_via = HF_EMPTY; /* Initialize the subtree pointers */ static gint ett_wsp = ETT_EMPTY; @@ -172,11 +110,9 @@ static gint ett_header = ETT_EMPTY; static gint ett_headers = ETT_EMPTY; static gint ett_capabilities = ETT_EMPTY; static gint ett_content_type = ETT_EMPTY; -static gint ett_wtls_rec = ETT_EMPTY; -static gint ett_wtls_msg_type = ETT_EMPTY; -static gint ett_wtls_msg_type_item = ETT_EMPTY; -static gint ett_wtls_msg_type_item_sub = ETT_EMPTY; -static gint ett_wtls_msg_type_item_sub_sub = ETT_EMPTY; + +/* Handle for WMLC dissector */ +static dissector_handle_t wmlc_handle; static const value_string vals_pdu_type[] = { { 0x00, "Reserved" }, @@ -316,342 +252,103 @@ static const value_string vals_content_types[] = { { 0x00, NULL } }; -static const value_string vals_character_sets[] = { - { 0 ,"hz-gb-2312" }, - { 3 ,"us-ascii" }, - { 4 ,"iso-8859-1" }, - { 5 ,"iso-8859-2" }, - { 6 ,"iso-8859-3" }, - { 7 ,"iso-8859-4" }, - { 8 ,"iso-8859-5" }, - { 9 ,"iso-8859-6" }, - { 10 ,"iso-8859-7" }, - { 11 ,"iso-8859-8" }, - { 12 ,"iso-8859-9" }, - { 13 ,"iso-8859-10" }, - { 14 ,"iso_6937-2-add" }, - { 15 ,"jis_x0201" }, - { 16 ,"jis_encoding" }, - { 17 ,"shift_jis" }, - { 18 ,"euc-jp" }, - { 19 ,"extended_unix_code_fixed_width_for_japanese" }, - { 20 ,"bs_4730" }, - { 21 ,"sen_850200_c" }, - { 22 ,"it" }, - { 23 ,"es" }, - { 24 ,"din_66003" }, - { 25 ,"ns_4551-1" }, - { 26 ,"nf_z_62-010" }, - { 27 ,"iso-10646-utf-1" }, - { 28 ,"iso_646.basic:1983" }, - { 29 ,"invariant" }, - { 30 ,"iso_646.irv:1983" }, - { 31 ,"nats-sefi" }, - { 32 ,"nats-sefi-add" }, - { 33 ,"nats-dano" }, - { 34 ,"nats-dano-add" }, - { 35 ,"sen_850200_b" }, - { 36 ,"ks_c_5601-1987" }, - { 37 ,"iso-2022-kr" }, - { 38 ,"euc-kr" }, - { 39 ,"iso-2022-jp" }, - { 40 ,"iso-2022-jp-2" }, - { 41 ,"jis_c6220-1969-jp" }, - { 42 ,"jis_c6220-1969-ro" }, - { 43 ,"pt" }, - { 44 ,"greek7-old" }, - { 45 ,"latin-greek" }, - { 46 ,"nf_z_62-010_(1973)" }, - { 47 ,"latin-greek-1" }, - { 48 ,"iso_5427" }, - { 49 ,"jis_c6226-1978" }, - { 50 ,"bs_viewdata" }, - { 51 ,"inis" }, - { 52 ,"inis-8" }, - { 53 ,"inis-cyrillic" }, - { 54 ,"iso_5427:1981" }, - { 55 ,"iso_5428:1980" }, - { 56 ,"gb_1988-80" }, - { 57 ,"gb_2312-80" }, - { 58 ,"ns_4551-2" }, - { 59 ,"videotex-suppl" }, - { 60 ,"pt2" }, - { 61 ,"es2" }, - { 62 ,"msz_7795.3" }, - { 63 ,"jis_c6226-1983" }, - { 64 ,"greek7" }, - { 65 ,"asmo_449" }, - { 66 ,"iso-ir-90" }, - { 67 ,"jis_c6229-1984-a" }, - { 68 ,"jis_c6229-1984-b" }, - { 69 ,"jis_c6229-1984-b-add" }, - { 70 ,"jis_c6229-1984-hand" }, - { 71 ,"jis_c6229-1984-hand-add" }, - { 72 ,"jis_c6229-1984-kana" }, - { 73 ,"iso_2033-1983" }, - { 74 ,"ansi_x3.110-1983" }, - { 75 ,"t.61-7bit" }, - { 76 ,"t.61-8bit" }, - { 77 ,"ecma-cyrillic" }, - { 78 ,"csa_z243.4-1985-1" }, - { 79 ,"csa_z243.4-1985-2" }, - { 80 ,"csa_z243.4-1985-gr" }, - { 81 ,"iso_8859-6-e" }, - { 82 ,"iso_8859-6-i" }, - { 83 ,"t.101-g2" }, - { 84 ,"iso_8859-8-e" }, - { 85 ,"iso_8859-8-i" }, - { 86 ,"csn_369103" }, - { 87 ,"jus_i.b1.002" }, - { 88 ,"iec_p27-1" }, - { 89 ,"jus_i.b1.003-serb" }, - { 90 ,"jus_i.b1.003-mac" }, - { 91 ,"greek-ccitt" }, - { 92 ,"nc_nc00-10:81" }, - { 93 ,"iso_6937-2-25" }, - { 94 ,"gost_19768-74" }, - { 95 ,"iso_8859-supp" }, - { 96 ,"iso_10367-box" }, - { 97 ,"latin-lap" }, - { 98 ,"jis_x0212-1990" }, - { 99 ,"ds_2089" }, - { 100 ,"us-dk" }, - { 101 ,"dk-us" }, - { 102 ,"ksc5636" }, - { 103 ,"unicode-1-1-utf-7" }, - { 104 ,"iso-2022-cn" }, - { 105 ,"iso-2022-cn-ext" }, - { 106 ,"utf-8" }, - { 109 ,"iso-8859-13" }, - { 110 ,"iso-8859-14" }, - { 111 ,"iso-8859-15" }, - { 1000 ,"iso-10646-ucs-2" }, - { 1001 ,"iso-10646-ucs-4" }, - { 1002 ,"iso-10646-ucs-basic" }, - { 1003 ,"iso-10646-j-1" }, - { 1003 ,"iso-10646-unicode-latin1" }, - { 1005 ,"iso-unicode-ibm-1261" }, - { 1006 ,"iso-unicode-ibm-1268" }, - { 1007 ,"iso-unicode-ibm-1276" }, - { 1008 ,"iso-unicode-ibm-1264" }, - { 1009 ,"iso-unicode-ibm-1265" }, - { 1010 ,"unicode-1-1" }, - { 1011 ,"scsu" }, - { 1012 ,"utf-7" }, - { 1013 ,"utf-16be" }, - { 1014 ,"utf-16le" }, - { 1015 ,"utf-16" }, - { 2000 ,"iso-8859-1-windows-3.0-latin-1" }, - { 2001 ,"iso-8859-1-windows-3.1-latin-1" }, - { 2002 ,"iso-8859-2-windows-latin-2" }, - { 2003 ,"iso-8859-9-windows-latin-5" }, - { 2004 ,"hp-roman8" }, - { 2005 ,"adobe-standard-encoding" }, - { 2006 ,"ventura-us" }, - { 2007 ,"ventura-international" }, - { 2008 ,"dec-mcs" }, - { 2009 ,"ibm850" }, - { 2010 ,"ibm852" }, - { 2011 ,"ibm437" }, - { 2012 ,"pc8-danish-norwegian" }, - { 2013 ,"ibm862" }, - { 2014 ,"pc8-turkish" }, - { 2015 ,"ibm-symbols" }, - { 2016 ,"ibm-thai" }, - { 2017 ,"hp-legal" }, - { 2018 ,"hp-pi-font" }, - { 2019 ,"hp-math8" }, - { 2020 ,"adobe-symbol-encoding" }, - { 2021 ,"hp-desktop" }, - { 2022 ,"ventura-math" }, - { 2023 ,"microsoft-publishing" }, - { 2024 ,"windows-31j" }, - { 2025 ,"gb2312" }, - { 2026 ,"big5" }, - { 2027 ,"macintosh" }, - { 2028 ,"ibm037" }, - { 2029 ,"ibm038" }, - { 2030 ,"ibm273" }, - { 2031 ,"ibm274" }, - { 2032 ,"ibm275" }, - { 2033 ,"ibm277" }, - { 2034 ,"ibm278" }, - { 2035 ,"ibm280" }, - { 2036 ,"ibm281" }, - { 2037 ,"ibm284" }, - { 2038 ,"ibm285" }, - { 2039 ,"ibm290" }, - { 2040 ,"ibm297" }, - { 2041 ,"ibm420" }, - { 2042 ,"ibm423" }, - { 2043 ,"ibm424" }, - { 2044 ,"ibm500" }, - { 2045 ,"ibm851" }, - { 2046 ,"ibm855" }, - { 2047 ,"ibm857" }, - { 2048 ,"ibm860" }, - { 2049 ,"ibm861" }, - { 2050 ,"ibm863" }, - { 2051 ,"ibm864" }, - { 2052 ,"ibm865" }, - { 2053 ,"ibm868" }, - { 2054 ,"ibm869" }, - { 2055 ,"ibm870" }, - { 2056 ,"ibm871" }, - { 2057 ,"ibm880" }, - { 2058 ,"ibm891" }, - { 2059 ,"ibm903" }, - { 2060 ,"ibm904" }, - { 2061 ,"ibm905" }, - { 2062 ,"ibm918" }, - { 2063 ,"ibm1026" }, - { 2064 ,"ebcdic-at-de" }, - { 2065 ,"ebcdic-at-de-a" }, - { 2066 ,"ebcdic-ca-fr" }, - { 2067 ,"ebcdic-dk-no" }, - { 2068 ,"ebcdic-dk-no-a" }, - { 2069 ,"ebcdic-fi-se" }, - { 2070 ,"ebcdic-fi-se-a" }, - { 2071 ,"ebcdic-fr" }, - { 2072 ,"ebcdic-it" }, - { 2073 ,"ebcdic-pt" }, - { 2074 ,"ebcdic-es" }, - { 2075 ,"ebcdic-es-a" }, - { 2076 ,"ebcdic-es-s" }, - { 2077 ,"ebcdic-uk" }, - { 2078 ,"ebcdic-us" }, - { 2079 ,"unknown-8bit" }, - { 2080 ,"mnemonic" }, - { 2081 ,"mnem" }, - { 2082 ,"viscii" }, - { 2083 ,"viqr" }, - { 2084 ,"koi8-r" }, - { 2086 ,"ibm866" }, - { 2087 ,"ibm775" }, - { 2088 ,"koi8-u" }, - { 2089 ,"ibm00858" }, - { 2090 ,"ibm00924" }, - { 2091 ,"ibm01140" }, - { 2092 ,"ibm01141" }, - { 2093 ,"ibm01142" }, - { 2094 ,"ibm01143" }, - { 2095 ,"ibm01144" }, - { 2096 ,"ibm01145" }, - { 2097 ,"ibm01146" }, - { 2098 ,"ibm01147" }, - { 2099 ,"ibm01148" }, - { 2100 ,"ibm01149" }, - { 2101 ,"big5-hkscs" }, - { 2250 ,"windows-1250" }, - { 2251 ,"windows-1251" }, - { 2252 ,"windows-1252" }, - { 2253 ,"windows-1253" }, - { 2254 ,"windows-1254" }, - { 2255 ,"windows-1255" }, - { 2256 ,"windows-1256" }, - { 2257 ,"windows-1257" }, - { 2258 ,"windows-1258" }, - { 2259 ,"tis-620" }, - { 0x00, NULL } -}; - static const value_string vals_languages[] = { - { 0x01,"Afar(aa)" }, - { 0x02,"Abkhazian(ab)" }, - { 0x03,"Afrikaans(af)" }, - { 0x04,"Amharic(am)" }, - { 0x05,"Arabic(ar)" }, - { 0x06,"Assamese(as)" }, - { 0x07,"Aymara(ay)" }, - { 0x08,"Azerbaijani(az)" }, - { 0x09,"Bashkir(ba)" }, - { 0x0A,"Byelorussian(be)" }, - { 0x0B,"Bulgarian(bg)" }, - { 0x0C,"Bihari(bh)" }, - { 0x0D,"Bislama(bi)" }, - { 0x0E,"Bengali; Bangla(bn)" }, - { 0x0F,"Tibetan(bo)" }, - { 0x10,"Breton(br)" }, - { 0x11,"Catalan(ca)" }, - { 0x12,"Corsican(co)" }, - { 0x13,"Czech(cs)" }, - { 0x14,"Welsh(cy)" }, - { 0x15,"Danish(da)" }, - { 0x16,"German(de)" }, - { 0x17,"Bhutani(dz)" }, - { 0x18,"Greek(el)" }, - { 0x19,"English(en)" }, - { 0x1A,"Esperanto(eo)" }, - { 0x1B,"Spanish(es)" }, - { 0x1C,"Estonian(et)" }, - { 0x1D,"Basque(eu)" }, - { 0x1E,"Persian(fa)" }, - { 0x1F,"Finnish(fi)" }, - { 0x20,"Fiji(fj)" }, - { 0x22,"French(fr)" }, - { 0x24,"Irish(ga)" }, - { 0x25,"Scots Gaelic(gd)" }, - { 0x26,"Galician(gl)" }, - { 0x27,"Guarani(gn)" }, - { 0x28,"Gujarati(gu)" }, - { 0x29,"Hausa(ha)" }, - { 0x2A,"Hebrew (formerly iw)(he)" }, - { 0x2B,"Hindi(hi)" }, - { 0x2C,"Croatian(hr)" }, - { 0x2D,"Hungarian(hu)" }, - { 0x2E,"Armenian(hy)" }, - { 0x30,"Indonesian (formerly in)(id)" }, - { 0x47,"Maori(mi)" }, - { 0x48,"Macedonian(mk)" }, - { 0x49,"Malayalam(ml)" }, - { 0x4A,"Mongolian(mn)" }, - { 0x4B,"Moldavian(mo)" }, - { 0x4C,"Marathi(mr)" }, - { 0x4D,"Malay(ms)" }, - { 0x4E,"Maltese(mt)" }, - { 0x4F,"Burmese(my)" }, - { 0x51,"Nepali(ne)" }, - { 0x52,"Dutch(nl)" }, - { 0x53,"Norwegian(no)" }, - { 0x54,"Occitan(oc)" }, - { 0x55,"(Afan) Oromo(om)" }, - { 0x56,"Oriya(or)" }, - { 0x57,"Punjabi(pa)" }, - { 0x58,"Polish(po)" }, - { 0x59,"Pashto, Pushto(ps)" }, - { 0x5A,"Portuguese(pt)" }, - { 0x5B,"Quechua(qu)" }, - { 0x5D,"Kirundi(rn)" }, - { 0x5E,"Romanian(ro)" }, - { 0x5F,"Russian(ru)" }, - { 0x60,"Kinyarwanda(rw)" }, - { 0x61,"Sanskrit(sa)" }, - { 0x62,"Sindhi(sd)" }, - { 0x63,"Sangho(sg)" }, - { 0x64,"Serbo-Croatian(sh)" }, - { 0x65,"Sinhalese(si)" }, - { 0x66,"Slovak(sk)" }, - { 0x67,"Slovenian(sl)" }, - { 0x68,"Samoan(sm)" }, - { 0x69,"Shona(sn)" }, - { 0x6A,"Somali(so)" }, - { 0x6B,"Albanian(sq)" }, - { 0x6C,"Serbian(sr)" }, - { 0x6D,"Siswati(ss)" }, - { 0x6E,"Sesotho(st)" }, - { 0x6F,"Sundanese(su)" }, - { 0x70,"Swedish(sv)" }, - { 0x71,"Swahili(sw)" }, - { 0x72,"Tamil(ta)" }, - { 0x73,"Telugu(te)" }, - { 0x74,"Tajik(tg)" }, - { 0x75,"Thai(th)" }, - { 0x76,"Tigrinya(ti)" }, - { 0x81,"Nauru(na)" }, - { 0x82,"Faeroese(fo)" }, - { 0x83,"Frisian(fy)" }, - { 0x84,"Interlingua(ia)" }, - { 0x8C,"Rhaeto-Romance(rm)" }, + { 0x01, "Afar (aa)" }, + { 0x02, "Abkhazian (ab)" }, + { 0x03, "Afrikaans (af)" }, + { 0x04, "Amharic (am)" }, + { 0x05, "Arabic (ar)" }, + { 0x06, "Assamese (as)" }, + { 0x07, "Aymara (ay)" }, + { 0x08, "Azerbaijani (az)" }, + { 0x09, "Bashkir (ba)" }, + { 0x0A, "Byelorussian (be)" }, + { 0x0B, "Bulgarian (bg)" }, + { 0x0C, "Bihari (bh)" }, + { 0x0D, "Bislama (bi)" }, + { 0x0E, "Bengali; Bangla (bn)" }, + { 0x0F, "Tibetan (bo)" }, + { 0x10, "Breton (br)" }, + { 0x11, "Catalan (ca)" }, + { 0x12, "Corsican (co)" }, + { 0x13, "Czech (cs)" }, + { 0x14, "Welsh (cy)" }, + { 0x15, "Danish (da)" }, + { 0x16, "German (de)" }, + { 0x17, "Bhutani (dz)" }, + { 0x18, "Greek (el)" }, + { 0x19, "English (en)" }, + { 0x1A, "Esperanto (eo)" }, + { 0x1B, "Spanish (es)" }, + { 0x1C, "Estonian (et)" }, + { 0x1D, "Basque (eu)" }, + { 0x1E, "Persian (fa)" }, + { 0x1F, "Finnish (fi)" }, + { 0x20, "Fiji (fj)" }, + { 0x22, "French (fr)" }, + { 0x24, "Irish (ga)" }, + { 0x25, "Scots Gaelic (gd)" }, + { 0x26, "Galician (gl)" }, + { 0x27, "Guarani (gn)" }, + { 0x28, "Gujarati (gu)" }, + { 0x29, "Hausa (ha)" }, + { 0x2A, "Hebrew (formerly iw) (he)" }, + { 0x2B, "Hindi (hi)" }, + { 0x2C, "Croatian (hr)" }, + { 0x2D, "Hungarian (hu)" }, + { 0x2E, "Armenian (hy)" }, + { 0x30, "Indonesian (formerly in) (id)" }, + { 0x47, "Maori (mi)" }, + { 0x48, "Macedonian (mk)" }, + { 0x49, "Malayalam (ml)" }, + { 0x4A, "Mongolian (mn)" }, + { 0x4B, "Moldavian (mo)" }, + { 0x4C, "Marathi (mr)" }, + { 0x4D, "Malay (ms)" }, + { 0x4E, "Maltese (mt)" }, + { 0x4F, "Burmese (my)" }, + { 0x51, "Nepali (ne)" }, + { 0x52, "Dutch (nl)" }, + { 0x53, "Norwegian (no)" }, + { 0x54, "Occitan (oc)" }, + { 0x55, "(Afan) Oromo (om)" }, + { 0x56, "Oriya (or)" }, + { 0x57, "Punjabi (pa)" }, + { 0x58, "Polish (po)" }, + { 0x59, "Pashto, Pushto (ps)" }, + { 0x5A, "Portuguese (pt)" }, + { 0x5B, "Quechua (qu)" }, + { 0x5D, "Kirundi (rn)" }, + { 0x5E, "Romanian (ro)" }, + { 0x5F, "Russian (ru)" }, + { 0x60, "Kinyarwanda (rw)" }, + { 0x61, "Sanskrit (sa)" }, + { 0x62, "Sindhi (sd)" }, + { 0x63, "Sangho (sg)" }, + { 0x64, "Serbo-Croatian (sh)" }, + { 0x65, "Sinhalese (si)" }, + { 0x66, "Slovak (sk)" }, + { 0x67, "Slovenian (sl)" }, + { 0x68, "Samoan (sm)" }, + { 0x69, "Shona (sn)" }, + { 0x6A, "Somali (so)" }, + { 0x6B, "Albanian (sq)" }, + { 0x6C, "Serbian (sr)" }, + { 0x6D, "Siswati (ss)" }, + { 0x6E, "Sesotho (st)" }, + { 0x6F, "Sundanese (su)" }, + { 0x70, "Swedish (sv)" }, + { 0x71, "Swahili (sw)" }, + { 0x72, "Tamil (ta)" }, + { 0x73, "Telugu (te)" }, + { 0x74, "Tajik (tg)" }, + { 0x75, "Thai (th)" }, + { 0x76, "Tigrinya (ti)" }, + { 0x81, "Nauru (na)" }, + { 0x82, "Faeroese (fo)" }, + { 0x83, "Frisian (fy)" }, + { 0x84, "Interlingua (ia)" }, + { 0x8C, "Rhaeto-Romance (rm)" }, { 0x00, NULL } }; @@ -680,163 +377,6 @@ static const value_string vals_transfer_encoding[] = { { 0x80, "Chunked" }, { 0x00, NULL } }; -static const value_string wtls_vals_record_type[] = { - { 0x01, "change_cipher_data" }, - { 0x02, "alert" }, - { 0x03, "handshake" }, - { 0x04, "application_data" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_cipher_bulk[] = { - { 0x00, "Null" }, - { 0x01, "RC5 CBC 40" }, - { 0x02, "RC5 CBC 56" }, - { 0x03, "RC5 CBC" }, - { 0x04, "DES CBC 40" }, - { 0x05, "DES CBC" }, - { 0x06, "3DES CBC cwEDE40" }, - { 0x07, "IDEA CBC 40" }, - { 0x08, "IDEA CBC 56" }, - { 0x09, "IDEA CBC" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_cipher_mac[] = { - { 0x00, "SHA 0" }, - { 0x01, "SHA 40 " }, - { 0x02, "SHA 80" }, - { 0x03, "SHA" }, - { 0x04, "SHA XOR 40" }, - { 0x05, "MD5 40" }, - { 0x06, "MD5 80" }, - { 0x07, "MD5" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_handshake_type[] = { - { 0, "Hello Request" }, - { 1, "Client Hello" }, - { 2, "Server Hello" }, - { 11, "Certificate" }, - { 12, "Server Key Exchange" }, - { 13, "Certificate Request" }, - { 14, "Server Hello Done" }, - { 15, "Certificate Verify" }, - { 16, "Client Key Exchange" }, - { 20, "Finished" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_key_exchange_suite[] = { - { 0, "NULL" }, - { 1, "Shared Secret" }, - { 2, "Diffie Hellman Anonymous" }, - { 3, "Diffie Hellman Anonymous 512" }, - { 4, "Diffie Hellman Anonymous 768" }, - { 5, "RSA Anonymous" }, - { 6, "RSA Anonymous 512" }, - { 7, "RSA Anonymous 768" }, - { 8, "RSA" }, - { 9, "RSA 512" }, - { 10, "RSA 768" }, - { 11, "EC Diffie Hellman Anonymous" }, - { 12, "EC Diffie Hellman Anonymous 113" }, - { 13, "EC Diffie Hellman Anonymous 131" }, - { 14, "EC Diffie Hellman ECDSA" }, - { 15, "EC Diffie Hellman Anonymous Uncomp" }, - { 16, "EC Diffie Hellman Anonymous Uncomp 113" }, - { 17, "EC Diffie Hellman Anonymous Uncomp 131" }, - { 18, "EC Diffie Hellman ECDSA Uncomp" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_identifier_type[] = { - { 0, "No identifier" }, - { 1, "Textual Name" }, - { 2, "Binary Name" }, - { 254, "SHA-1 Hash Publie Key" }, - { 255, "x509 Distinguished Name" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_certificate_type[] = { - { 1, "WTLS" }, - { 2, "X509" }, - { 3, "X968" }, - { 4, "Url" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_compression[] = { - { 0, "Null" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_sequence_mode[] = { - { 0, "Off" }, - { 1, "Implicit" }, - { 2, "Explicit" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_certificate_signature[] = { - { 0, "Anonymous" }, - { 1, "ECDSA_SHA" }, - { 2, "RSA_SHA" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_public_key_type[] = { - { 2, "RSA" }, - { 3, "ECDH" }, - { 4, "ECSA" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_alert_level[] = { - { 1, "Warning" }, - { 2, "Critical" }, - { 3, "Fatal" }, - { 0x00, NULL } -}; - -static const value_string wtls_vals_alert_description[] = { - { 0,"connection_close_notify"}, - { 1,"session_close_notify"}, - { 5,"no_connection"}, - { 10,"unexpected_message"}, - { 11,"time_required"}, - { 20,"bad_record_mac"}, - { 21,"decryption_failed"}, - { 22,"record_overflow"}, - { 30,"decompression_failure"}, - { 40,"handshake_failure"}, - { 42,"bad_certificate"}, - { 43,"unsupported_certificate"}, - { 44,"certificate_revoked"}, - { 45,"certificate_expired"}, - { 46,"certificate_unknown"}, - { 47,"illegal_parameter"}, - { 48,"unknown_ca"}, - { 49,"access_denied"}, - { 50,"decode_error"}, - { 51,"decrypt_error"}, - { 52,"unknown_key_id"}, - { 53,"disabled_key_id"}, - { 54,"key_exchange_disabled"}, - { 55,"session_not_ready"}, - { 56,"unknown_parameter_index"}, - { 57,"duplicate_finished_received"}, - { 60,"export_restriction"}, - { 70,"protocol_version"}, - { 71,"insufficient_security"}, - { 80,"internal_error"}, - { 90,"user_canceled"}, - { 100,"no_renegotiation"}, - { 0x00, NULL } -}; - /* * Windows appears to define DELETE. @@ -867,95 +407,18 @@ enum { PUT = 0x61, /* No sample data */ }; -#define WTLS_RECORD_TYPE_LENGTH 0x80 -#define WTLS_RECORD_TYPE_SEQUENCE 0x40 -#define WTLS_RECORD_TYPE_CIPHER_CUR 0x20 -#define WTLS_RECORD_CONTENT_TYPE 0x0f - -#define WTLS_ALERT 0x02 -#define WTLS_PLAIN_HANDSHAKE 0x03 - -#define WTLS_HANDSHAKE_CLIENT_HELLO 1 -#define WTLS_HANDSHAKE_SERVER_HELLO 2 -#define WTLS_HANDSHAKE_CERTIFICATE 11 - -#define CERTIFICATE_WTLS 1 -#define CERTIFICATE_X509 2 -#define CERTIFICATE_X968 3 -#define CERTIFICATE_URL 4 - -#define IDENTIFIER_NULL 0 -#define IDENTIFIER_TEXT 1 -#define IDENTIFIER_BIN 2 -#define IDENTIFIER_SHA_1 254 -#define IDENTIFIER_X509 255 - -#define PUBLIC_KEY_RSA 2 -#define PUBLIC_KEY_ECDH 3 -#define PUBLIC_KEY_ECDSA 4 - static void add_uri (proto_tree *, tvbuff_t *, guint, guint); static void add_headers (proto_tree *, tvbuff_t *); static void add_header (proto_tree *, tvbuff_t *, tvbuff_t *); static guint get_value_length (tvbuff_t *, guint, guint *); static guint add_content_type (proto_tree *, tvbuff_t *, guint, guint *); +static gint get_date_value (tvbuff_t * ,guint ,struct timeval *); +static void add_date_value (tvbuff_t * ,guint ,proto_tree * ,int , + tvbuff_t * ,guint ,guint ,struct timeval *, const char *); static guint add_parameter (proto_tree *, tvbuff_t *, guint); static guint add_parameter_charset (proto_tree *, tvbuff_t *, guint, guint); static void add_post_data (proto_tree *, tvbuff_t *, guint); static void add_post_variable (proto_tree *, tvbuff_t *, guint, guint, guint, guint); -static void dissect_wtls_handshake (proto_tree *, tvbuff_t *, guint, guint); - -/* - * Accessor to retrieve variable length int as used in WAP protocol. - * The value is encoded in the lower 7 bits. If the top bit is set, then the - * value continues into the next byte. - * The octetCount parameter holds the number of bytes read in order to return - * the final value. Can be pre-initialised to start at offset+count. -*/ -static guint -tvb_get_guintvar (tvbuff_t *tvb, guint offset, guint *octetCount) -{ - guint value = 0; - guint octet; - guint counter = 0; - char cont = 1; - - if (octetCount == NULL) - { -#ifdef DEBUG - fprintf (stderr, "dissect_wsp: Starting tvb_get_guintvar at offset %d, count=NULL\n", offset); -#endif - } - else - { -#ifdef DEBUG - fprintf (stderr, "dissect_wsp: Starting tvb_get_guintvar at offset %d, count=%d\n", offset, *octetCount); -#endif - counter = *octetCount; - } - - while (cont != 0) - { - value<<=7; /* Value only exists in 7 of the 8 bits */ - octet = tvb_get_guint8 (tvb, offset+counter); - counter++; - value += (octet & 0x7F); - cont = (octet & 0x80); -#ifdef DEBUG - fprintf (stderr, "dissect_wsp: octet is %d (0x%02x), count=%d, value=%d, cont=%d\n", octet, octet, counter, value, cont); -#endif - } - - if (octetCount != NULL) - { - *octetCount = counter; -#ifdef DEBUG - fprintf (stderr, "dissect_wsp: Leaving tvb_get_guintvar count=%d\n", *octetCount); -#endif - } - - return (value); -} /* Code to actually dissect the packets */ static void @@ -985,22 +448,43 @@ dissect_wsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* proto_tree *wsp_header_fixed; */ proto_tree *wsp_capabilities; +/* This field shows up as the "Info" column in the display; you should make + it, if possible, summarize what's in the packet, so that a user looking + at the list of packets can tell what type of packet it is. */ + + /* Display protocol type depending on the port */ if (check_col(fdata, COL_PROTOCOL)) { - col_set_str(fdata, COL_PROTOCOL, "WSP" ); + switch ( pinfo->match_port ) + { + case UDP_PORT_WSP: + col_set_str(fdata, COL_PROTOCOL, "WSP" ); + break; + case UDP_PORT_WTLS_WSP: + col_set_str(fdata, COL_PROTOCOL, "WTLS+WSP" ); + break; + } } - if (check_col(fdata, COL_INFO)) { + + /* Clear the Info column before we fetch anything from the packet */ + if (check_col(fdata, COL_INFO)) + { col_clear(fdata, COL_INFO); - }; + } /* Connection-less mode has a TID first */ - offset++; + if ( (pinfo->match_port == UDP_PORT_WSP) || + (pinfo->match_port == UDP_PORT_WTLS_WSP)) + { + offset++; + }; /* Find the PDU type */ pdut = tvb_get_guint8 (tvb, offset); /* Develop the string to put in the Info column */ - if (check_col(fdata, COL_INFO)) { + if (check_col(fdata, COL_INFO)) + { col_add_fstr(fdata, COL_INFO, "WSP %s", val_to_str (pdut, vals_pdu_type, "Unknown PDU type (0x%02x)")); }; @@ -1014,712 +498,169 @@ dissect_wsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Code to process the packet goes here */ /* - wsp_header_fixed = proto_item_add_subtree(ti, ett_header); + wsp_header_fixed = proto_item_add_subtree(ti, ett_header ); */ - /* Add common items: only TID and PDU Type */ - - /* TID Field is always first (if it exists) */ - ti = proto_tree_add_item (wsp_tree, hf_wsp_header_tid,tvb,0,1,bo_little_endian); - - ti = proto_tree_add_item( - wsp_tree, /* tree */ - hf_wsp_header_pdu_type, /* id */ - tvb, - offset++, /* start of high light */ - 1, /* length of high light */ - bo_little_endian /* value */ - ); + /* Add common items: only TID and PDU Type */ - switch (pdut) - { - case CONNECT: - ti = proto_tree_add_item (wsp_tree, hf_wsp_version_major,tvb,offset,1,bo_little_endian); - ti = proto_tree_add_item (wsp_tree, hf_wsp_version_minor,tvb,offset,1,bo_little_endian); - offset++; - capabilityStart = offset; - capabilityLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); - - count = 0; - headerStart = offset; - headerLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); - if (capabilityLength > 0) - { - ti = proto_tree_add_item (wsp_tree, hf_wsp_capabilities_section,tvb,offset,capabilityLength,bo_little_endian); - wsp_capabilities = proto_item_add_subtree( ti, ett_capabilities ); - offset += capabilityLength; - } - - if (headerLength > 0) + /* If this is connectionless, then the TID Field is always first */ + if ( (pinfo->match_port == UDP_PORT_WSP) || + (pinfo->match_port == UDP_PORT_WTLS_WSP)) { - tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); + ti = proto_tree_add_item (wsp_tree, hf_wsp_header_tid,tvb, + 0,1,bo_little_endian); } - break; - - case CONNECTREPLY: - value = tvb_get_guintvar (tvb, offset, &count); - ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); - offset += count; - - count = 0; - capabilityStart = offset; - capabilityLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); - - count = 0; - headerStart = offset; - headerLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); - if (capabilityLength > 0) - { - ti = proto_tree_add_item (wsp_tree, hf_wsp_capabilities_section,tvb,offset,capabilityLength,bo_little_endian); - wsp_capabilities = proto_item_add_subtree( ti, ett_capabilities ); - offset += capabilityLength; - } + ti = proto_tree_add_item( + wsp_tree, /* tree */ + hf_wsp_header_pdu_type, /* id */ + tvb, + offset++, /* start of high light */ + 1, /* length of high light */ + bo_little_endian /* value */ + ); - if (headerLength > 0) + switch (pdut) { - /* - ti = proto_tree_add_item (wsp_tree, hf_wsp_headers_section,tvb,offset,headerLength,bo_little_endian); - wsp_headers = proto_item_add_subtree( ti, ett_headers ); - */ - tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); - } - - break; - - case DISCONNECT: - value = tvb_get_guintvar (tvb, offset, &count); - ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); - break; - - case GET: - /* Length of URI and size of URILen field */ - count = 0; - value = tvb_get_guintvar (tvb, offset, &count); - nextOffset = offset + count; - add_uri (wsp_tree, tvb, offset, nextOffset); - offset += (value+count); - tmp_tvb = tvb_new_subset (tvb, offset, -1, -1); - add_headers (wsp_tree, tmp_tvb); - break; - - case POST: - /* Length of URI and size of URILen field */ - uriStart = offset; - uriLength = tvb_get_guintvar (tvb, offset, &count); - headerStart = uriStart+count; - count = 0; - headersLength = tvb_get_guintvar (tvb, headerStart, &count); - offset = headerStart + count; - - add_uri (wsp_tree, tvb, uriStart, offset); - offset += uriLength; - - ti = proto_tree_add_item (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,bo_little_endian); - - contentTypeStart = offset; - nextOffset = add_content_type (wsp_tree, tvb, offset, &contentType); - - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for value-(length of content-type field)*/ - headerLength = headersLength-(nextOffset-contentTypeStart); - tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); - - /* TODO: Post DATA */ - /* Runs from start of headers+headerLength to END_OF_FRAME */ - offset = nextOffset+headerLength; - tmp_tvb = tvb_new_subset (tvb, offset, tvb_reported_length (tvb)-offset, tvb_reported_length (tvb)-offset); - add_post_data (wsp_tree, tmp_tvb, contentType); - break; - - case REPLY: - ti = proto_tree_add_item (wsp_tree, hf_wsp_header_status,tvb,offset,1,bo_little_endian); - value = tvb_get_guintvar (tvb, offset+1, &count); - nextOffset = offset + 1 + count; - - ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,offset+1,count,value); - - contentTypeStart = nextOffset; - nextOffset = add_content_type (wsp_tree, tvb, nextOffset, &contentType); - - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for value-(length of content-type field)*/ - headerLength = value-(nextOffset-contentTypeStart); - tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); - offset += count+value+1; - - /* TODO: Data - decode WMLC */ - /* Runs from offset+1+count+value+1 to END_OF_FRAME */ - if (offset < tvb_reported_length (tvb)) - { - ti = proto_tree_add_item (wsp_tree, hf_wsp_reply_data,tvb,offset,tvb_reported_length(tvb)-offset,bo_little_endian); - } - break; - } - } -} - -/* Code to actually dissect the packets */ -static void -dissect_wtls(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) -{ - frame_data *fdata = pinfo->fd; - int offset = 0; - - char pdut; - char pdu_msg_type; - guint count = 0; - guint offset_wtls = 0; - -/* Set up structures we will need to add the protocol subtree and manage it */ - proto_item *ti; - proto_tree *wtls_tree; - proto_tree *wtls_rec_tree; - proto_tree *wtls_msg_type_tree; - - if (check_col(fdata, COL_PROTOCOL)) - { - col_set_str(fdata, COL_PROTOCOL, "WTLS+WSP" ); - } - - /* Develop the string to put in the Info column */ - if (check_col(fdata, COL_INFO)) { - col_set_str(fdata, COL_INFO, "WTLS" ); - }; - - /* In the interest of speed, if "tree" is NULL, don't do any work not - necessary to generate protocol tree items. */ - - if (tree) { - ti = proto_tree_add_item(tree, proto_wtls, tvb, offset_wtls, - tvb_length(tvb), bo_little_endian); - wtls_tree = proto_item_add_subtree(ti, ett_wsp); - - for (offset_wtls=0; offset_wtls < (tvb_length(tvb)-1);) { - pdut = tvb_get_guint8 (tvb, offset_wtls); - - offset = offset_wtls+1; - - if (pdut & WTLS_RECORD_TYPE_SEQUENCE) { - offset+=2; - } - if (pdut & WTLS_RECORD_TYPE_LENGTH) { - count = tvb_get_ntohs(tvb, offset); - offset+=2; - count += offset-offset_wtls; - } - else { - count = tvb_length (tvb)-offset_wtls; - } - ti = proto_tree_add_uint(wtls_tree, hf_wtls_record, tvb, offset_wtls, - count, pdut); - wtls_rec_tree = proto_item_add_subtree(ti, ett_wtls_rec); + case CONNECT: + ti = proto_tree_add_item (wsp_tree, hf_wsp_version_major,tvb,offset,1,bo_little_endian); + ti = proto_tree_add_item (wsp_tree, hf_wsp_version_minor,tvb,offset,1,bo_little_endian); + offset++; + capabilityStart = offset; + count = 0; /* Initialise count */ + capabilityLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); + + headerStart = offset; + count = 0; /* Initialise count */ + headerLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); + if (capabilityLength > 0) + { + ti = proto_tree_add_item (wsp_tree, hf_wsp_capabilities_section,tvb,offset,capabilityLength,bo_little_endian); + wsp_capabilities = proto_item_add_subtree( ti, ett_capabilities ); + offset += capabilityLength; + } - offset = offset_wtls; + if (headerLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb); + } - ti = proto_tree_add_item (wtls_rec_tree, hf_wtls_record_type, - tvb,offset,1,bo_big_endian); + break; - offset++; + case CONNECTREPLY: + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset, &count); + ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); + offset += count; + + capabilityStart = offset; + count = 0; /* Initialise count */ + capabilityLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); + + headerStart = offset; + count = 0; /* Initialise count */ + headerLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); + if (capabilityLength > 0) + { + ti = proto_tree_add_item (wsp_tree, hf_wsp_capabilities_section,tvb,offset,capabilityLength,bo_little_endian); + wsp_capabilities = proto_item_add_subtree( ti, ett_capabilities ); + offset += capabilityLength; + } - offset_wtls += count; + if (headerLength > 0) + { - if (pdut & WTLS_RECORD_TYPE_SEQUENCE) { - ti = proto_tree_add_item (wtls_rec_tree, hf_wtls_record_sequence, - tvb,offset,2,bo_big_endian); - offset+=2; - } - if (pdut & WTLS_RECORD_TYPE_LENGTH) { - count = tvb_get_ntohs(tvb, offset); - ti = proto_tree_add_item (wtls_rec_tree, hf_wtls_record_length, - tvb,offset,2,bo_big_endian); - offset+=2; - } - else { - count = tvb_length (tvb)-offset; - } + /* + ti = proto_tree_add_item (wsp_tree, hf_wsp_headers_section,tvb,offset,headerLength,bo_little_endian); + wsp_headers = proto_item_add_subtree( ti, ett_headers ); + */ + tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb); + } - if (pdut & WTLS_RECORD_TYPE_CIPHER_CUR) { - ti = proto_tree_add_item (wtls_rec_tree, hf_wtls_record_ciphered, - tvb,offset,count,bo_big_endian); - continue; - } + break; - switch (pdut & WTLS_RECORD_CONTENT_TYPE) { - case WTLS_PLAIN_HANDSHAKE : - dissect_wtls_handshake(wtls_rec_tree,tvb,offset,count); + case DISCONNECT: + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset, &count); + ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); break; - case WTLS_ALERT : - ti = proto_tree_add_item(wtls_rec_tree, hf_wtls_alert, tvb, offset, - count, bo_little_endian); - wtls_msg_type_tree = proto_item_add_subtree(ti, ett_wtls_msg_type); - pdu_msg_type = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item (wtls_msg_type_tree, hf_wtls_alert_level, - tvb,offset,1,bo_big_endian); - offset+=1; - count = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item (wtls_msg_type_tree, hf_wtls_alert_description, - tvb,offset,1,bo_big_endian); - offset+=1; - default: - offset+=count; + + case GET: + count = 0; /* Initialise count */ + /* Length of URI and size of URILen field */ + value = tvb_get_guintvar (tvb, offset, &count); + nextOffset = offset + count; + add_uri (wsp_tree, tvb, offset, nextOffset); + offset += (value+count); /* VERIFY */ + tmp_tvb = tvb_new_subset (tvb, offset, -1, -1); + add_headers (wsp_tree, tmp_tvb); break; - } - } - } -} -static void -dissect_wtls_handshake(proto_tree *tree, tvbuff_t *tvb, guint offset, guint count) -{ - char pdu_msg_type; - struct timeval timeValue; - int client_size = 0; - guint value = 0; - guint value_exponent; - int size = 0; - guint public_key = 0; - guint signature = 0; - char *newBuffer; + case POST: + uriStart = offset; + count = 0; /* Initialise count */ + uriLength = tvb_get_guintvar (tvb, offset, &count); + headerStart = uriStart+count; + count = 0; /* Initialise count */ + headersLength = tvb_get_guintvar (tvb, headerStart, &count); + offset = headerStart + count; + + add_uri (wsp_tree, tvb, uriStart, offset); + offset += uriLength; + + ti = proto_tree_add_item (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,bo_little_endian); + + contentTypeStart = offset; + nextOffset = add_content_type (wsp_tree, tvb, offset, &contentType); + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for value-(length of content-type field)*/ + headerLength = headersLength-(nextOffset-contentTypeStart); + tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb); + + /* TODO: Post DATA */ + /* Runs from start of headers+headerLength to END_OF_FRAME */ + offset = nextOffset+headerLength; + tmp_tvb = tvb_new_subset (tvb, offset, tvb_reported_length (tvb)-offset, tvb_reported_length (tvb)-offset); + add_post_data (wsp_tree, tmp_tvb, contentType); + break; - proto_item *ti; - proto_item *cli_key_item; - proto_tree *wtls_msg_type_tree; - proto_tree *wtls_msg_type_item_tree; - proto_tree *wtls_msg_type_item_sub_tree; - proto_tree *wtls_msg_type_item_sub_sub_tree; - - pdu_msg_type = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_uint(tree, hf_wtls_hands, tvb, offset,count, pdu_msg_type); - wtls_msg_type_tree = proto_item_add_subtree(ti, ett_wtls_msg_type); - - ti = proto_tree_add_item (wtls_msg_type_tree, hf_wtls_hands_type, - tvb,offset,1,bo_big_endian); - offset+=1; - count = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item (wtls_msg_type_tree, hf_wtls_hands_length, - tvb,offset,2,bo_big_endian); - offset+=2; - switch(pdu_msg_type) { - case WTLS_HANDSHAKE_CLIENT_HELLO : - ti = proto_tree_add_item(wtls_msg_type_tree, hf_wtls_hands_cli_hello, tvb, offset, - count, bo_little_endian); - wtls_msg_type_item_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item); - ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_version, - tvb,offset,1,bo_big_endian); - offset++; - timeValue.tv_sec = tvb_get_ntohl (tvb, offset); - timeValue.tv_usec = 0; - ti = proto_tree_add_time (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_gmt, tvb, - offset, 4, &timeValue); - offset+=4; - ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_random, - tvb,offset,12,bo_big_endian); - offset+=12; - count = tvb_get_guint8(tvb, offset); - ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_cli_hello_session, - tvb,offset,count+1,bo_big_endian); - offset+=1+count; - count = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_cli_hello_cli_key_id, tvb, offset, - count+2, bo_little_endian); - wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub); - offset+=2; - for (;count > 0;count-=client_size) { - cli_key_item = proto_tree_add_uint(wtls_msg_type_item_sub_tree, - hf_wtls_hands_cli_hello_key_exchange, tvb, offset,1, - tvb_get_guint8 (tvb,offset)); - client_size=1; - wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item, - ett_wtls_msg_type_item_sub_sub); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_exchange_suite, - tvb,offset,1,bo_big_endian); - offset++; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_parameter_index, - tvb,offset,1,bo_big_endian); - offset++; - client_size++; - if (value == 0xff) { - size = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_parameter_set, - tvb,offset,size+2,bo_big_endian); - offset+=size+2; - client_size+=size+2; - } - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_identifier_type, - tvb,offset,1,bo_big_endian); - offset++; - client_size++; - proto_item_set_len(cli_key_item, client_size); - } - count = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_cli_hello_trust_key_id, tvb, offset, - count+2, bo_little_endian); - wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub); - offset+=2; - for (;count > 0;count-=client_size) { - cli_key_item = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_cli_hello_key_exchange, tvb, offset,1, - bo_little_endian); - client_size=1; - wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item, - ett_wtls_msg_type_item_sub_sub); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_exchange_suite, - tvb,offset,1,bo_big_endian); - offset++; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_parameter_index, - tvb,offset,1,bo_big_endian); - offset++; - client_size++; - if (value == 0xff) { - size = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_parameter_set, - tvb,offset,size+2,bo_big_endian); - offset+=size+2; - client_size+=size+2; - } - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_key_identifier_type, - tvb,offset,1,bo_big_endian); - offset++; - client_size++; - proto_item_set_len(cli_key_item, client_size); - } - count = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_cli_hello_cipher_suite, tvb, offset, - count+1, bo_little_endian); - wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub); - offset+=1; - for (;count > 0;count-=client_size) { - cli_key_item = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_cli_hello_cipher_suite_item, tvb, offset,1, - bo_little_endian); - client_size=1; - wtls_msg_type_item_sub_sub_tree = proto_item_add_subtree(cli_key_item, - ett_wtls_msg_type_item_sub_sub); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_cipher_bulk, - tvb,offset,1,bo_big_endian); - offset++; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_sub_tree, - hf_wtls_hands_cli_hello_cipher_mac, - tvb,offset,1,bo_big_endian); - offset++; - client_size++; - proto_item_set_len(cli_key_item, client_size); - } - count = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_cli_hello_compression_methods, tvb, offset, - count+1, bo_little_endian); - wtls_msg_type_item_sub_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item_sub); - offset+=1; - for (;count > 0;count-=client_size) { - client_size=0; - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_cli_hello_compression, tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - } - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_cli_hello_sequence_mode, tvb, offset, - 1, bo_little_endian); - offset++; - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_cli_hello_key_refresh, tvb, offset, - 1, bo_little_endian); - break; - case WTLS_HANDSHAKE_SERVER_HELLO : - ti = proto_tree_add_item(wtls_msg_type_tree, hf_wtls_hands_serv_hello, tvb, offset, - count, bo_little_endian); - wtls_msg_type_item_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item); - ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_version, - tvb,offset,1,bo_big_endian); - offset++; - timeValue.tv_sec = tvb_get_ntohl (tvb, offset); - timeValue.tv_usec = 0; - ti = proto_tree_add_time (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_gmt, tvb, - offset, 4, &timeValue); - offset+=4; - ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_random, - tvb,offset,12,bo_big_endian); - offset+=12; - count = tvb_get_guint8(tvb, offset); - ti = proto_tree_add_item (wtls_msg_type_item_tree, hf_wtls_hands_serv_hello_session, - tvb,offset,count+1,bo_big_endian); - offset+=1+count; - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_serv_hello_cli_key_id, - tvb,offset,1,bo_big_endian); - offset++; - cli_key_item = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_serv_hello_cipher_suite_item, tvb, offset,2, - bo_little_endian); - wtls_msg_type_item_sub_tree = proto_item_add_subtree(cli_key_item, - ett_wtls_msg_type_item_sub); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_serv_hello_cipher_bulk, - tvb,offset,1,bo_big_endian); - offset++; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_serv_hello_cipher_mac, - tvb,offset,1,bo_big_endian); - offset++; - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_serv_hello_compression, tvb, offset,1, - bo_little_endian); - offset++; - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_serv_hello_sequence_mode, tvb, offset, - 1, bo_little_endian); - offset++; - ti = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_serv_hello_key_refresh, tvb, offset, - 1, bo_little_endian); - offset++; - break; - case WTLS_HANDSHAKE_CERTIFICATE : - ti = proto_tree_add_item(wtls_msg_type_tree, hf_wtls_hands_certificates, - tvb, offset,count, bo_little_endian); - wtls_msg_type_item_tree = proto_item_add_subtree(ti, ett_wtls_msg_type_item); - count = tvb_get_ntohs (tvb, offset); - offset+=2; - for (;count > 0;count-=client_size) { - cli_key_item = proto_tree_add_item(wtls_msg_type_item_tree, - hf_wtls_hands_certificate, tvb, offset,1, - bo_little_endian); - client_size=0; - wtls_msg_type_item_sub_tree = proto_item_add_subtree(cli_key_item, - ett_wtls_msg_type_item_sub); - proto_item_set_len(cli_key_item, client_size); - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_type, tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - switch(value) { - case CERTIFICATE_WTLS: - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_version, - tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - signature = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_signature_type, - tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_issuer_type, - tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - switch (value) { - case IDENTIFIER_NULL : - break; - case IDENTIFIER_TEXT : - ti = proto_tree_add_item( - wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_issuer_charset, - tvb, offset,2, - bo_big_endian); - offset+=2; - client_size+=2; - value = tvb_get_guint8 (tvb, offset); - newBuffer = g_malloc (value+1); - strncpy (newBuffer, tvb_get_ptr (tvb, offset+1, value), value); - newBuffer[value] = 0; - ti = proto_tree_add_string( - wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_issuer_name, - tvb, offset,1+value, - newBuffer); - g_free (newBuffer); - offset+=1+value; - client_size+=1+value; - break; - case IDENTIFIER_BIN : - break; - case IDENTIFIER_SHA_1 : - break; - case IDENTIFIER_X509 : - break; - } - timeValue.tv_sec = tvb_get_ntohl (tvb, offset); - timeValue.tv_usec = 0; - ti = proto_tree_add_time (wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_valid_not_before, - tvb, offset, 4, &timeValue); - offset+=4; - client_size+=4; - timeValue.tv_sec = tvb_get_ntohl (tvb, offset); - timeValue.tv_usec = 0; - ti = proto_tree_add_time (wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_valid_not_after, - tvb, offset, 4, &timeValue); - offset+=4; - client_size+=4; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_subject_type, - tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - switch (value) { - case IDENTIFIER_NULL : - break; - case IDENTIFIER_TEXT : - ti = proto_tree_add_item( - wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_subject_charset, - tvb, offset,2, - bo_big_endian); - offset+=2; - client_size+=2; - value = tvb_get_guint8 (tvb, offset); - newBuffer = g_malloc (value+1); - strncpy (newBuffer, tvb_get_ptr (tvb, offset+1, value), value); - newBuffer[value] = 0; - ti = proto_tree_add_string( - wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_subject_name, - tvb, offset,1+value, - newBuffer); - g_free (newBuffer); - offset+=1+value; - client_size+=1+value; - break; - case IDENTIFIER_BIN : - break; - case IDENTIFIER_SHA_1 : - break; - case IDENTIFIER_X509 : - break; - } - public_key = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_public_key_type, - tvb, offset,1, - bo_little_endian); - offset++; - client_size++; - value = tvb_get_guint8 (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_key_parameter_index, - tvb,offset,1,bo_big_endian); - offset++; - client_size++; - if (value == 0xff) { - size = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_item(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_key_parameter_set, - tvb,offset,size+2,bo_big_endian); - offset+=size+2; - client_size+=size+2; - } - switch (public_key) { - case PUBLIC_KEY_RSA : - value = tvb_get_ntohs (tvb, offset); - switch (value) - { - case 1 : - value_exponent = tvb_get_guint8 (tvb, offset+2); - break; - case 2 : - value_exponent = tvb_get_ntohs (tvb, offset+2); - break; - case 3 : - value_exponent = tvb_get_ntoh24 (tvb, offset+2); - break; - case 4 : - value_exponent = tvb_get_ntohl (tvb, offset+2); - break; - default : - value_exponent = 0; - break; - } - ti = proto_tree_add_uint(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_rsa_exponent, - tvb,offset,value+2,value_exponent); - offset+=2+value; - client_size+=2+value; - value = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_uint(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_rsa_modules, - tvb,offset,value+2,value*8); - offset+=2+value; - client_size+=2+value; - break; - case PUBLIC_KEY_ECDH : - break; - case PUBLIC_KEY_ECDSA : - break; - } - value = tvb_get_ntohs (tvb, offset); - ti = proto_tree_add_uint(wtls_msg_type_item_sub_tree, - hf_wtls_hands_certificate_wtls_signature, - tvb,offset,2+value,value*8); - offset+=2+value; - client_size+=2+value; - break; - case CERTIFICATE_X509: - case CERTIFICATE_X968: - value = tvb_get_ntohs (tvb, offset); - offset+=2; - client_size+=2; - client_size += value; - offset += value; - break; - case CERTIFICATE_URL: - value = tvb_get_guint8 (tvb, offset); - offset++; - client_size++; - client_size += value; - offset += value; - break; - } - proto_item_set_len(cli_key_item, client_size); + case REPLY: + ti = proto_tree_add_item (wsp_tree, hf_wsp_header_status,tvb,offset,1,bo_little_endian); + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset+1, &count); + nextOffset = offset + 1 + count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,offset+1,count,value); + + contentTypeStart = nextOffset; + nextOffset = add_content_type (wsp_tree, tvb, nextOffset, &contentType); + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for value-(length of content-type field)*/ + headerLength = value-(nextOffset-contentTypeStart); + tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb); + offset += count+value+1; + + /* TODO: Data - decode WMLC */ + /* Runs from offset+1+count+value+1 to END_OF_FRAME */ + if (offset < tvb_reported_length (tvb)) + { + ti = proto_tree_add_item (wsp_tree, hf_wsp_reply_data,tvb,offset,END_OF_FRAME,bo_little_endian); + } + break; } - break; - default: - offset+=count; - break; } } @@ -1824,6 +765,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb) #ifdef DEBUG fprintf (stderr, "dissect_wsp: Looking for %d octets\n", peek); #endif + /* VERIFY: valueStart++; */ valueEnd = offset+1+peek; offset += (peek+1); } @@ -1832,7 +774,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb) #ifdef DEBUG fprintf (stderr, "dissect_wsp: Looking for uintvar octets\n"); #endif - count = 0; + count = 0; /* Initialise count */ tvb_get_guintvar (tvb, valueStart, &count); valueEnd = offset+1+count; offset += (count+1); @@ -1869,17 +811,23 @@ static void add_header (proto_tree *tree, tvbuff_t *header_buff, tvbuff_t *value_buff) { guint offset = 0; + guint valueStart = 0; guint8 headerType = 0; proto_item *ti; guint headerLen = tvb_reported_length (header_buff); guint valueLen = tvb_reported_length (value_buff); guint peek = 0; struct timeval timeValue; + guint count = 0; guint value = 0; - guint valSize = 0; + guint valueLength = 0; char valString[100]; - char *valMatch; - guint q_value = 0; + char *valMatch = NULL; + double q_value = 1.0; + + /* Initialise time values */ + timeValue.tv_sec=0; + timeValue.tv_usec = 0; headerType = tvb_get_guint8 (header_buff, 0); peek = tvb_get_guint8 (value_buff, 0); @@ -1899,393 +847,343 @@ add_header (proto_tree *tree, tvbuff_t *header_buff, tvbuff_t *value_buff) headerType = headerType & 0x7F; switch (headerType) { - case 0x00: /* Accept */ - if (peek & 0x80) - { - proto_tree_add_uint (tree, hf_wsp_header_accept, header_buff, offset, headerLen, (peek & 0x7F)); - } - else - { - proto_tree_add_string (tree, hf_wsp_header_accept_str,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - } - break; - - case 0x01: /* Accept-Charset */ - if (peek < 31) - { - /* Peek contains the number of octets to follow */ - valSize = tvb_get_guint8 (value_buff, 1); - /* decode Charset */ - if (valSize & 0x80) { - value = valSize & 0x7f; - valSize = 1; - } - else if (valSize < 31) { - switch (valSize) - { - case 1: - value = tvb_get_guint8 (value_buff, 2); - break; - case 2: - value = tvb_get_ntohs (value_buff, 2); - break; - case 3: - value = tvb_get_ntoh24 (value_buff, 2); - break; - case 4: - value = tvb_get_ntohl (value_buff, 2); - break; - default: - value = 0; - fprintf (stderr, "dissect_wsp: accept-charset size %d NYI\n", peek); - break; - } - valSize++; - } - else { - fprintf (stderr, "dissect_wsp: Accept-Charset value %d (0x%02X) NYI\n", peek, value); - } - valMatch = match_strval(value,vals_character_sets); - if (peek > valSize) { - q_value = tvb_get_guintvar (value_buff, 1+valSize, NULL); - if (q_value <= 100) { - q_value = (q_value - 1) * 10; - } - else { - q_value -= 100; - } - } - else { - q_value = 1000; - } - if (valMatch != NULL) { - snprintf(valString,100,"%s;Q=%5.3f",valMatch,q_value/1000.0); - } - else { - snprintf(valString,100,"Unknow %d;Q=%5.3f",value,q_value/1000.0); + case 0x00: /* Accept */ + if (peek & 0x80) + { + proto_tree_add_uint (tree, hf_wsp_header_accept, header_buff, offset, headerLen, (peek & 0x7F)); } - proto_tree_add_string (tree, hf_wsp_header_accept_charset_str, header_buff, offset, headerLen, valString); - } - else if (peek & 0x80) - { - proto_tree_add_uint (tree, hf_wsp_header_accept_charset, header_buff, offset, headerLen, (peek & 0x7F) ); - } - else - { - fprintf (stderr, "dissect_wsp: Accept-Charset value %d (0x%02X) NYI\n", peek, peek); - } - break; - - case 0x03: /* Accept-Language */ - if (peek < 31) - { - /* Peek contains the number of octets to follow */ - switch (peek) + else { - case 1: - proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, - headerLen, tvb_get_guint8 (value_buff, 1) ); - break; - case 2: - proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, - headerLen, tvb_get_ntohs (value_buff, 1) ); - break; - case 4: - proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, - headerLen, tvb_get_ntohl (value_buff, 1) ); - break; - default: - fprintf (stderr, "dissect_wsp: accept-language size %d NYI\n", peek); + proto_tree_add_string (tree, hf_wsp_header_accept_str,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); } - } - else if (peek & 0x80) - { - proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, headerLen, (peek & 0x7F) ); - } - else - { - proto_tree_add_string (tree, hf_wsp_header_accept_language_str, header_buff, offset,headerLen, - tvb_get_ptr (value_buff, 0, valueLen)); - } - break; + break; - case 0x04: /* Accept-Ranges */ - if ((peek == 128) || (peek == 129)) - { - proto_tree_add_uint (tree, hf_wsp_header_accept_ranges, header_buff, offset, headerLen, peek); - } - else - { - fprintf (stderr, "dissect_wsp: accept-ranges NYI\n"); - } - - break; + case 0x01: /* Accept-Charset */ + if (peek <= 31) /* Accept-charset-general-form */ + { + /* Get Value-Length */ + valueLength = get_value_length (value_buff, offset, + &valueStart); + offset = valueStart; - case 0x05: /* Age */ - switch (valueLen) - { - case 1: - proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_guint8 (value_buff, 0)); - break; - case 2: - proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_ntohs (value_buff, 0)); - break; - case 3: - proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_ntoh24 (value_buff, 0)); - break; - case 4: - proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_ntohl (value_buff, 0)); - break; - }; - break; + peek = tvb_get_guint8 (value_buff, offset); + if ((peek >= 0x80) || (peek <= 30)) /* Well-known-charset */ + { + if (peek == 0x80) /* Any */ + { + value = peek; + offset++; + } + else if (peek & 0x80) /* Short-Integer */ + { + value = peek & 0x7F; + offset++; + } + else if (peek <= 30) /* Long-Integer */ + { + offset++; + + /* TODO: Need to read peek octets */ + value = 0x00; + offset += peek; + } + valMatch = match_strval(value, vals_character_sets); + } + else /* Assume Token-text */ + { + fprintf (stderr, "dissect_wsp: Accept-Charset Token-text NYI\n"); + } - case 0x08: /* Cache-Control */ - if (peek & 0x80) - { - if (valueLen == 1) /* Well-known value */ - { - proto_tree_add_uint (tree, hf_wsp_header_cache_control, header_buff, offset, headerLen, peek); - } - else - { - if ((peek == 0x82) || (peek == 0x83) || (peek == 0x84)) /* Delta seconds value to follow */ + /* Any remaining data relates to Q-Value */ + if (offset < valueLen) { - value = tvb_get_guint8 (value_buff, 1); - if (value & 0x80) + count = 0; + q_value = tvb_get_guintvar (value_buff, offset, &count); + if (count == 1) /* Two decimal quality factors */ { - proto_tree_add_text (tree, - header_buff, 0, - headerLen, - "Cache-Control: %s %d (0x%02X)", - val_to_str (peek, - vals_cache_control, - "Unknown (0x%02x)"), - (value & 0x7F), - peek); + q_value -= 1; + q_value /= 100; + } + else if (count == 2) /* Three decimal quality factors */ + { + q_value -= 100; + q_value /= 1000; } else { - fprintf (stderr, "dissect_wsp: Cache-Control integer value Delta seconds NYI\n"); + fprintf (stderr, "dissect_wsp: Accept-Charset invalid Q-value %f\n", q_value); } } - else if ((peek == 0x80) || (peek == 0x87)) /* Fields to follow */ + + /* Build string including Q values if present */ + if (q_value == 1.0) /* Default */ { - fprintf (stderr, "dissect_wsp: Cache-Control field values NYI\n"); + if (valMatch == NULL) + { + snprintf (valString, 100, "Unknown (%02X)", peek); + } + else + { + snprintf (valString, 100, "%s", valMatch); + } } else { - fprintf (stderr, "dissect_wsp: Cache-Control cache extension NYI\n"); + snprintf (valString, 100, "Unknown %d; Q=%5.3f", value, + q_value/1000.0); + if (valMatch == NULL) + { + snprintf (valString, 100, "Unknown (%02X)", peek); + } + else + { + snprintf (valString, 100, "%s", valMatch); + } } + + /* Add string to tree */ + proto_tree_add_string (tree, hf_wsp_header_accept_charset_str, + header_buff, 0, headerLen, valString); } - } - else - { - fprintf (stderr, "dissect_wsp: Cache-Control cache extension NYI\n"); - } - break; - - case 0x0D: /* Content-Length */ - if (peek & 0x80) - { - proto_tree_add_uint (tree, hf_wsp_header_content_length, header_buff, offset, headerLen, (peek & 0x7F)); - } - else if (peek < 31) { - switch (peek) + else /* Constrained-charset */ { - case 1: - proto_tree_add_uint (tree, hf_wsp_header_content_length, header_buff, offset, headerLen, - tvb_get_guint8 (value_buff, 1) ); - break; - case 2: - proto_tree_add_uint (tree, hf_wsp_header_content_length, header_buff, offset, headerLen, - tvb_get_ntohs (value_buff, 1) ); - break; - case 3: - proto_tree_add_uint (tree, hf_wsp_header_content_length, header_buff, offset, headerLen, - (tvb_get_ntohs (value_buff, 1) << 8) + tvb_get_guint8 (value_buff, 3) ); - break; - case 4: - proto_tree_add_uint (tree, hf_wsp_header_content_length, header_buff, offset, headerLen, - tvb_get_ntohl (value_buff, 1) ); - break; - default: - fprintf (stderr, "dissect_wsp: accept-charset size %d NYI\n", peek); - } - } - else - { - fprintf (stderr, "dissect_wsp: Content-Length long-integer size NYI\n"); - } - break; - - case 0x12: /* Date */ - if (peek < 31) { - timeValue.tv_sec=0; - timeValue.tv_usec = 0; - switch (peek) { - case 1: - timeValue.tv_sec = tvb_get_guint8 (value_buff, 1); - break; - case 2: - timeValue.tv_sec = tvb_get_ntohs (value_buff, 1); - break; - case 3: - timeValue.tv_sec = tvb_get_ntoh24 (value_buff, 1); - break; - case 4: - timeValue.tv_sec = tvb_get_ntohl (value_buff, 1); - break; - default: - fprintf (stderr, "dissect_wsp: accept-charset size %d NYI\n", peek); - break; + if (peek == 0x80) /* Any-charset */ + { + proto_tree_add_string (tree, hf_wsp_header_accept_charset, + header_buff, offset, headerLen, + "*"); + } + else if (peek & 0x80) /* Short-Integer */ + { + proto_tree_add_uint (tree, hf_wsp_header_accept_charset, + header_buff, offset, headerLen, (peek & 0x7F) ); + } + else /* Assume *TEXT */ + { + proto_tree_add_string (tree, hf_wsp_header_accept_charset, + header_buff, offset, headerLen, + tvb_get_ptr (value_buff, 0, valueLen)); + } } - ti = proto_tree_add_time (tree, hf_wsp_header_date, header_buff, offset, headerLen, &timeValue); - } - else { - fprintf (stderr, "dissect_wsp: accept-charset size %d NYI\n", peek); - } - break; - - case 0x13: /* Etag */ - ti = proto_tree_add_string (tree, hf_wsp_header_etag,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - break; + break; - case 0x14: /* Expires */ - timeValue.tv_sec = 0; - timeValue.tv_usec = 0; - if (peek < 31) { - switch (peek) + case 0x03: /* Accept-Language */ + if (peek < 31) { - case 1: - timeValue.tv_sec = tvb_get_guint8 (value_buff, 1); - break; - case 2: - timeValue.tv_sec = tvb_get_ntohs (value_buff, 1); - break; - case 3: - timeValue.tv_sec = tvb_get_ntoh24 (value_buff, 1); + /* Peek contains the number of octets to follow */ + switch (peek) + { + case 1: + proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, + headerLen, tvb_get_guint8 (value_buff, 1) ); break; - case 4: - timeValue.tv_sec = tvb_get_ntohl (value_buff, 1); + case 2: + proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, + headerLen, tvb_get_ntohs (value_buff, 1) ); break; - default: - timeValue.tv_sec = 0; - fprintf (stderr, "dissect_wsp: Expires value length %d NYI\n", peek); + case 4: + proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, + headerLen, tvb_get_ntohl (value_buff, 1) ); break; + default: + fprintf (stderr, "dissect_wsp: accept-language size %d NYI\n", peek); + } } - ti = proto_tree_add_time (tree, hf_wsp_header_expires, header_buff, offset, headerLen, &timeValue); - } - else - { - fprintf (stderr, "dissect_wsp: Expires value 0x%02x NYI\n", peek); - } - break; + else if (peek & 0x80) + { + proto_tree_add_uint (tree, hf_wsp_header_accept_language, header_buff, offset, headerLen, (peek & 0x7F) ); + } + else + { + proto_tree_add_string (tree, hf_wsp_header_accept_language_str, header_buff, offset,headerLen, + tvb_get_ptr (value_buff, 0, valueLen)); + } + break; - case 0x17: /* If-Modified-Since */ - timeValue.tv_sec = 0; - timeValue.tv_usec = 0; - if (peek < 31) { - switch (peek) + case 0x04: /* Accept-Ranges */ + if ((peek == 128) || (peek == 129)) { - case 1: - timeValue.tv_sec = tvb_get_guint8 (value_buff, 1); - break; - case 2: - timeValue.tv_sec = tvb_get_ntohs (value_buff, 1); - break; - case 3: - timeValue.tv_sec = tvb_get_ntoh24 (value_buff, 1); - break; - case 4: - timeValue.tv_sec = tvb_get_ntohl (value_buff, 1); - break; - default: - timeValue.tv_sec = 0; - fprintf (stderr, "dissect_wsp: Expires value length %d NYI\n", peek); - break; + proto_tree_add_uint (tree, hf_wsp_header_accept_ranges, header_buff, offset, headerLen, peek); + } + else + { + fprintf (stderr, "dissect_wsp: accept-ranges NYI\n"); } - ti = proto_tree_add_time (tree, hf_wsp_header_if_modified_since, header_buff, offset, headerLen, &timeValue); - } - else - { - fprintf (stderr, "dissect_wsp: Expires value 0x%02x NYI\n", peek); - } - break; - case 0x1C: /* Location */ - ti = proto_tree_add_string (tree, hf_wsp_header_location,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - break; + break; - case 0x1D: /* Last-Modified */ - timeValue.tv_sec = 0; - timeValue.tv_usec = 0; - if (peek < 31) { - switch (peek) + case 0x05: /* Age */ + switch (valueLen) { case 1: - timeValue.tv_sec = tvb_get_guint8 (value_buff, 1); + proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_guint8 (value_buff, 0)); break; case 2: - timeValue.tv_sec = tvb_get_ntohs (value_buff, 1); + proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_ntohs (value_buff, 0)); break; case 3: - timeValue.tv_sec = tvb_get_ntoh24 (value_buff, 1); + proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_ntoh24 (value_buff, 0)); break; case 4: - timeValue.tv_sec = tvb_get_ntohl (value_buff, 1); - break; - default: - timeValue.tv_sec = 0; - fprintf (stderr, "dissect_wsp: Expires value length %d NYI\n", peek); + proto_tree_add_uint (tree, hf_wsp_header_age, header_buff, offset, headerLen, tvb_get_ntohl (value_buff, 0)); break; + }; + break; + + case 0x08: /* Cache-Control */ + if (peek & 0x80) + { + if (valueLen == 1) /* Well-known value */ + { + proto_tree_add_uint (tree, hf_wsp_header_cache_control, header_buff, offset, headerLen, peek); + } + else + { + if ((peek == 0x82) || (peek == 0x83) || (peek == 0x84)) /* Delta seconds value to follow */ + { + value = tvb_get_guint8 (value_buff, 1); + if (value & 0x80) + { + proto_tree_add_text (tree, header_buff, 0, + headerLen, "Cache-Control: %s %d (0x%02X)", + val_to_str (peek, vals_cache_control, + "Unknown (0x%02x)"), + (value & 0x7F), peek); + } + else + { + fprintf (stderr, "dissect_wsp: Cache-Control integer value Delta seconds NYI\n"); + } + } + else if ((peek == 0x80) || (peek == 0x87)) /* Fields to follow */ + { + fprintf (stderr, "dissect_wsp: Cache-Control field values NYI\n"); + } + else + { + fprintf (stderr, "dissect_wsp: Cache-Control cache extension NYI\n"); + } + } } - ti = proto_tree_add_time (tree, hf_wsp_header_last_modified, header_buff, offset, headerLen, &timeValue); - } - else - { - fprintf (stderr, "dissect_wsp: Expires value 0x%02x NYI\n", peek); - } - break; + else + { + fprintf (stderr, "dissect_wsp: Cache-Control cache extension NYI\n"); + } + break; - case 0x1F: /* Pragma */ - if (peek == 0x80) - { - proto_tree_add_text (tree, header_buff, 0, headerLen, "Pragma: No-cache"); - } - else - { - proto_tree_add_text (tree, header_buff, 0, headerLen, "Unsupported Header (0x%02X)", (tvb_get_guint8 (header_buff, 0) & 0x7F)); - } - break; + case 0x0D: /* Content-Length */ + if (peek < 31) + { + switch (peek) + { + case 1: + proto_tree_add_uint (tree, + hf_wsp_header_content_length, header_buff, offset, + headerLen, tvb_get_guint8 (value_buff, 1) ); + break; + case 2: + proto_tree_add_uint (tree, + hf_wsp_header_content_length, header_buff, offset, + headerLen, tvb_get_ntohs (value_buff, 1) ); + break; + case 3: + proto_tree_add_uint (tree, + hf_wsp_header_content_length, header_buff, offset, + headerLen, (tvb_get_ntohs (value_buff, 1) << 8) + + tvb_get_guint8 (value_buff, 3) ); + break; + case 4: + proto_tree_add_uint (tree, + hf_wsp_header_content_length, header_buff, offset, + headerLen, tvb_get_ntohl (value_buff, 1) ); + break; + default: + fprintf (stderr, "dissect_wsp: accept-charset size %d NYI\n", peek); + } + } + else if (peek & 0x80) + { + proto_tree_add_uint (tree, hf_wsp_header_content_length, header_buff, offset, headerLen, (peek & 0x7F)); + } + else + { + fprintf (stderr, "dissect_wsp: Content-Length long-integer size NYI\n"); + } + break; - case 0x26: /* Server */ - ti = proto_tree_add_string (tree, hf_wsp_header_server,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - break; + case 0x12: /* Date */ + add_date_value (value_buff, 0, tree, + hf_wsp_header_date, header_buff, offset, + headerLen, &timeValue, "Date"); + break; - case 0x27: /* Transfer encoding */ - if (peek & 0x80) - { - proto_tree_add_uint (tree, hf_wsp_header_transfer_encoding, header_buff, offset, headerLen, peek); - } - else - { - proto_tree_add_string (tree, hf_wsp_header_transfer_encoding_str, header_buff, offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - } - break; + case 0x13: /* Etag */ + ti = proto_tree_add_string (tree, hf_wsp_header_etag,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); + break; + case 0x14: /* Expires */ + add_date_value (value_buff, 0, tree, + hf_wsp_header_expires, header_buff, offset, + headerLen, &timeValue, "Expires"); + break; - case 0x29: /* User-Agent */ - ti = proto_tree_add_string (tree, hf_wsp_header_user_agent,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - break; + case 0x17: /* If-Modified-Since */ + add_date_value (value_buff, 0, tree, + hf_wsp_header_if_modified_since, header_buff, offset, + headerLen, &timeValue, "If-Modified-Since"); + break; + + case 0x1C: /* Location */ + ti = proto_tree_add_string (tree, hf_wsp_header_location,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); + break; - case 0x2B: /* Via */ - ti = proto_tree_add_string (tree, hf_wsp_header_via,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); - break; + case 0x1D: /* Last-Modified */ + add_date_value (value_buff, 0, tree, + hf_wsp_header_last_modified, header_buff, offset, + headerLen, &timeValue, "Last-Modified"); + break; + + case 0x1F: /* Pragma */ + if (peek == 0x80) + { + proto_tree_add_text (tree, header_buff, 0, headerLen, "Pragma: No-cache"); + } + else + { + proto_tree_add_text (tree, header_buff, 0, headerLen, "Unsupported Header (0x%02X)", (tvb_get_guint8 (header_buff, 0) & 0x7F)); + } + break; + + case 0x26: /* Server */ + ti = proto_tree_add_string (tree, hf_wsp_header_server,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); + break; + + case 0x27: /* Transfer encoding */ + if (peek & 0x80) + { + proto_tree_add_uint (tree, hf_wsp_header_transfer_encoding, + header_buff, offset, headerLen, peek); + } + else + { + proto_tree_add_string (tree, + hf_wsp_header_transfer_encoding_str, header_buff, offset, + headerLen,tvb_get_ptr (value_buff, 0, valueLen)); + } + break; + case 0x29: /* User-Agent */ + ti = proto_tree_add_string (tree, hf_wsp_header_user_agent,header_buff,offset,headerLen,tvb_get_ptr (value_buff, 0, valueLen)); + break; - default: - ti = proto_tree_add_text (tree, header_buff, 0, headerLen, "Unsupported Header (0x%02X)", (tvb_get_guint8 (header_buff, 0) & 0x7F)); - break; + case 0x2B: /* Via */ + ti = proto_tree_add_string (tree, hf_wsp_header_via, header_buff, + offset, headerLen, tvb_get_ptr (value_buff, 0, valueLen)); + break; + + default: + ti = proto_tree_add_text (tree, header_buff, 0, headerLen, "Unsupported Header (0x%02X)", (tvb_get_guint8 (header_buff, 0) & 0x7F)); + break; } } else @@ -2294,27 +1192,21 @@ add_header (proto_tree *tree, tvbuff_t *header_buff, tvbuff_t *value_buff) * by a 4-byte date value */ if (strncasecmp ("x-wap.tod", tvb_get_ptr (header_buff, 0, headerLen), 9) == 0) { - timeValue.tv_sec = 0; - timeValue.tv_usec = 0; - switch( peek) { - case 1: - timeValue.tv_sec = tvb_get_guint8 (value_buff, 1); - break; - case 2: - timeValue.tv_sec = tvb_get_ntohs (value_buff, 1); - break; - case 3: - timeValue.tv_sec = (tvb_get_ntohs (value_buff, 1) << 8) + tvb_get_guint8 (value_buff, 3); - break; - case 4: - timeValue.tv_sec = tvb_get_ntohl (value_buff, 1); - break; - default: - timeValue.tv_sec = 0; - fprintf (stderr, "dissect_wsp: x-wap-top unkown\n"); - break; + if (tvb_reported_length (value_buff) == 4) /* Probably a date value */ + { + timeValue.tv_sec = tvb_get_ntohl (value_buff, 0); + ti = proto_tree_add_time (tree, hf_wsp_header_x_wap_tod, header_buff, offset, headerLen, &timeValue); + } + else if (tvb_reported_length (value_buff) == 5) /* Probably a date */ + { + add_date_value (value_buff, 0, tree, + hf_wsp_header_x_wap_tod, header_buff, offset, + headerLen, &timeValue, "X-Wap.Tod"); + } + else + { + ti = proto_tree_add_text (tree, header_buff, 0, headerLen, "%s: %s", tvb_get_ptr (header_buff, 0, headerLen), tvb_get_ptr (value_buff, 0, valueLen)); } - ti = proto_tree_add_time (tree, hf_wsp_header_x_wap_tod, header_buff, offset, headerLen, &timeValue); } else { @@ -2385,6 +1277,70 @@ add_content_type (proto_tree *tree, tvbuff_t *tvb, guint offset, guint *contentT return (offset+totalSizeOfField); } +/* Utility function to extract date values from the packet */ +static gint +get_date_value (tvbuff_t *buffer, guint offset, struct timeval *timeValue) +{ + guint ShortLength = 0; + + /* Initialise time values */ + timeValue->tv_sec=0; + timeValue->tv_usec = 0; + + /* Date values are encoded as: Short-length Multi-octet-integer + * Where Short-length = 0-30 + */ + ShortLength = tvb_get_guint8 (buffer, offset++); + if (ShortLength > 30) + { + fprintf (stderr, "dissect_wsp: Invalid Date-value (Short-length=%d)\n", + ShortLength); + return (-1); + } + + switch (ShortLength) + { + case 1: + timeValue->tv_sec = tvb_get_guint8 (buffer, offset); + break; + case 2: + timeValue->tv_sec = tvb_get_ntohs (buffer, offset); + break; + case 3: + timeValue->tv_sec = tvb_get_ntoh24 (buffer, offset); + break; + case 4: + timeValue->tv_sec = tvb_get_ntohl (buffer, offset); + break; + default: + fprintf (stderr, "dissect_wsp: Date-value Short-length of %d NYI\n", + ShortLength); + return (-1); + break; + } + + return (0); +} + +/* Utility function to add a date value to the protocol tree */ +static void +add_date_value (tvbuff_t *buffer, guint offset, proto_tree *tree, + int header, tvbuff_t *headerBuffer, guint headerOffset, + guint headerLen, struct timeval *timeValue, const char *fieldName) +{ + /* Attempt to get the date value from the buffer */ + if (get_date_value (buffer, offset, timeValue) == 0) + { + /* If successful, add it to the protocol tree */ + proto_tree_add_time (tree, header, headerBuffer, headerOffset, + headerLen, timeValue); + } + else + { + fprintf (stderr, "dissect_wsp: Invalid %s value\n", fieldName); + } +} + static guint add_parameter (proto_tree *tree, tvbuff_t *tvb, guint offset) { @@ -2440,6 +1396,7 @@ add_post_data (proto_tree *tree, tvbuff_t *tvb, guint contentType) guint8 peek = 0; proto_item *ti; + /* VERIFY ti = proto_tree_add_item (tree, hf_wsp_post_data,tvb,offset,END_OF_FRAME,bo_little_endian); */ ti = proto_tree_add_item (tree, hf_wsp_post_data,tvb,offset,tvb_reported_length(tvb),bo_little_endian); if (contentType == 0x12) /* URL Encoded data */ @@ -2530,7 +1487,7 @@ proto_register_wsp(void) }, { &hf_wsp_header_pdu_type, { "PDU Type", - "wsp.pdu-type", + "wsp.pdu_type", FT_UINT8, BASE_HEX, VALS( vals_pdu_type ), 0x00, "PDU Type" } @@ -2558,7 +1515,7 @@ proto_register_wsp(void) }, { &hf_wsp_header_length, { "Headers Length", - "wsp.headers-length", + "wsp.headers_length", FT_UINT32, BASE_DEC, NULL, 0x00, "Headers Length" } @@ -2586,7 +1543,7 @@ proto_register_wsp(void) }, { &hf_wsp_header_uri_len, { "URI Length", - "wsp.uri-length", + "wsp.uri_length", FT_UINT32, BASE_DEC, NULL, 0x00, "URI Length" } @@ -2600,7 +1557,7 @@ proto_register_wsp(void) }, { &hf_wsp_server_session_id, { "Server Session ID", - "wsp.server.session-id", + "wsp.server.session_id", FT_UINT32, BASE_DEC, NULL, 0x00, "Server Session ID" } @@ -2614,14 +1571,14 @@ proto_register_wsp(void) }, { &hf_wsp_content_type, { "Content Type", - "wsp.content-type.type", + "wsp.content_type.type", FT_UINT8, BASE_HEX, VALS ( vals_content_types ), 0x00, "Content Type" } }, { &hf_wsp_parameter_well_known_charset, { "Charset", - "wsp.content-type.parameter.charset", + "wsp.content_type.parameter.charset", FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00, "Charset" } @@ -2650,35 +1607,35 @@ proto_register_wsp(void) }, { &hf_wsp_header_accept_charset, { "Accept-Charset", - "wsp.header.accept-charset", + "wsp.header.accept_charset", FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00, "Accept-Charset" } }, { &hf_wsp_header_accept_charset_str, { "Accept-Charset", - "wsp.header.accept-charset.string", + "wsp.header.accept_charset.string", FT_STRING, BASE_NONE, NULL, 0x00, "Accept-Charset" } }, { &hf_wsp_header_accept_language, { "Accept-Language", - "wsp.header.accept-language", + "wsp.header.accept_language", FT_UINT8, BASE_HEX, VALS ( vals_languages ), 0x00, "Accept-Language" } }, { &hf_wsp_header_accept_language_str, { "Accept-Language", - "wsp.header.accept-language.string", + "wsp.header.accept_language.string", FT_STRING, BASE_NONE, NULL, 0x00, "Accept-Language" } }, { &hf_wsp_header_accept_ranges, { "Accept-Ranges", - "wsp.header.accept-ranges", + "wsp.header.accept_ranges", FT_UINT8, BASE_HEX, VALS ( vals_accept_ranges ), 0x00, "Accept-Ranges" } @@ -2692,14 +1649,14 @@ proto_register_wsp(void) }, { &hf_wsp_header_cache_control, { "Cache-Control", - "wsp.header.cache-control", + "wsp.header.cache_control", FT_UINT8, BASE_HEX, VALS ( vals_cache_control ), 0x00, "Cache-Control" } }, { &hf_wsp_header_content_length, { "Content-Length", - "wsp.header.content-length", + "wsp.header.content_length", FT_UINT32, BASE_DEC, NULL, 0x00, "Content-Length" } @@ -2728,7 +1685,7 @@ proto_register_wsp(void) }, { &hf_wsp_header_last_modified, { "Last-Modified", - "wsp.header.last-modified", + "wsp.header.last_modified", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "Last-Modified" } @@ -2742,7 +1699,7 @@ proto_register_wsp(void) }, { &hf_wsp_header_if_modified_since, { "If-Modified-Since", - "wsp.header.if-modified-since", + "wsp.header.if_modified_since", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "If-Modified-Since" } @@ -2755,24 +1712,46 @@ proto_register_wsp(void) "Server" } }, + { &hf_wsp_header_transfer_encoding, + { "Transfer Encoding", + "wsp.header.transfer_enc", + /*FT_NONE, BASE_DEC, NULL, 0x00,*/ + FT_UINT8, BASE_HEX, VALS ( vals_transfer_encoding ), 0x00, + "Transfer Encoding" + } + }, + { &hf_wsp_header_transfer_encoding_str, + { "Transfer Encoding", + "wsp.header.transfer_enc_str", + FT_STRING, BASE_NONE, NULL, 0x00, + "Transfer Encoding" + } + }, { &hf_wsp_header_user_agent, { "User-Agent", - "wsp.header.user-agent", + "wsp.header.user_agent", /*FT_NONE, BASE_DEC, NULL, 0x00,*/ FT_STRING, BASE_NONE, NULL, 0x00, "User-Agent" } }, + { &hf_wsp_header_via, + { "Via", + "wsp.header.via", + FT_STRING, BASE_NONE, NULL, 0x00, + "Via" + } + }, { &hf_wsp_header_application_header, { "Application Header", - "wsp.header.application-header", + "wsp.header.application_header", FT_STRING, BASE_NONE, NULL, 0x00, "Application Header" } }, { &hf_wsp_header_application_value, { "Application Header Value", - "wsp.header.application-header.value", + "wsp.header.application_header.value", FT_STRING, BASE_NONE, NULL, 0x00, "Application Header Value" } @@ -2784,28 +1763,6 @@ proto_register_wsp(void) "X-WAP.TOD" } }, - { &hf_wsp_header_transfer_encoding, - { "Transfer Encoding", - "wsp.header.transfer_enc", - /*FT_NONE, BASE_DEC, NULL, 0x00,*/ - FT_UINT8, BASE_HEX, VALS ( vals_transfer_encoding ), 0x00, - "Transfer Encoding" - } - }, - { &hf_wsp_header_transfer_encoding_str, - { "Transfer Encoding", - "wsp.header.transfer_enc_str", - FT_STRING, BASE_NONE, NULL, 0x00, - "Transfer Encoding" - } - }, - { &hf_wsp_header_via, - { "Via", - "wsp.header.via", - FT_STRING, BASE_NONE, NULL, 0x00, - "Via" - } - }, { &hf_wsp_post_data, { "Post Data", "wsp.post.data", @@ -2813,440 +1770,6 @@ proto_register_wsp(void) "Post Data" } }, - { &hf_wtls_record, - { "Record", - "wsp.wtls.record", - FT_UINT8, BASE_DEC, VALS ( wtls_vals_record_type ), 0x0f, - "Record" - } - }, - { &hf_wtls_record_type, - { "Record Type", - "wsp.wtls.rec_type", - FT_UINT8, BASE_DEC, VALS ( wtls_vals_record_type ), 0x0f, - "Record Type" - } - }, - { &hf_wtls_record_length, - { "Record Length", - "wsp.wtls.rec_length", - FT_UINT16, BASE_DEC, NULL, 0x00, - "Record Length" - } - }, - { &hf_wtls_record_sequence, - { "Record Sequence", - "wsp.wtls.rec_seq", - FT_UINT16, BASE_DEC, NULL, 0x00, - "Record Sequence" - } - }, - { &hf_wtls_record_ciphered, - { "Record Ciphered", - "wsp.wtls.rec_cipher", - FT_NONE, BASE_DEC, NULL, 0x00, - "Record Ciphered" - } - }, - { &hf_wtls_hands, - { "Handshake", - "wsp.wtls.handshake", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_handshake_type ), 0x00, - "Handshake" - } - }, - { &hf_wtls_hands_type, - { "Type", - "wsp.wtls.handshake.type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_handshake_type ), 0x00, - "Type" - } - }, - { &hf_wtls_hands_length, - { "Length", - "wsp.wtls.handshake.length", - FT_UINT16, BASE_DEC, NULL, 0x00, - "Length" - } - }, - { &hf_wtls_hands_cli_hello, - { "Client Hello", - "wsp.wtls.handshake.client_hello", - FT_NONE, BASE_NONE,NULL, 0x00, - "Client Hello" - } - }, - { &hf_wtls_hands_cli_hello_version, - { "Version", - "wsp.wtls.handshake.client_hello.version", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Version" - } - }, - { &hf_wtls_hands_cli_hello_gmt, - { "Time GMT", - "wsp.wtls.handshake.client_hello.gmt", - FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00, - "Time GMT" - } - }, - { &hf_wtls_hands_cli_hello_random, - { "Random", - "wsp.wtls.handshake.client_hello.random", - FT_NONE, BASE_DEC, NULL, 0x00, - "Random" - } - }, - { &hf_wtls_hands_cli_hello_session, - { "Session ID", - "wsp.wtls.handshake.client_hello.sessionid", - FT_NONE, BASE_DEC, NULL, 0x00, - "Session ID" - } - }, - { &hf_wtls_hands_cli_hello_cli_key_id, - { "Client Keys", - "wsp.wtls.handshake.client_hello.client_keys_id", - FT_NONE, BASE_DEC, NULL, 0x00, - "Client Keys" - } - }, - { &hf_wtls_hands_cli_hello_trust_key_id, - { "Trusted Keys", - "wsp.wtls.handshake.client_hello.trusted_keys_id", - FT_NONE, BASE_DEC, NULL, 0x00, - "Trusted Keys" - } - }, - { &hf_wtls_hands_cli_hello_key_exchange, - { "Key Exchange", - "wsp.wtls.handshake.client_hello.key.key_exchange", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_key_exchange_suite ), 0x00, - "Key Exchange" - } - }, - { &hf_wtls_hands_cli_hello_key_exchange_suite, - { "Suite", - "wsp.wtls.handshake.client_hello.key.key_exchange.suite", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_key_exchange_suite ), 0x00, - "Suite" - } - }, - { &hf_wtls_hands_cli_hello_key_parameter_index, - { "Parameter Index", - "wsp.wtls.handshake.client_hello.parameter_index", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Parameter Index" - } - }, - { &hf_wtls_hands_cli_hello_key_parameter_set, - { "Parameter Set", - "wsp.wtls.handshake.client_hello.parameter", - FT_STRING, BASE_NONE, NULL, 0x00, - "Parameter Set" - } - }, - { &hf_wtls_hands_cli_hello_key_identifier_type, - { "Identifier Type", - "wsp.wtls.handshake.client_hello.ident_type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_identifier_type ), 0x00, - "Identifier Type" - } - }, - { &hf_wtls_hands_cli_hello_cipher_suite, - { "Cipher Suites", - "wsp.wtls.handshake.client_hello.ciphers", - FT_NONE, BASE_DEC, NULL, 0x00, - "Cipher Suite" - } - }, - { &hf_wtls_hands_cli_hello_cipher_suite_item, - { "Cipher", - "wsp.wtls.handshake.client_hello.cipher", - FT_NONE, BASE_DEC, NULL, 0x00, - "Cipher" - } - }, - { &hf_wtls_hands_cli_hello_cipher_bulk, - { "Cipher Bulk", - "wsp.wtls.handshake.client_hello.cipher.bulk", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_bulk ), 0x00, - "Cipher Bulk" - } - }, - { &hf_wtls_hands_cli_hello_cipher_mac, - { "Cipher MAC", - "wsp.wtls.handshake.client_hello.cipher.mac", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_mac ), 0x00, - "Cipher MAC" - } - }, - { &hf_wtls_hands_cli_hello_compression_methods, - { "Compression Methods", - "wsp.wtls.handshake.client_hello.comp_methods", - FT_NONE, BASE_DEC, NULL, 0x00, - "Compression Methods" - } - }, - { &hf_wtls_hands_cli_hello_compression, - { "Compression", - "wsp.wtls.handshake.client_hello.compression", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_compression ), 0x00, - "Compression" - } - }, - { &hf_wtls_hands_cli_hello_sequence_mode, - { "Sequence Mode", - "wsp.wtls.handshake.client_hello.sequence_mode", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_sequence_mode ), 0x00, - "Sequence Mode" - } - }, - { &hf_wtls_hands_cli_hello_key_refresh, - { "Refresh", - "wsp.wtls.handshake.client_hello.refresh", - FT_UINT8, BASE_DEC,NULL, 0x00, - "Refresh" - } - }, - { &hf_wtls_hands_serv_hello, - { "Server Hello", - "wsp.wtls.handshake.server_hello", - FT_NONE, BASE_NONE,NULL, 0x00, - "Server Hello" - } - }, - { &hf_wtls_hands_serv_hello_version, - { "Version", - "wsp.wtls.handshake.server_hello.version", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Version" - } - }, - { &hf_wtls_hands_serv_hello_gmt, - { "Time GMT", - "wsp.wtls.handshake.server_hello.gmt", - FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00, - "Time GMT" - } - }, - { &hf_wtls_hands_serv_hello_random, - { "Random", - "wsp.wtls.handshake.server_hello.random", - FT_NONE, BASE_DEC, NULL, 0x00, - "Random" - } - }, - { &hf_wtls_hands_serv_hello_session, - { "Session ID", - "wsp.wtls.handshake.server_hello.sessionid", - FT_NONE, BASE_DEC, NULL, 0x00, - "Session ID" - } - }, - { &hf_wtls_hands_serv_hello_cli_key_id, - { "Client Key ID", - "wsp.wtls.handshake.server_hello.key", - FT_UINT8, BASE_HEX, NULL, 0x00, - "Client Key ID" - } - }, - { &hf_wtls_hands_serv_hello_cipher_suite_item, - { "Cipher", - "wsp.wtls.handshake.server_hello.cipher", - FT_NONE, BASE_DEC, NULL, 0x00, - "Cipher" - } - }, - { &hf_wtls_hands_serv_hello_cipher_bulk, - { "Cipher Bulk", - "wsp.wtls.handshake.server_hello.cipher.bulk", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_bulk ), 0x00, - "Cipher Bulk" - } - }, - { &hf_wtls_hands_serv_hello_cipher_mac, - { "Cipher MAC", - "wsp.wtls.handshake.server_hello.cipher.mac", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_cipher_mac ), 0x00, - "Cipher MAC" - } - }, - { &hf_wtls_hands_serv_hello_compression, - { "Compression", - "wsp.wtls.handshake.server_hello.compression", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_compression ), 0x00, - "Compression" - } - }, - { &hf_wtls_hands_serv_hello_sequence_mode, - { "Sequence Mode", - "wsp.wtls.handshake.server_hello.sequence_mode", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_sequence_mode ), 0x00, - "Sequence Mode" - } - }, - { &hf_wtls_hands_serv_hello_key_refresh, - { "Refresh", - "wsp.wtls.handshake.server_hello.refresh", - FT_UINT8, BASE_DEC,NULL, 0x00, - "Refresh" - } - }, - { &hf_wtls_hands_certificates, - { "Certificates", - "wsp.wtls.handshake.certificates", - FT_NONE, BASE_DEC, NULL, 0x00, - "Certificates" - } - }, - { &hf_wtls_hands_certificate, - { "Certificate", - "wsp.wtls.handshake.certificate", - FT_NONE, BASE_DEC, NULL, 0x00, - "Certificate" - } - }, - { &hf_wtls_hands_certificate_type, - { "Type", - "wsp.wtls.handshake.certificate.type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_certificate_type ), 0x00, - "Type" - } - }, - { &hf_wtls_hands_certificate_wtls_version, - { "Version", - "wsp.wtls.handshake.certificate.version", - FT_UINT8, BASE_HEX, NULL, 0x00, - "Version" - } - }, - { &hf_wtls_hands_certificate_wtls_signature_type, - { "Signature Type", - "wsp.wtls.handshake.certificate.signature.type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_certificate_signature ), 0x00, - "Signature Type" - } - }, - { &hf_wtls_hands_certificate_wtls_signature, - { "Signature Size", - "wsp.wtls.handshake.certificate.signature.signature", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Signature Size" - } - }, - { &hf_wtls_hands_certificate_wtls_issuer_type, - { "Issuer", - "wsp.wtls.handshake.certificate.issuer.type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_identifier_type ), 0x00, - "Issuer" - } - }, - { &hf_wtls_hands_certificate_wtls_issuer_charset, - { "Charset", - "wsp.wtls.handshake.certificate.issuer.charset", - FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00, - "Charset" - } - }, - { &hf_wtls_hands_certificate_wtls_issuer_name, - { "Name", - "wsp.wtls.handshake.certificate.issuer.name", - FT_STRING, BASE_NONE, NULL, 0x00, - "Name" - } - }, - { &hf_wtls_hands_certificate_wtls_valid_not_before, - { "Valid not before", - "wsp.wtls.handshake.certificate.before", - FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00, - "Valid not before" - } - }, - { &hf_wtls_hands_certificate_wtls_valid_not_after, - { "Valid not after", - "wsp.wtls.handshake.certificate.after", - FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x00, - "Valid not after" - } - }, - { &hf_wtls_hands_certificate_wtls_subject_type, - { "Subject", - "wsp.wtls.handshake.certificate.subject.type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_identifier_type ), 0x00, - "Subject" - } - }, - { &hf_wtls_hands_certificate_wtls_subject_charset, - { "Charset", - "wsp.wtls.handshake.certificate.subject.charset", - FT_UINT16, BASE_HEX, VALS ( vals_character_sets ), 0x00, - "Charset" - } - }, - { &hf_wtls_hands_certificate_wtls_subject_name, - { "Name", - "wsp.wtls.handshake.certificate.subject.name", - FT_STRING, BASE_NONE, NULL, 0x00, - "Name" - } - }, - { &hf_wtls_hands_certificate_wtls_public_key_type, - { "Public Key Type", - "wsp.wtls.handshake.certificate.public.type", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_public_key_type ), 0x00, - "Public Key Type" - } - }, - { &hf_wtls_hands_certificate_wtls_key_parameter_index, - { "Parameter Index", - "wsp.wtls.handshake.certificate.parameter_index", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Parameter Index" - } - }, - { &hf_wtls_hands_certificate_wtls_key_parameter_set, - { "Parameter Set", - "wsp.wtls.handshake.certificate.parameter", - FT_STRING, BASE_NONE, NULL, 0x00, - "Parameter Set" - } - }, - { &hf_wtls_hands_certificate_wtls_rsa_exponent, - { "RSA Exponent", - "wsp.wtls.handshake.certificate.rsa.exponent", - FT_UINT32, BASE_DEC, NULL, 0x00, - "RSA Exponent" - } - }, - { &hf_wtls_hands_certificate_wtls_rsa_modules, - { "RSA Modulus Size", - "wsp.wtls.handshake.certificate.rsa.modulus", - FT_UINT32, BASE_DEC, NULL, 0x00, - "RSA Modulus" - } - }, - { &hf_wtls_alert, - { "Alert", - "wsp.wtls.alert", - FT_NONE, BASE_HEX, NULL, 0x00, - "Alert" - } - }, - { &hf_wtls_alert_level, - { "Level", - "wsp.wtls.alert.level", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_alert_level ), 0x00, - "Level" - } - }, - { &hf_wtls_alert_description, - { "Description", - "wsp.wtls.alert.description", - FT_UINT8, BASE_HEX, VALS ( wtls_vals_alert_description ), 0x00, - "Description" - } - }, }; /* Setup protocol subtree array */ @@ -3256,11 +1779,6 @@ proto_register_wsp(void) &ett_headers, &ett_capabilities, &ett_content_type, - &ett_wtls_rec, - &ett_wtls_msg_type, - &ett_wtls_msg_type_item, - &ett_wtls_msg_type_item_sub, - &ett_wtls_msg_type_item_sub_sub, }; /* Register the protocol name and description */ @@ -3272,28 +1790,23 @@ proto_register_wsp(void) */ ); - proto_wtls = proto_register_protocol( - "Wireless Transport Layer Security", /* protocol name for use by ethereal */ - "WTLS", /* short version of name */ - "wap-wtls" /* Abbreviated protocol name, should Match IANA - < URL:http://www.isi.edu/in-notes/iana/assignments/port-numbers/ > - */ - ); - /* Required function calls to register the header fields and subtrees used */ proto_register_field_array(proto_wsp, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); register_dissector("wsp", dissect_wsp, proto_wsp); - register_dissector("wtls", dissect_wtls, proto_wtls); }; void proto_reg_handoff_wsp(void) { + /* + * Get a handle for the WMLC dissector + */ + wmlc_handle = find_dissector("wmlc"); /* Coming soon :) */ + /* Only connection-less WSP has no previous handler */ dissector_add("udp.port", UDP_PORT_WSP, dissect_wsp, proto_wsp); - /* dissector_add("udp.port", UDP_PORT_WTP_WSP, dissect_wsp, proto_wsp); */ - dissector_add("udp.port", UDP_PORT_WTLS_WSP, dissect_wtls, proto_wtls); - /* dissector_add("udp.port", UDP_PORT_WTLS_WTP_WSP, dissect_wsp, proto_wsp); */ + + /* This dissector is also called from the WTP and WTLS dissectors */ } |