aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames@darkjames.pl>2014-07-02 00:49:09 +0200
committerAnders Broman <a.broman58@gmail.com>2014-07-02 06:07:44 +0000
commitaf7528999f44e6df13e4cc8b641c6d779ac22f71 (patch)
treebd283aa9bd8bf51b9b1a846a8c0a7bcbad3bc6ac /epan
parentf737381896d13ca9fcf89103aded09361f70ad2d (diff)
Optimize sip dissector: avoid calling tvb_get_string_enc()
Fetch header value, only when we need to parse it. Change-Id: I3c170ef8ab03985c8111a1b84ac1afc87bc8b5ca Reviewed-on: https://code.wireshark.org/review/2767 Reviewed-by: Evan Huus <eapache@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-sip.c146
1 files changed, 90 insertions, 56 deletions
diff --git a/epan/dissectors/packet-sip.c b/epan/dissectors/packet-sip.c
index 9958f4dc26..c5cc5f95b6 100644
--- a/epan/dissectors/packet-sip.c
+++ b/epan/dissectors/packet-sip.c
@@ -1220,6 +1220,36 @@ uri_host_end_found:
return uri_offsets->name_addr_end;
}
+static proto_item *
+sip_proto_tree_add_uint(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gint length, gint value_offset, gint value_len)
+{
+ const char *str;
+ unsigned long val;
+
+ /* don't fetch string when field is not referenced */
+ if (!proto_field_is_referenced(tree, hfindex))
+ return tree;
+
+ str = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
+ val = strtoul(str, NULL, 10);
+
+ return proto_tree_add_uint(tree, hfindex, tvb, start, length, (guint32) val);
+}
+
+static proto_item *
+sip_proto_tree_add_string(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start, gint length, gint value_offset, gint value_len)
+{
+ const char *str;
+
+ /* don't fetch string when field is not referenced */
+ if (!proto_field_is_referenced(tree, hfindex))
+ return tree;
+
+ str = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
+
+ return proto_tree_add_string(tree, hfindex, tvb, start, length, str);
+}
+
static void
sip_proto_set_format_text(const proto_tree *tree, proto_item *item, tvbuff_t *tvb, int offset, int length)
{
@@ -2630,7 +2660,6 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
gint comma_offset;
guchar c;
gint value_len;
- char *value;
gboolean is_no_header_termination = FALSE;
proto_tree *tc_uri_item_tree = NULL;
uri_offset_info uri_offsets;
@@ -2682,11 +2711,7 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
*/
value_offset = tvb_skip_wsp(tvb, colon_offset + 1, line_end_offset - (colon_offset + 1));
- /*
- * Fetch the value.
- */
value_len = (gint) (line_end_offset - value_offset);
- value = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
if (hf_index == -1) {
proto_item *ti_c = proto_tree_add_text(hdr_tree, tvb,
@@ -2718,10 +2743,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
if(hdr_tree) {
proto_item *item;
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2779,10 +2804,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
if(hdr_tree) {
proto_item *item;
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item, ett_sip_element);
@@ -2830,10 +2855,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_P_ASSERTED_IDENTITY :
if(hdr_tree)
{
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2854,10 +2879,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_HISTORY_INFO:
if(hdr_tree)
{
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2869,10 +2894,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_P_CHARGING_FUNC_ADDRESSES:
if(hdr_tree)
{
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2884,10 +2909,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_P_PREFERRED_IDENTITY :
if(hdr_tree)
{
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2908,10 +2933,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_PERMISSION_MISSING :
if(hdr_tree)
{
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2933,10 +2958,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_TRIGGER_CONSENT :
if(hdr_tree)
{
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -2979,7 +3004,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
break;
case POS_CSEQ :
+ {
/* Store the sequence number */
+ char *value = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
+
cseq_number = (guint32)strtoul(value, NULL, 10);
cseq_number_set = 1;
stat_info->tap_cseq_number=cseq_number;
@@ -3049,10 +3077,12 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
value_offset + sub_value_offset, strlen_to_copy, ENC_UTF_8|ENC_NA);
}
}
+ }
break;
case POS_RACK :
{
+ char *value = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
int cseq_no_offset;
/*int cseq_method_offset;*/
@@ -3133,6 +3163,9 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
}
case POS_CALL_ID :
+ {
+ char *value = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
+
/* Store the Call-id */
g_strlcpy(call_id, value, MAX_CALL_ID_SIZE);
stat_info->tap_call_id = wmem_strdup(wmem_packet_scope(), call_id);
@@ -3143,20 +3176,20 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
offset, next_offset - offset,
value);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
+ }
break;
case POS_EXPIRES :
- if (strcmp(value, "0") == 0)
+ if (tvb_strneql(tvb, value_offset, "0", value_len) == 0)
{
expires_is_0 = 1;
}
+
/* Add 'Expires' string item to tree */
- if(hdr_tree) {
- proto_tree_add_uint(hdr_tree,
+ sip_proto_tree_add_uint(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- atoi(value));
- }
+ value_offset, value_len);
break;
/*
@@ -3166,10 +3199,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
* lookup in "media_type" dissector table.
*/
case POS_CONTENT_TYPE :
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
content_type_len = value_len;
@@ -3202,6 +3235,8 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
break;
case POS_CONTENT_LENGTH :
+ {
+ char *value = tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset, value_len, ENC_UTF_8|ENC_NA);
content_length = atoi(value);
sip_element_item = proto_tree_add_uint(hdr_tree,
@@ -3211,16 +3246,15 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
break;
+ }
case POS_MAX_BREADTH :
case POS_MAX_FORWARDS :
case POS_RSEQ :
- if(hdr_tree) {
- proto_tree_add_uint(hdr_tree,
+ sip_proto_tree_add_uint(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- (guint32)strtoul(value, NULL, 10));
- }
+ value_offset, value_len);
break;
case POS_CONTACT :
@@ -3229,10 +3263,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
* ( STAR / (contact-param *(COMMA contact-param)))
* contact-param = (name-addr / addr-spec) *(SEMI contact-params)
*/
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -3300,10 +3334,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
if (hdr_tree) {
proto_item *ti_c;
/* Add whole line as header tree */
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
sip_element_tree = proto_item_add_subtree( sip_element_item,
@@ -3350,10 +3384,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_ROUTE:
/* Add Route subtree */
if (hdr_tree) {
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
route_tree = proto_item_add_subtree(sip_element_item, ett_sip_route);
@@ -3363,10 +3397,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_RECORD_ROUTE:
/* Add Record-Route subtree */
if (hdr_tree) {
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
route_tree = proto_item_add_subtree(sip_element_item, ett_sip_route);
@@ -3376,10 +3410,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_SERVICE_ROUTE:
/* Add Service-Route subtree */
if (hdr_tree) {
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
route_tree = proto_item_add_subtree(sip_element_item, ett_sip_route);
@@ -3389,10 +3423,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
case POS_VIA:
/* Add Via subtree */
if (hdr_tree) {
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
via_tree = proto_item_add_subtree(sip_element_item, ett_sip_via);
@@ -3401,10 +3435,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
break;
case POS_REASON:
if(hdr_tree) {
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
reason_tree = proto_item_add_subtree(sip_element_item, ett_sip_reason);
@@ -3415,10 +3449,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
/* Content-Encoding = ( "Content-Encoding" / "e" ) HCOLON
* content-coding *(COMMA content-coding)
*/
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
content_encoding_parameter_str = ascii_strdown_inplace(tvb_get_string_enc(wmem_packet_scope(), tvb, value_offset,
@@ -3428,10 +3462,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
/* security-client = "Security-Client" HCOLON
* sec-mechanism *(COMMA sec-mechanism)
*/
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
comma_offset = tvb_find_guint8(tvb, value_offset, line_end_offset - value_offset, ',');
@@ -3450,10 +3484,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
/* security-server = "Security-Server" HCOLON
* sec-mechanism *(COMMA sec-mechanism)
*/
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
comma_offset = tvb_find_guint8(tvb, value_offset, line_end_offset - value_offset, ',');
@@ -3472,10 +3506,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
/* security-verify = "Security-Verify" HCOLON
* sec-mechanism *(COMMA sec-mechanism)
*/
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
comma_offset = tvb_find_guint8(tvb, value_offset, line_end_offset - value_offset, ',');
@@ -3492,10 +3526,10 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
break;
default :
/* Default case is to assume it's an FT_STRING field */
- sip_element_item = proto_tree_add_string(hdr_tree,
+ sip_element_item = sip_proto_tree_add_string(hdr_tree,
hf_header_array[hf_index], tvb,
offset, next_offset - offset,
- value);
+ value_offset, value_len);
sip_proto_set_format_text(hdr_tree, sip_element_item, tvb, offset, linelen);
break;
}/* end switch */