From 5493fe01671f7f293eb87edb780019c889859153 Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Mon, 2 May 2016 21:44:48 -0400 Subject: Convert ftype-tvbuff.c to ftype-protocol.c As noted in https://www.wireshark.org/lists/wireshark-dev/201604/msg00103.html a protocol field isn't really a tv_buff, so allow for the possibility of a NULL tv_buff in a "protocol type". If the tvb is NULL, use the string of the protocol field for comparison Bug: 12335 Change-Id: Ie12a5f7b31c7293c61006b0f70135d100a97c4e0 Reviewed-on: https://code.wireshark.org/review/15261 Petri-Dish: Michael Mann Reviewed-by: Alexis La Goutte Reviewed-by: Michael Mann --- epan/ftypes/.editorconfig | 2 +- epan/ftypes/CMakeLists.txt | 2 +- epan/ftypes/Makefile.common | 4 +- epan/ftypes/ftype-bytes.c | 18 +- epan/ftypes/ftype-double.c | 4 +- epan/ftypes/ftype-guid.c | 2 +- epan/ftypes/ftype-ieee-11073-float.c | 4 +- epan/ftypes/ftype-integer.c | 40 +-- epan/ftypes/ftype-ipv4.c | 2 +- epan/ftypes/ftype-ipv6.c | 2 +- epan/ftypes/ftype-none.c | 2 +- epan/ftypes/ftype-pcre.c | 2 +- epan/ftypes/ftype-protocol.c | 515 +++++++++++++++++++++++++++++++++++ epan/ftypes/ftype-string.c | 8 +- epan/ftypes/ftype-time.c | 4 +- epan/ftypes/ftype-tvbuff.c | 467 ------------------------------- epan/ftypes/ftypes-int.h | 4 +- epan/ftypes/ftypes.c | 6 +- epan/ftypes/ftypes.h | 10 +- 19 files changed, 576 insertions(+), 522 deletions(-) create mode 100644 epan/ftypes/ftype-protocol.c delete mode 100644 epan/ftypes/ftype-tvbuff.c (limited to 'epan/ftypes') diff --git a/epan/ftypes/.editorconfig b/epan/ftypes/.editorconfig index 97563d51ee..b7c5d2a3f8 100644 --- a/epan/ftypes/.editorconfig +++ b/epan/ftypes/.editorconfig @@ -32,7 +32,7 @@ indent_size = tab indent_style = tab indent_size = tab -[ftype-tvbuff.[ch]] +[ftype-protocol.[ch]] indent_style = tab indent_size = tab diff --git a/epan/ftypes/CMakeLists.txt b/epan/ftypes/CMakeLists.txt index 245ceb9052..6ddcb9fbee 100644 --- a/epan/ftypes/CMakeLists.txt +++ b/epan/ftypes/CMakeLists.txt @@ -35,9 +35,9 @@ set(FTYPE_FILES ftype-guid.c ftype-none.c ftype-pcre.c + ftype-protocol.c ftype-string.c ftype-time.c - ftype-tvbuff.c ) source_group(ftype FILES ${FTYPE_FILES}) diff --git a/epan/ftypes/Makefile.common b/epan/ftypes/Makefile.common index dba0bf6860..b8b9042c9e 100644 --- a/epan/ftypes/Makefile.common +++ b/epan/ftypes/Makefile.common @@ -37,9 +37,9 @@ NONGENERATED_C_FILES = \ ftype-guid.c \ ftype-none.c \ ftype-pcre.c \ + ftype-protocol.c \ ftype-string.c \ - ftype-time.c \ - ftype-tvbuff.c + ftype-time.c # Header files that are not generated from other files NONGENERATED_HEADER_FILES = \ diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c index ab6ded9dfe..f5c1b74857 100644 --- a/epan/ftypes/ftype-bytes.c +++ b/epan/ftypes/ftype-bytes.c @@ -742,7 +742,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -787,7 +787,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -832,7 +832,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_integer */ NULL, /* set_value_uinteger64 */ @@ -877,7 +877,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_integer */ NULL, /* set_value_uinteger64 */ @@ -922,7 +922,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -967,7 +967,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1012,7 +1012,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1057,7 +1057,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1102,7 +1102,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-double.c b/epan/ftypes/ftype-double.c index 1eb3c103d0..5a0812f1cb 100644 --- a/epan/ftypes/ftype-double.c +++ b/epan/ftypes/ftype-double.c @@ -175,7 +175,7 @@ ftype_register_double(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -220,7 +220,7 @@ ftype_register_double(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-guid.c b/epan/ftypes/ftype-guid.c index 1b88b70c13..f5731032ee 100644 --- a/epan/ftypes/ftype-guid.c +++ b/epan/ftypes/ftype-guid.c @@ -143,7 +143,7 @@ ftype_register_guid(void) guid_fvalue_set_guid, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-ieee-11073-float.c b/epan/ftypes/ftype-ieee-11073-float.c index 1a99b84367..3109e1ffd1 100644 --- a/epan/ftypes/ftype-ieee-11073-float.c +++ b/epan/ftypes/ftype-ieee-11073-float.c @@ -1443,7 +1443,7 @@ Example: 114 is 0x0072 NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ sfloat_ieee_11073_value_set, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1515,7 +1515,7 @@ Example: 36.4 is 0xFF00016C NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ float_ieee_11073_value_set, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-integer.c b/epan/ftypes/ftype-integer.c index 83345b92b6..2df16a6cd3 100644 --- a/epan/ftypes/ftype-integer.c +++ b/epan/ftypes/ftype-integer.c @@ -798,7 +798,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -842,7 +842,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -886,7 +886,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -930,7 +930,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -974,7 +974,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1018,7 +1018,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1062,7 +1062,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1106,7 +1106,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1150,7 +1150,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1194,7 +1194,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1238,7 +1238,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1282,7 +1282,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1326,7 +1326,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1370,7 +1370,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1414,7 +1414,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1458,7 +1458,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1502,7 +1502,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1547,7 +1547,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* get_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1592,7 +1592,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1637,7 +1637,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-ipv4.c b/epan/ftypes/ftype-ipv4.c index c189d42617..12b1ec00fe 100644 --- a/epan/ftypes/ftype-ipv4.c +++ b/epan/ftypes/ftype-ipv4.c @@ -190,7 +190,7 @@ ftype_register_ipv4(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-ipv6.c b/epan/ftypes/ftype-ipv6.c index 6f33cb581c..9540fb25ca 100644 --- a/epan/ftypes/ftype-ipv6.c +++ b/epan/ftypes/ftype-ipv6.c @@ -242,7 +242,7 @@ ftype_register_ipv6(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-none.c b/epan/ftypes/ftype-none.c index 351c692b7a..7212e28439 100644 --- a/epan/ftypes/ftype-none.c +++ b/epan/ftypes/ftype-none.c @@ -44,7 +44,7 @@ ftype_register_none(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-pcre.c b/epan/ftypes/ftype-pcre.c index 8ea48afa31..e0ed16ab84 100644 --- a/epan/ftypes/ftype-pcre.c +++ b/epan/ftypes/ftype-pcre.c @@ -168,7 +168,7 @@ ftype_register_pcre(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ gregex_fvalue_set, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-protocol.c b/epan/ftypes/ftype-protocol.c new file mode 100644 index 0000000000..35c449a701 --- /dev/null +++ b/epan/ftypes/ftype-protocol.c @@ -0,0 +1,515 @@ +/* + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 2001 Gerald Combs + * + * 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 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include +#include +#include + +#include + +#define CMP_MATCHES cmp_matches + +#define tvb_is_private fvalue_gboolean1 + +static void +value_new(fvalue_t *fv) +{ + fv->value.protocol.tvb = NULL; + fv->value.protocol.proto_string = NULL; + fv->tvb_is_private = FALSE; +} + +static void +value_free(fvalue_t *fv) +{ + if (fv->value.protocol.tvb && fv->tvb_is_private) { + tvb_free_chain(fv->value.protocol.tvb); + } + g_free(fv->value.protocol.proto_string); +} + +static void +value_set(fvalue_t *fv, tvbuff_t *value, const gchar *name) +{ + /* Free up the old value, if we have one */ + value_free(fv); + + fv->value.protocol.tvb = value; + fv->value.protocol.proto_string = g_strdup(name); +} + +static void +free_tvb_data(void *data) +{ + g_free(data); +} + +static gboolean +val_from_string(fvalue_t *fv, const char *s, gchar **err_msg _U_) +{ + tvbuff_t *new_tvb; + guint8 *private_data; + + /* Free up the old value, if we have one */ + value_free(fv); + + /* Make a tvbuff from the string. We can drop the + * terminating NUL. */ + private_data = (guint8 *)g_memdup(s, (guint)strlen(s)); + new_tvb = tvb_new_real_data(private_data, + (guint)strlen(s), (gint)strlen(s)); + + /* Let the tvbuff know how to delete the data. */ + tvb_set_free_cb(new_tvb, free_tvb_data); + + /* And let us know that we need to free the tvbuff */ + fv->tvb_is_private = TRUE; + fv->value.protocol.tvb = new_tvb; + fv->value.protocol.proto_string = g_strdup(s); + return TRUE; +} + +static gboolean +val_from_unparsed(fvalue_t *fv, const char *s, gboolean allow_partial_value _U_, gchar **err_msg) +{ + fvalue_t *fv_bytes; + tvbuff_t *new_tvb; + guint8 *private_data; + + /* Free up the old value, if we have one */ + value_free(fv); + + /* Does this look like a byte string? */ + fv_bytes = fvalue_from_unparsed(FT_BYTES, s, TRUE, NULL); + if (fv_bytes) { + /* Make a tvbuff from the bytes */ + private_data = (guint8 *)g_memdup(fv_bytes->value.bytes->data, + fv_bytes->value.bytes->len); + new_tvb = tvb_new_real_data(private_data, + fv_bytes->value.bytes->len, + fv_bytes->value.bytes->len); + + /* Let the tvbuff know how to delete the data. */ + tvb_set_free_cb(new_tvb, free_tvb_data); + + /* And let us know that we need to free the tvbuff */ + fv->tvb_is_private = TRUE; + fv->value.protocol.tvb = new_tvb; + return TRUE; + } + + /* Treat it as a string. */ + return val_from_string(fv, s, err_msg); +} + +static int +val_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display _U_) +{ + volatile guint length = 0; + + if (rtype != FTREPR_DFILTER) return -1; + + TRY { + /* 3 bytes for each byte of the byte "NN:" minus 1 byte + * as there's no trailing ":". */ + length = tvb_captured_length(fv->value.protocol.tvb) * 3 - 1; + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return (int) length; +} + +static void +val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char * volatile buf) +{ + guint length; + + g_assert(rtype == FTREPR_DFILTER); + + TRY { + length = tvb_captured_length(fv->value.protocol.tvb); + + if (length) + buf = bytes_to_hexstr_punct(buf, tvb_get_ptr(fv->value.protocol.tvb, 0, length), length, ':'); + *buf = '\0'; + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; +} + +static gpointer +value_get(fvalue_t *fv) +{ + return fv->value.protocol.tvb; +} + +static guint +len(fvalue_t *fv) +{ + volatile guint length = 0; + + TRY { + if (fv->value.protocol.tvb) + length = tvb_captured_length(fv->value.protocol.tvb); + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return length; +} + +static void +slice(fvalue_t *fv, GByteArray *bytes, guint offset, guint length) +{ + const guint8* data; + + if (fv->value.protocol.tvb) { + TRY { + data = tvb_get_ptr(fv->value.protocol.tvb, offset, length); + g_byte_array_append(bytes, data, length); + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + } +} + +static gboolean +cmp_eq(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; + volatile gboolean eq = FALSE; + + TRY { + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + + if (a_len == tvb_captured_length(b->tvb)) + eq = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) == 0); + } else { + eq = (strcmp(a->proto_string, b->proto_string) == 0); + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return eq; +} + +static gboolean +cmp_ne(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; + volatile gboolean ne = TRUE; + + TRY { + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + + if (a_len == tvb_captured_length(b->tvb)) + ne = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) != 0); + } else { + ne = (strcmp(a->proto_string, b->proto_string) != 0); + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return ne; +} + +static gboolean +cmp_gt(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; + volatile gboolean gt = FALSE; + + TRY { + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len > b_len) { + gt = TRUE; + } else if (a_len == b_len) { + gt = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) > 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) > 0); + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return gt; +} + +static gboolean +cmp_ge(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; + volatile gboolean ge = FALSE; + + TRY { + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len > b_len) { + ge = TRUE; + } else if (a_len == b_len) { + ge = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) >= 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) >= 0); + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return ge; +} + +static gboolean +cmp_lt(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; + volatile gboolean lt = FALSE; + + TRY { + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len < b_len) { + lt = TRUE; + } else if (a_len == b_len) { + lt = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) < 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) < 0); + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return lt; +} + +static gboolean +cmp_le(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; + volatile gboolean le = FALSE; + + TRY { + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len < b_len) { + le = TRUE; + } else if (a_len == b_len) { + le = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) <= 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) <= 0); + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return le; +} + +static gboolean +cmp_contains(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + volatile gboolean contains = FALSE; + + TRY { + /* First see if tvb exists for both sides */ + if ((fv_a->value.protocol.tvb != NULL) && (fv_b->value.protocol.tvb != NULL)) { + if (tvb_find_tvb(fv_a->value.protocol.tvb, fv_b->value.protocol.tvb, 0) > -1) { + contains = TRUE; + } + } else { + /* Otherwise just compare strings */ + if ((strlen(fv_b->value.protocol.proto_string) != 0) && + strstr(fv_a->value.protocol.proto_string, fv_b->value.protocol.proto_string)) { + contains = TRUE; + } + } + } + CATCH_ALL { + /* nothing */ + } + ENDTRY; + + return contains; +} + +static gboolean +cmp_matches(const fvalue_t *fv_a, const fvalue_t *fv_b) +{ + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + GRegex *regex = fv_b->value.re; + volatile gboolean rc = FALSE; + const char *data = NULL; /* tvb data */ + guint32 tvb_len; /* tvb length */ + + /* fv_b is always a FT_PCRE, otherwise the dfilter semcheck() would have + * warned us. For the same reason (and because we're using g_malloc()), + * fv_b->value.re is not NULL. + */ + if (strcmp(fv_b->ftype->name, "FT_PCRE") != 0) { + return FALSE; + } + if (! regex) { + return FALSE; + } + TRY { + if (a->tvb != NULL) { + tvb_len = tvb_captured_length(a->tvb); + data = (const char *)tvb_get_ptr(a->tvb, 0, tvb_len); + rc = g_regex_match_full( + regex, /* Compiled PCRE */ + data, /* The data to check for the pattern... */ + tvb_len, /* ... and its length */ + 0, /* Start offset within data */ + (GRegexMatchFlags)0, /* GRegexMatchFlags */ + NULL, /* We are not interested in the match information */ + NULL /* We don't want error information */ + ); + /* NOTE - DO NOT g_free(data) */ + } else { + rc = g_regex_match_full( + regex, /* Compiled PCRE */ + a->proto_string, /* The data to check for the pattern... */ + (int)strlen(a->proto_string), /* ... and its length */ + 0, /* Start offset within data */ + (GRegexMatchFlags)0, /* GRegexMatchFlags */ + NULL, /* We are not interested in the match information */ + NULL /* We don't want error information */ + ); + } + } + CATCH_ALL { + return FALSE; + } + ENDTRY; + return rc; +} + +void +ftype_register_tvbuff(void) +{ + + static ftype_t protocol_type = { + FT_PROTOCOL, /* ftype */ + "FT_PROTOCOL", /* name */ + "Protocol", /* pretty_name */ + 0, /* wire_size */ + value_new, /* new_value */ + value_free, /* free_value */ + val_from_unparsed, /* val_from_unparsed */ + val_from_string, /* val_from_string */ + val_to_repr, /* val_to_string_repr */ + val_repr_len, /* len_string_repr */ + + NULL, /* set_value_byte_array */ + NULL, /* set_value_bytes */ + NULL, /* set_value_guid */ + NULL, /* set_value_time */ + NULL, /* set_value_string */ + value_set, /* set_value_protocol */ + NULL, /* set_value_uinteger */ + NULL, /* set_value_sinteger */ + NULL, /* set_value_uinteger64 */ + NULL, /* set_value_sinteger64 */ + NULL, /* set_value_floating */ + + value_get, /* get_value */ + NULL, /* get_value_uinteger */ + NULL, /* get_value_sinteger */ + NULL, /* get_value_uinteger64 */ + NULL, /* get_value_sinteger64 */ + NULL, /* get_value_floating */ + + cmp_eq, + cmp_ne, + cmp_gt, + cmp_ge, + cmp_lt, + cmp_le, + NULL, /* cmp_bitwise_and */ + cmp_contains, + CMP_MATCHES, + + len, + slice, + + }; + + + ftype_register(FT_PROTOCOL, &protocol_type); +} + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 8 + * tab-width: 8 + * indent-tabs-mode: t + * End: + * + * vi: set shiftwidth=8 tabstop=8 noexpandtab: + * :indentSize=8:tabSize=8:noTabs=false: + */ diff --git a/epan/ftypes/ftype-string.c b/epan/ftypes/ftype-string.c index 143d481958..f952d01453 100644 --- a/epan/ftypes/ftype-string.c +++ b/epan/ftypes/ftype-string.c @@ -245,7 +245,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -289,7 +289,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -333,7 +333,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -377,7 +377,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-time.c b/epan/ftypes/ftype-time.c index 34e3826246..c36bf14d5c 100644 --- a/epan/ftypes/ftype-time.c +++ b/epan/ftypes/ftype-time.c @@ -400,7 +400,7 @@ ftype_register_time(void) NULL, /* set_value_guid */ time_fvalue_set, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -444,7 +444,7 @@ ftype_register_time(void) NULL, /* set_value_guid */ time_fvalue_set, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-tvbuff.c b/epan/ftypes/ftype-tvbuff.c deleted file mode 100644 index e44dd7f92a..0000000000 --- a/epan/ftypes/ftype-tvbuff.c +++ /dev/null @@ -1,467 +0,0 @@ -/* - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 2001 Gerald Combs - * - * 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 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" - -#include -#include -#include - -#include - -#define CMP_MATCHES cmp_matches - -#define tvb_is_private fvalue_gboolean1 - -static void -value_new(fvalue_t *fv) -{ - fv->value.tvb = NULL; - fv->tvb_is_private = FALSE; -} - -static void -value_free(fvalue_t *fv) -{ - if (fv->value.tvb && fv->tvb_is_private) { - tvb_free_chain(fv->value.tvb); - } -} - -static void -value_set(fvalue_t *fv, tvbuff_t *value) -{ - /* Free up the old value, if we have one */ - value_free(fv); - - fv->value.tvb = value; -} - -static void -free_tvb_data(void *data) -{ - g_free(data); -} - -static gboolean -val_from_string(fvalue_t *fv, const char *s, gchar **err_msg _U_) -{ - tvbuff_t *new_tvb; - guint8 *private_data; - - /* Free up the old value, if we have one */ - value_free(fv); - - /* Make a tvbuff from the string. We can drop the - * terminating NUL. */ - private_data = (guint8 *)g_memdup(s, (guint)strlen(s)); - new_tvb = tvb_new_real_data(private_data, - (guint)strlen(s), (gint)strlen(s)); - - /* Let the tvbuff know how to delete the data. */ - tvb_set_free_cb(new_tvb, free_tvb_data); - - /* And let us know that we need to free the tvbuff */ - fv->tvb_is_private = TRUE; - fv->value.tvb = new_tvb; - return TRUE; -} - -static gboolean -val_from_unparsed(fvalue_t *fv, const char *s, gboolean allow_partial_value _U_, gchar **err_msg) -{ - fvalue_t *fv_bytes; - tvbuff_t *new_tvb; - guint8 *private_data; - - /* Free up the old value, if we have one */ - value_free(fv); - - /* Does this look like a byte string? */ - fv_bytes = fvalue_from_unparsed(FT_BYTES, s, TRUE, NULL); - if (fv_bytes) { - /* Make a tvbuff from the bytes */ - private_data = (guint8 *)g_memdup(fv_bytes->value.bytes->data, - fv_bytes->value.bytes->len); - new_tvb = tvb_new_real_data(private_data, - fv_bytes->value.bytes->len, - fv_bytes->value.bytes->len); - - /* Let the tvbuff know how to delete the data. */ - tvb_set_free_cb(new_tvb, free_tvb_data); - - /* And let us know that we need to free the tvbuff */ - fv->tvb_is_private = TRUE; - fv->value.tvb = new_tvb; - return TRUE; - } - - /* Treat it as a string. */ - return val_from_string(fv, s, err_msg); -} - -static int -val_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display _U_) -{ - volatile guint length = 0; - - if (rtype != FTREPR_DFILTER) return -1; - - TRY { - /* 3 bytes for each byte of the byte "NN:" minus 1 byte - * as there's no trailing ":". */ - length = tvb_captured_length(fv->value.tvb) * 3 - 1; - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return (int) length; -} - -static void -val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char * volatile buf) -{ - guint length; - - g_assert(rtype == FTREPR_DFILTER); - - TRY { - length = tvb_captured_length(fv->value.tvb); - - if (length) - buf = bytes_to_hexstr_punct(buf, tvb_get_ptr(fv->value.tvb, 0, length), length, ':'); - *buf = '\0'; - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; -} - -static gpointer -value_get(fvalue_t *fv) -{ - return fv->value.tvb; -} - -static guint -len(fvalue_t *fv) -{ - volatile guint length = 0; - - TRY { - if (fv->value.tvb) - length = tvb_captured_length(fv->value.tvb); - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return length; -} - -static void -slice(fvalue_t *fv, GByteArray *bytes, guint offset, guint length) -{ - const guint8* data; - - if (fv->value.tvb) { - TRY { - data = tvb_get_ptr(fv->value.tvb, offset, length); - g_byte_array_append(bytes, data, length); - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - } -} - -static gboolean -cmp_eq(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; - volatile gboolean eq = FALSE; - - TRY { - guint a_len = tvb_captured_length(a); - - if (a_len == tvb_captured_length(b)) - eq = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) == 0); - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return eq; -} - -static gboolean -cmp_ne(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; - volatile gboolean ne = TRUE; - - TRY { - guint a_len = tvb_captured_length(a); - - if (a_len == tvb_captured_length(b)) { - ne = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) != 0); - } - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return ne; -} - -static gboolean -cmp_gt(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; - volatile gboolean gt = FALSE; - - TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len > b_len) { - gt = TRUE; - } else if (a_len == b_len) { - gt = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) > 0); - } - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return gt; -} - -static gboolean -cmp_ge(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; - volatile gboolean ge = FALSE; - - TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len > b_len) { - ge = TRUE; - } else if (a_len == b_len) { - ge = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) >= 0); - } - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return ge; -} - -static gboolean -cmp_lt(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; - volatile gboolean lt = FALSE; - - TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len < b_len) { - lt = TRUE; - } else if (a_len == b_len) { - lt = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) < 0); - } - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return lt; -} - -static gboolean -cmp_le(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; - volatile gboolean le = FALSE; - - TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len < b_len) { - le = TRUE; - } else if (a_len == b_len) { - le = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) <= 0); - } - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return le; -} - -static gboolean -cmp_contains(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - volatile gboolean contains = FALSE; - - TRY { - if (tvb_find_tvb(fv_a->value.tvb, fv_b->value.tvb, 0) > -1) { - contains = TRUE; - } - } - CATCH_ALL { - /* nothing */ - } - ENDTRY; - - return contains; -} - -static gboolean -cmp_matches(const fvalue_t *fv_a, const fvalue_t *fv_b) -{ - tvbuff_t *tvb = fv_a->value.tvb; - GRegex *regex = fv_b->value.re; - volatile gboolean rc = FALSE; - const char *data = NULL; /* tvb data */ - guint32 tvb_len; /* tvb length */ - - /* fv_b is always a FT_PCRE, otherwise the dfilter semcheck() would have - * warned us. For the same reason (and because we're using g_malloc()), - * fv_b->value.re is not NULL. - */ - if (strcmp(fv_b->ftype->name, "FT_PCRE") != 0) { - return FALSE; - } - if (! regex) { - return FALSE; - } - TRY { - tvb_len = tvb_captured_length(tvb); - data = (const char *)tvb_get_ptr(tvb, 0, tvb_len); - rc = g_regex_match_full( - regex, /* Compiled PCRE */ - data, /* The data to check for the pattern... */ - tvb_len, /* ... and its length */ - 0, /* Start offset within data */ - (GRegexMatchFlags)0, /* GRegexMatchFlags */ - NULL, /* We are not interested in the match information */ - NULL /* We don't want error information */ - ); - /* NOTE - DO NOT g_free(data) */ - } - CATCH_ALL { - return FALSE; - } - ENDTRY; - return rc; -} - -void -ftype_register_tvbuff(void) -{ - - static ftype_t protocol_type = { - FT_PROTOCOL, /* ftype */ - "FT_PROTOCOL", /* name */ - "Protocol", /* pretty_name */ - 0, /* wire_size */ - value_new, /* new_value */ - value_free, /* free_value */ - val_from_unparsed, /* val_from_unparsed */ - val_from_string, /* val_from_string */ - val_to_repr, /* val_to_string_repr */ - val_repr_len, /* len_string_repr */ - - NULL, /* set_value_byte_array */ - NULL, /* set_value_bytes */ - NULL, /* set_value_guid */ - NULL, /* set_value_time */ - NULL, /* set_value_string */ - value_set, /* set_value_tvbuff */ - NULL, /* set_value_uinteger */ - NULL, /* set_value_sinteger */ - NULL, /* set_value_uinteger64 */ - NULL, /* set_value_sinteger64 */ - NULL, /* set_value_floating */ - - value_get, /* get_value */ - NULL, /* get_value_uinteger */ - NULL, /* get_value_sinteger */ - NULL, /* get_value_uinteger64 */ - NULL, /* get_value_sinteger64 */ - NULL, /* get_value_floating */ - - cmp_eq, - cmp_ne, - cmp_gt, - cmp_ge, - cmp_lt, - cmp_le, - NULL, /* cmp_bitwise_and */ - cmp_contains, - CMP_MATCHES, - - len, - slice, - - }; - - - ftype_register(FT_PROTOCOL, &protocol_type); -} - -/* - * Editor modelines - http://www.wireshark.org/tools/modelines.html - * - * Local variables: - * c-basic-offset: 8 - * tab-width: 8 - * indent-tabs-mode: t - * End: - * - * vi: set shiftwidth=8 tabstop=8 noexpandtab: - * :indentSize=8:tabSize=8:noTabs=false: - */ diff --git a/epan/ftypes/ftypes-int.h b/epan/ftypes/ftypes-int.h index 9fba4f1c55..fc35fee8f1 100644 --- a/epan/ftypes/ftypes-int.h +++ b/epan/ftypes/ftypes-int.h @@ -59,7 +59,7 @@ typedef void (*FvalueSetBytesFunc)(fvalue_t*, const guint8 *); typedef void (*FvalueSetGuidFunc)(fvalue_t*, const e_guid_t *); typedef void (*FvalueSetTimeFunc)(fvalue_t*, const nstime_t *); typedef void (*FvalueSetStringFunc)(fvalue_t*, const gchar *value); -typedef void (*FvalueSetTvbuffFunc)(fvalue_t*, tvbuff_t *value); +typedef void (*FvalueSetProtocolFunc)(fvalue_t*, tvbuff_t *value, const gchar *name); typedef void (*FvalueSetUnsignedIntegerFunc)(fvalue_t*, guint32); typedef void (*FvalueSetSignedIntegerFunc)(fvalue_t*, gint32); typedef void (*FvalueSetUnsignedInteger64Func)(fvalue_t*, guint64); @@ -96,7 +96,7 @@ struct _ftype_t { FvalueSetGuidFunc set_value_guid; FvalueSetTimeFunc set_value_time; FvalueSetStringFunc set_value_string; - FvalueSetTvbuffFunc set_value_tvbuff; + FvalueSetProtocolFunc set_value_protocol; FvalueSetUnsignedIntegerFunc set_value_uinteger; FvalueSetSignedIntegerFunc set_value_sinteger; FvalueSetUnsignedInteger64Func set_value_uinteger64; diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c index 6f26f7249d..5425dbcdbe 100644 --- a/epan/ftypes/ftypes.c +++ b/epan/ftypes/ftypes.c @@ -531,10 +531,10 @@ fvalue_set_string(fvalue_t *fv, const gchar *value) } void -fvalue_set_tvbuff(fvalue_t *fv, tvbuff_t *value) +fvalue_set_protocol(fvalue_t *fv, tvbuff_t *value, const gchar *name) { - g_assert(fv->ftype->set_value_tvbuff); - fv->ftype->set_value_tvbuff(fv, value); + g_assert(fv->ftype->set_value_protocol); + fv->ftype->set_value_protocol(fv, value, name); } void diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h index 92bc68f83f..0a29022f6f 100644 --- a/epan/ftypes/ftypes.h +++ b/epan/ftypes/ftypes.h @@ -197,6 +197,12 @@ ftype_can_matches(enum ftenum ftype); #include #include +typedef struct _protocol_value_t +{ + tvbuff_t *tvb; + gchar *proto_string; +} protocol_value_t; + typedef struct _fvalue_t { ftype_t *ftype; union { @@ -214,7 +220,7 @@ typedef struct _fvalue_t { ipv6_addr_and_prefix ipv6; e_guid_t guid; nstime_t time; - tvbuff_t *tvb; + protocol_value_t protocol; GRegex *re; guint16 sfloat_ieee_11073; guint32 float_ieee_11073; @@ -287,7 +293,7 @@ void fvalue_set_string(fvalue_t *fv, const gchar *value); void -fvalue_set_tvbuff(fvalue_t *fv, tvbuff_t *value); +fvalue_set_protocol(fvalue_t *fv, tvbuff_t *value, const gchar *name); void fvalue_set_uinteger(fvalue_t *fv, guint32 value); -- cgit v1.2.3