Wireshark-dev: Re: [Wireshark-dev] RFC: sorted value_string + bsearch
From: Jakub Zawadzki <darkjames@xxxxxxxxxxxxxxxx>
Date: Tue, 27 Apr 2010 08:49:23 +0200
On Tue, Apr 27, 2010 at 08:15:35AM +0200, Anders Broman wrote: > Can you provide an example use of the new value_string_ext as well? Attaching sample patch for dns. Can you do some benchmarks? :)
diff --git epan/dissectors/packet-dns.c epan/dissectors/packet-dns.c
index 960231e..a814612 100644
--- epan/dissectors/packet-dns.c
+++ epan/dissectors/packet-dns.c
@@ -318,7 +318,7 @@ static const true_false_string tfs_flags_checkdisable = {
#define OPCODE_NOTIFY 4 /* zone change notification */
#define OPCODE_UPDATE 5 /* dynamic update */
-static const value_string opcode_vals[] = {
+static const value_string _opcode_vals[] = {
{ OPCODE_QUERY, "Standard query" },
{ OPCODE_IQUERY, "Inverse query" },
{ OPCODE_STATUS, "Server status request" },
@@ -326,6 +326,8 @@ static const value_string opcode_vals[] = {
{ OPCODE_UPDATE, "Dynamic update" },
{ 0, NULL } };
+static value_string_ext opcode_vals = VALUE_STRING_EXT_INIT(_opcode_vals);
+
/* Reply codes */
#define RCODE_NOERROR 0
#define RCODE_FORMERR 1
@@ -339,7 +341,7 @@ static const value_string opcode_vals[] = {
#define RCODE_NOTAUTH 9
#define RCODE_NOTZONE 10
-static const value_string rcode_vals[] = {
+static const value_string _rcode_vals[] = {
{ RCODE_NOERROR, "No error" },
{ RCODE_FORMERR, "Format error" },
{ RCODE_SERVFAIL, "Server failure" },
@@ -353,6 +355,8 @@ static const value_string rcode_vals[] = {
{ RCODE_NOTZONE, "Name out of zone" },
{ 0, NULL } };
+static value_string_ext rcode_vals = VALUE_STRING_EXT_INIT(_rcode_vals);
+
#define NSEC3_HASH_RESERVED 0
#define NSEC3_HASH_SHA1 1
@@ -432,7 +436,7 @@ http://www.microsoft.com/windows2000/library/resources/reskit/samplechapters/cnc
which discuss them to some extent. */
-static const value_string dns_types[] = {
+static const value_string _dns_types[] = {
{ 0, "Unused" },
{ T_A, "A" },
{ T_NS, "NS" },
@@ -488,8 +492,6 @@ static const value_string dns_types[] = {
{ T_HIP, "HIP" }, /* Host Identity Protocol (HIP) RR (RFC 5205) */
-
-
{ T_SPF, "SPF" }, /* SPF RR (RFC 4408) section 3 */
{ 100, "UINFO" },
{ 101, "UID" },
@@ -499,24 +501,26 @@ static const value_string dns_types[] = {
{ T_TKEY, "TKEY"},
{ T_TSIG, "TSIG"},
- { T_WINS, "WINS"},
- { T_WINS_R, "WINS-R"},
-
{ 251, "IXFR"},
{ 252, "AXFR"},
{ 253, "MAILB"},
{ 254, "MAILA"},
{ 255, "ANY"},
-
{ T_DLV, "DLV" }, /* Domain Lookaside Validation DNS Resource Record (RFC 4431) */
+
+ { T_WINS, "WINS"},
+ { T_WINS_R, "WINS-R"},
+
{0, NULL}
};
+static value_string_ext dns_types = VALUE_STRING_EXT_INIT(_dns_types);
+
static const char *
dns_type_name (guint type)
{
- return val_to_str(type, dns_types, "Unknown (%u)");
+ return val_to_str_ext(type, &dns_types, "Unknown (%u)");
}
static char *
@@ -628,7 +632,7 @@ dns_type_description (guint type)
return ep_strdup(short_name);
}
-static const value_string dns_classes[] = {
+static const value_string _dns_classes[] = {
{C_IN, "IN"},
{C_CS, "CS"},
{C_CH, "CH"},
@@ -638,10 +642,12 @@ static const value_string dns_classes[] = {
{0,NULL}
};
+static value_string_ext dns_classes = VALUE_STRING_EXT_INIT(_dns_classes);
+
const char *
dns_class_name(int class)
{
- return val_to_str(class, dns_classes, "Unknown (%u)");
+ return val_to_str_ext(class, &dns_classes, "Unknown (%u)");
}
/* This function returns the number of bytes consumed and the expanded string
@@ -2216,7 +2222,7 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
goto bad_rr;
tkey_error = tvb_get_ntohs(tvb, cur_offset);
proto_tree_add_text(rr_tree, tvb, cur_offset, 2, "Error: %s",
- val_to_str(tkey_error, rcode_vals,
+ val_to_str_ext(tkey_error, &rcode_vals,
val_to_str(tkey_error, tsigerror_vals, "Unknown error (%x)")));
cur_offset += 2;
rr_len -= 2;
@@ -2366,7 +2372,7 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
goto bad_rr;
tsig_error = tvb_get_ntohs(tvb, cur_offset);
proto_tree_add_uint_format(rr_tree, hf_dns_tsig_error, tvb, cur_offset, 2, tsig_error, "Error: %s (%d)",
- val_to_str(tsig_error, rcode_vals,val_to_str(tsig_error, tsigerror_vals, "Unknown error")),
+ val_to_str_ext(tsig_error, &rcode_vals,val_to_str(tsig_error, tsigerror_vals, "Unknown error")),
tsig_error);
cur_offset += 2;
rr_len -= 2;
@@ -3067,14 +3073,14 @@ dissect_dns_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
bufpos=0;
bufpos+=MIN(MAX_BUF_SIZE-bufpos,
g_snprintf(buf+bufpos, MAX_BUF_SIZE-bufpos, "%s%s",
- val_to_str(opcode, opcode_vals, "Unknown operation (%u)"),
+ val_to_str_ext(opcode, &opcode_vals, "Unknown operation (%u)"),
(flags&F_RESPONSE)?" response":""));
if (flags & F_RESPONSE) {
if ((flags & F_RCODE) != RCODE_NOERROR) {
bufpos+=MIN(MAX_BUF_SIZE-bufpos,
g_snprintf(buf+bufpos, MAX_BUF_SIZE-bufpos, ", %s",
- val_to_str(flags & F_RCODE, rcode_vals, "Unknown error (%u)")));
+ val_to_str_ext(flags & F_RCODE, &rcode_vals, "Unknown error (%u)")));
}
}
col_add_str(pinfo->cinfo, COL_INFO, buf);
@@ -3189,11 +3195,11 @@ dissect_dns_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
bufpos=0;
bufpos+=MIN(MAX_BUF_SIZE-bufpos,
g_snprintf(buf+bufpos, MAX_BUF_SIZE-bufpos, "%s",
- val_to_str(opcode, opcode_vals, "Unknown operation")));
+ val_to_str_ext(opcode, &opcode_vals, "Unknown operation")));
if (flags & F_RESPONSE) {
bufpos+=MIN(MAX_BUF_SIZE-bufpos,
g_snprintf(buf+bufpos, MAX_BUF_SIZE-bufpos, " response, %s",
- val_to_str(flags & F_RCODE, rcode_vals, "Unknown error")));
+ val_to_str_ext(flags & F_RCODE, &rcode_vals, "Unknown error")));
}
tf = proto_tree_add_uint_format(dns_tree, hf_dns_flags, tvb,
offset + DNS_FLAGS, 2,
@@ -3402,7 +3408,7 @@ proto_register_dns(void)
"Is the message a response?", HFILL }},
{ &hf_dns_flags_opcode,
{ "Opcode", "dns.flags.opcode",
- FT_UINT16, BASE_DEC, VALS(opcode_vals), F_OPCODE,
+ FT_UINT16, BASE_DEC | BASE_EXT_STRING, VALS(&opcode_vals), F_OPCODE,
"Operation code", HFILL }},
{ &hf_dns_flags_authoritative,
{ "Authoritative", "dns.flags.authoritative",
@@ -3446,7 +3452,7 @@ proto_register_dns(void)
"Is non-authenticated data acceptable?", HFILL }},
{ &hf_dns_flags_rcode,
{ "Reply code", "dns.flags.rcode",
- FT_UINT16, BASE_DEC, VALS(rcode_vals), F_RCODE,
+ FT_UINT16, BASE_DEC | BASE_EXT_STRING, VALS(&rcode_vals), F_RCODE,
NULL, HFILL }},
{ &hf_dns_transaction_id,
{ "Transaction ID", "dns.id",
@@ -3454,15 +3460,15 @@ proto_register_dns(void)
"Identification of transaction", HFILL }},
{ &hf_dns_qry_type,
{ "Type", "dns.qry.type",
- FT_UINT16, BASE_HEX, VALS(dns_types), 0x0,
+ FT_UINT16, BASE_HEX | BASE_EXT_STRING, VALS(&dns_types), 0x0,
"Query Type", HFILL }},
{ &hf_dns_qry_class,
{ "Class", "dns.qry.class",
- FT_UINT16, BASE_HEX, VALS(dns_classes), 0x0,
+ FT_UINT16, BASE_HEX | BASE_EXT_STRING, VALS(&dns_classes), 0x0,
"Query Class", HFILL }},
{ &hf_dns_qry_class_mdns,
{ "Class", "dns.qry.class",
- FT_UINT16, BASE_HEX, VALS(dns_classes), 0x7FFF,
+ FT_UINT16, BASE_HEX | BASE_EXT_STRING, VALS(&dns_classes), 0x7FFF,
"Query Class", HFILL }},
{ &hf_dns_qry_qu,
{ "\"QU\" question", "dns.qry.qu",
@@ -3474,15 +3480,15 @@ proto_register_dns(void)
"Query Name", HFILL }},
{ &hf_dns_rr_type,
{ "Type", "dns.resp.type",
- FT_UINT16, BASE_HEX, VALS(dns_types), 0x0,
+ FT_UINT16, BASE_HEX | BASE_EXT_STRING, VALS(&dns_types), 0x0,
"Response Type", HFILL }},
{ &hf_dns_rr_class,
{ "Class", "dns.resp.class",
- FT_UINT16, BASE_HEX, VALS(dns_classes), 0x0,
+ FT_UINT16, BASE_HEX | BASE_EXT_STRING, VALS(&dns_classes), 0x0,
"Response Class", HFILL }},
{ &hf_dns_rr_class_mdns,
{ "Class", "dns.resp.class",
- FT_UINT16, BASE_HEX, VALS(dns_classes), 0x7FFF,
+ FT_UINT16, BASE_HEX | BASE_EXT_STRING, VALS(&dns_classes), 0x7FFF,
"Response Class", HFILL }},
{ &hf_dns_rr_cache_flush,
{ "Cache flush", "dns.resp.cache_flush",
- Follow-Ups:
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Jakub Zawadzki
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Anders Broman
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- References:
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Ed Beroset
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Anders Broman
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Maynard, Chris
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Anders Broman
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Jakub Zawadzki
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Anders Broman
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Jakub Zawadzki
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- From: Anders Broman
- Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- Prev by Date: Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- Next by Date: [Wireshark-dev] buildbot failure in Wireshark (development) on Windows-7-x64
- Previous by thread: Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- Next by thread: Re: [Wireshark-dev] RFC: sorted value_string + bsearch
- Index(es):