Ethereal-dev: [Ethereal-dev] Updates for WSP connection-oriented
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: "Alexandre P. Ferreira" <alexandref@xxxxxxxxxxxx>
Date: Tue, 12 Jun 2001 16:26:25 -0300
Hi, Please check in these updates for WSP (WAP) decoding, Many corrections and updates for connection-oriented WSP. Thanks, -- Alexandre Peixoto Ferreira Coordenador de Planejamento TCO IP +55 61 3137504
*** ethereal-0.8.18/packet-wsp.c Mon Apr 23 13:57:59 2001 --- ethereal-0.8.18.new/packet-wsp.c Tue Jun 12 16:15:09 2001 *************** *** 66,72 **** static int hf_wsp_version_major = HF_EMPTY; static int hf_wsp_version_minor = HF_EMPTY; static int hf_wsp_capability_length = HF_EMPTY; ! static int hf_wsp_capabilities_section = HF_EMPTY; static int hf_wsp_header_uri_len = HF_EMPTY; static int hf_wsp_header_uri = HF_EMPTY; static int hf_wsp_server_session_id = HF_EMPTY; --- 66,80 ---- static int hf_wsp_version_major = HF_EMPTY; static int hf_wsp_version_minor = HF_EMPTY; static int hf_wsp_capability_length = HF_EMPTY; ! static int hf_wsp_capabilities_section = HF_EMPTY; ! static int hf_wsp_capabilities_client_SDU = HF_EMPTY; ! static int hf_wsp_capabilities_server_SDU = HF_EMPTY; ! static int hf_wsp_capabilities_protocol_opt = HF_EMPTY; ! static int hf_wsp_capabilities_method_MOR = HF_EMPTY; ! static int hf_wsp_capabilities_push_MOR = HF_EMPTY; ! static int hf_wsp_capabilities_extended_methods = HF_EMPTY; ! static int hf_wsp_capabilities_header_code_pages = HF_EMPTY; ! static int hf_wsp_capabilities_aliases = HF_EMPTY; static int hf_wsp_header_uri_len = HF_EMPTY; static int hf_wsp_header_uri = HF_EMPTY; static int hf_wsp_server_session_id = HF_EMPTY; *************** *** 79,84 **** --- 87,93 ---- static int hf_wsp_reply_data = HF_EMPTY; static int hf_wsp_post_data = HF_EMPTY; + static int hf_wsp_header_shift_code = 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; *************** *** 419,424 **** --- 428,436 ---- 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 gint get_long_integer (tvbuff_t *, guint *, guint , guint *); + static void add_capabilities (proto_tree *tree, tvbuff_t *tvb); + static guint get_uintvar (tvbuff_t *, guint, guint); /* Code to actually dissect the packets */ static void *************** *** 446,452 **** proto_item *ti; proto_tree *wsp_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 --- 458,463 ---- *************** *** 539,546 **** 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; } --- 550,557 ---- ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); if (capabilityLength > 0) { ! tmp_tvb = tvb_new_subset (tvb, offset, capabilityLength, capabilityLength); ! add_capabilities (wsp_tree, tmp_tvb); offset += capabilityLength; } *************** *** 571,578 **** 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; } --- 582,589 ---- ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); if (capabilityLength > 0) { ! tmp_tvb = tvb_new_subset (tvb, offset, capabilityLength, capabilityLength); ! add_capabilities (wsp_tree, tmp_tvb); offset += capabilityLength; } *************** *** 706,711 **** --- 717,723 ---- guint count = 0; guint valueStart = 0; guint valueEnd = 0; + guint pageCode = 1; #ifdef DEBUG fprintf (stderr, "dissect_wsp: Offset is %d, size is %d\n", offset, headersLen); *************** *** 734,746 **** if (peek < 32) /* Short-cut shift delimeter */ { ! fprintf (stderr, "dissect_wsp: header: short-cut shift %d (0x%02X)\n", peek, peek); ! offset++; } else if (peek == 0x7F) /* Shift delimeter */ { ! fprintf (stderr, "dissect_wsp: header: shift delimeter %d (0x%02X)\n", peek, peek); ! offset++; } else if (peek < 127) { --- 746,762 ---- if (peek < 32) /* Short-cut shift delimeter */ { ! pageCode = peek; ! proto_tree_add_uint (wsp_headers, hf_wsp_header_shift_code, tvb , offset, 1, peek); ! offset+=1; ! continue; } else if (peek == 0x7F) /* Shift delimeter */ { ! pageCode = tvb_get_guint8(tvb,offset+1); ! proto_tree_add_uint (wsp_headers, hf_wsp_header_shift_code, tvb , offset, 2, pageCode); ! offset+=2; ! continue; } else if (peek < 127) { *************** *** 800,809 **** fprintf (stderr, "dissect_wsp: Creating value buffer from offset %d, size=%d\n", headerStart, (offset-headerStart)); #endif ! header_buff = tvb_new_subset (tvb, headerStart, (offset-headerStart), (offset-headerStart)); ! value_buff = tvb_new_subset (tvb, valueStart, (valueEnd-valueStart), (valueEnd-valueStart)); - add_header (wsp_headers, header_buff, value_buff); } } --- 816,833 ---- fprintf (stderr, "dissect_wsp: Creating value buffer from offset %d, size=%d\n", headerStart, (offset-headerStart)); #endif ! if (pageCode == 1) ! { ! header_buff = tvb_new_subset (tvb, headerStart, (offset-headerStart), (offset-headerStart)); ! value_buff = tvb_new_subset (tvb, valueStart, (valueEnd-valueStart), (valueEnd-valueStart)); ! add_header (wsp_headers, header_buff, value_buff); ! } ! else ! { ! proto_tree_add_text (wsp_headers, tvb , headerStart, valueEnd-headerStart, ! "Unsupported Header (0x%02X)", (tvb_get_guint8 (tvb, headerStart) & 0x7F)); ! } } } *************** *** 818,826 **** --- 842,852 ---- guint valueLen = tvb_reported_length (value_buff); guint peek = 0; struct timeval timeValue; + guint offsetNew = 0; guint value = 0; guint valueLength = 0; char valString[100]; + char valNum1[100]; char *valMatch = NULL; double q_value = 1.0; *************** *** 847,860 **** 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 */ --- 873,956 ---- switch (headerType) { case 0x00: /* Accept */ ! if (peek & 0x80) /* Constrained-media (short-integer) */ { proto_tree_add_uint (tree, hf_wsp_header_accept, header_buff, offset, headerLen, (peek & 0x7F)); + break; } ! if (peek >= 32) /* Constrained-media (text) */ ! { ! proto_tree_add_string (tree, hf_wsp_header_accept_str,header_buff,offset,headerLen, ! tvb_get_ptr (value_buff, 0, valueLen)); ! break; ! } ! /* general form (short length) */ ! offsetNew = offset+1; ! valueLength = tvb_get_guint8 (value_buff, offsetNew); ! if (valueLength & 0x80) /* short integer */ { ! valMatch = match_strval(valueLength & 0x7f, vals_content_types); ! offsetNew++; } + else if (valueLength < 32) /* long integer */ + { + if (get_long_integer(value_buff,&offsetNew,offset+peek,&value) < 0) + { + fprintf (stderr, "dissect_wsp: accept get_long_interger invalid\n"); + } + valMatch = match_strval(value, vals_content_types); + offsetNew+=valueLength; + if (valMatch == NULL) + { + snprintf(valNum1,100,"Unsupported type (%d)",value); + valMatch = valNum1; + } + } + else /* text */ + { + /* TODO */ + } + if ((offsetNew - offset) < peek) /* Parameter */ + { + value = tvb_get_guint8 (value_buff, offsetNew); + offsetNew++; + if (value & 0x80) /* well Know type */ + { + switch (value & 0x7f) + { + case 0x03 : + valueLength = tvb_get_guint8 (value_buff, offsetNew); + if (valueLength & 0x80) /* short integer */ + { + value = valueLength & 0x7F; + offsetNew++; + } + else if (valueLength < 32) /* Long integer */ + { + if (get_long_integer(value_buff,&offsetNew,offset+peek,&value) < 0) + { + fprintf (stderr, "dissect_wsp: accept get_long_interger parameter invalid\n"); + } + } + snprintf (valString, 100, "%s type %d", valMatch,value); + break; + case 0x00 : + case 0x01 : + case 0x02 : + case 0x04 : + default : + break; + } + } + } + else /* no parameter */ + { + snprintf (valString, 100, "%s", valMatch); + } + /* Add string to tree */ + proto_tree_add_string (tree, hf_wsp_header_accept_str, + header_buff, 0, headerLen, valString); + break; case 0x01: /* Accept-Charset */ *************** *** 947,956 **** snprintf (valString, 100, "%s; Q=%5.3f", valMatch,q_value); } } - /* Add string to tree */ - proto_tree_add_string (tree, hf_wsp_header_accept_charset_str, - header_buff, 0, headerLen, valString); } else /* Constrained-charset */ { --- 1043,1052 ---- snprintf (valString, 100, "%s; Q=%5.3f", valMatch,q_value); } } + /* Add string to tree */ + proto_tree_add_string (tree, hf_wsp_header_accept_charset_str, + header_buff, 0, headerLen, valString); } else /* Constrained-charset */ { *************** *** 1237,1242 **** --- 1333,1493 ---- } + static void + add_capabilities (proto_tree *tree, tvbuff_t *tvb) + { + proto_item *ti; + proto_tree *wsp_capabilities; + guint offset = 0; + guint offsetStr = 0; + guint capabilitiesLen = tvb_reported_length (tvb); + guint8 capabilitiesStart = 0; + guint peek = 0; + guint length = 0; + guint value = 0; + guint i; + char valString[200]; + + #ifdef DEBUG + fprintf (stderr, "dissect_wsp: Offset is %d, size is %d\n", offset, capabilitiesLen); + #endif + + /* End of buffer */ + if (capabilitiesLen <= 0) + { + fprintf (stderr, "dissect_wsp: Capabilities = 0\n"); + return; + } + + #ifdef DEBUG + fprintf (stderr, "dissect_wsp: capabilities to process\n"); + #endif + + ti = proto_tree_add_item (tree, hf_wsp_capabilities_section,tvb,offset,capabilitiesLen,bo_little_endian); + wsp_capabilities = proto_item_add_subtree( ti, ett_capabilities ); + + /* Parse Headers */ + + while (offset < capabilitiesLen) + { + /* Loop round each header */ + capabilitiesStart = offset; + length = tvb_get_guint8 (tvb, capabilitiesStart); + + if (length >= 127) /* length */ + { + #ifdef DEBUG + fprintf (stderr, "dissect_wsp: capabilities length invalid %d\n",length); + #endif + offset+=length; + continue; + } + offset++; + peek = tvb_get_guint8 (tvb, offset); + offset++; + switch (peek & 0x7f) + { + case 0x00 : /* Client-SDU-Size */ + value = get_uintvar (tvb, offset, length+capabilitiesStart+1); + proto_tree_add_uint (wsp_capabilities, hf_wsp_capabilities_client_SDU, tvb, capabilitiesStart, length+1, value); + break; + case 0x01 : /* Server-SDU-Size */ + value = get_uintvar (tvb, offset, length+capabilitiesStart+1); + proto_tree_add_uint (wsp_capabilities, hf_wsp_capabilities_server_SDU, tvb, capabilitiesStart, length+1, value); + break; + case 0x02 : /* Protocol Options */ + value = get_uintvar (tvb, offset, length+capabilitiesStart+1); + i = 0; + valString[0]=0; + if (value & 0x80) + { + i += snprintf(valString+i,200-1,"%s","(Confirmed push facility) "); + } + if (value & 0x40) + { + i += snprintf(valString+i,200-1,"%s","(Push facility) "); + } + if (value & 0x20) + { + i += snprintf(valString+i,200-1,"%s","(Session resume facility) "); + } + if (value & 0x10) + { + i += snprintf(valString+i,200-1,"%s","(Acknowledgement headers) "); + } + proto_tree_add_string(wsp_capabilities, hf_wsp_capabilities_protocol_opt, tvb, capabilitiesStart, length+1, valString); + break; + case 0x03 : /* Method-MOR */ + value = tvb_get_guint8(tvb, offset); + proto_tree_add_uint (wsp_capabilities, hf_wsp_capabilities_method_MOR, tvb, capabilitiesStart, length+1, value); + break; + case 0x04 : /* Push-MOR */ + value = tvb_get_guint8(tvb, offset); + proto_tree_add_uint (wsp_capabilities, hf_wsp_capabilities_push_MOR, tvb, capabilitiesStart, length+1, value); + break; + break; + case 0x05 : /* Extended Methods */ + offsetStr = offset; + offset++; + i = 0; + while ((offsetStr-capabilitiesStart) <= length) + { + value = tvb_get_guint8(tvb, offsetStr); + i += snprintf(valString+i,200-i,"(%d - ",value); + offsetStr++; + for (;(valString[i] = tvb_get_guint8(tvb, offsetStr));i++,offsetStr++); + offsetStr++; + valString[i++] = ')'; + valString[i++] = ' '; + } + valString[i]=0; + proto_tree_add_string(wsp_capabilities, hf_wsp_capabilities_extended_methods, tvb, capabilitiesStart, length+1, valString); + break; + case 0x06 : /* Header Code Pages */ + offsetStr = offset; + offset++; + i = 0; + while ((offsetStr-capabilitiesStart) <= length) + { + value = tvb_get_guint8(tvb, offsetStr); + i += snprintf(valString+i,200-i,"(%d - ",value); + offsetStr++; + for (;(valString[i] = tvb_get_guint8(tvb, offsetStr));i++,offsetStr++); + offsetStr++; + valString[i++] = ')'; + valString[i++] = ' '; + } + valString[i]=0; + proto_tree_add_string(wsp_capabilities, hf_wsp_capabilities_header_code_pages, tvb, capabilitiesStart, length+1, valString); + break; + case 0x07 : /* Aliases */ + break; + default: + proto_tree_add_text (wsp_capabilities, tvb , capabilitiesStart, length+1, + "Unsupported Header (0x%02X)", peek & 0x7F); + break; + } + offset=capabilitiesStart+length+1; + } + } + + static guint + get_uintvar (tvbuff_t *tvb, guint offset, guint offsetEnd) + { + guint value = 0; + guint octet; + + do + { + octet = tvb_get_guint8 (tvb, offset); + offset++; + value <<= 7; + value += octet & 0x7f; + } + while ((offsetEnd > offset) && (octet & 0x80)); + return value; + } + static guint get_value_length (tvbuff_t *tvb, guint offset, guint *nextOffset) { *************** *** 1611,1616 **** --- 1862,1875 ---- "Data" } }, + { &hf_wsp_header_shift_code, + { "Shift code", + "wsp.header.shift", + /*FT_NONE, BASE_DEC, NULL, 0x00,*/ + FT_UINT8, BASE_HEX, NULL, 0x00, + "Shift code" + } + }, { &hf_wsp_header_accept, { "Accept", "wsp.header.accept", *************** *** 1784,1789 **** --- 2043,2104 ---- "X-WAP.TOD" } }, + { &hf_wsp_capabilities_client_SDU, + { "Client SDU", + "wsp.capabilities.client_SDU", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Client SDU" + } + }, + { &hf_wsp_capabilities_server_SDU, + { "Server SDU", + "wsp.capabilities.server_SDU", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Server SDU" + } + }, + { &hf_wsp_capabilities_protocol_opt, + { "Protocol Options", + "wsp.capabilities.protocol_opt", + FT_STRING, BASE_HEX, NULL, 0x00, + "Protocol Options" + } + }, + { &hf_wsp_capabilities_method_MOR, + { "Method MOR", + "wsp.capabilities.method_mor", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Method MOR" + } + }, + { &hf_wsp_capabilities_push_MOR, + { "Push MOR", + "wsp.capabilities.push_mor", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Push MOR" + } + }, + { &hf_wsp_capabilities_extended_methods, + { "Extended Methods", + "wsp.capabilities.extend_methods", + FT_STRING, BASE_HEX, NULL, 0x00, + "Extended Methods" + } + }, + { &hf_wsp_capabilities_header_code_pages, + { "Header Code Pages", + "wsp.capabilities.code_pages", + FT_STRING, BASE_HEX, NULL, 0x00, + "Header Code Pages" + } + }, + { &hf_wsp_capabilities_aliases, + { "Aliases", + "wsp.capabilities.aliases", + FT_UINT8, BASE_HEX, NULL, 0x00, + "Aliases" + } + }, { &hf_wsp_post_data, { "Post Data", "wsp.post.data", *************** *** 1830,1833 **** --- 2145,2183 ---- dissector_add("udp.port", UDP_PORT_WSP, dissect_wsp, proto_wsp); /* This dissector is also called from the WTP and WTLS dissectors */ + } + + static gint get_long_integer (tvbuff_t *tvb, guint *offset, guint offset_end, guint *value) + { + guint valueLength; + + valueLength = tvb_get_guint8(tvb,*offset); + if ((valueLength+*offset) > offset_end) + { + *value = 0; + return (-1); + } + (*offset)++; + switch (valueLength) + { + case 1: + *value = tvb_get_guint8(tvb,*offset); + break; + case 2: + *value = tvb_get_ntohs(tvb,*offset); + break; + case 3: + *value = tvb_get_ntoh24(tvb,*offset); + break; + case 4: + *value = tvb_get_ntohl(tvb,*offset); + break; + default: + /* TODO: Need to read peek octets */ + *value = 0; + fprintf (stderr, "dissect_wsp: get_long_integer size %d NYI\n", valueLength); + break; + } + (*offset) += valueLength; + return 0; }
begin:vcard n:Peixoto Ferreira;Alexandre tel;cell:_55 61 96184223 tel;work:+55 61 3137504 x-mozilla-html:FALSE org:TCO - Tele Centro Oeste Celular S.A.;TCO IP adr:;;SCS Qd 2 ED Toufic 1 andar;Brasília;DF;70302-918; version:2.1 email;internet:alexandre.ferreira@xxxxxxxxxxxx title:Coordenandor de Planejamento x-mozilla-cpt:;-16832 fn:Alexandre Peixoto Ferreira end:vcard
- Follow-Ups:
- Re: [Ethereal-dev] Updates for WSP connection-oriented
- From: Guy Harris
- Re: [Ethereal-dev] Updates for WSP connection-oriented
- Prev by Date: [Ethereal-dev] Storing packet data into an SQL database
- Next by Date: RE: [Ethereal-dev] Bug report: ethereal 0.8.18 complilation on So laris 7
- Previous by thread: [Ethereal-dev] Storing packet data into an SQL database
- Next by thread: Re: [Ethereal-dev] Updates for WSP connection-oriented
- Index(es):