aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/ftypes/.editorconfig2
-rw-r--r--epan/ftypes/CMakeLists.txt2
-rw-r--r--epan/ftypes/Makefile.common4
-rw-r--r--epan/ftypes/ftype-bytes.c18
-rw-r--r--epan/ftypes/ftype-double.c4
-rw-r--r--epan/ftypes/ftype-guid.c2
-rw-r--r--epan/ftypes/ftype-ieee-11073-float.c4
-rw-r--r--epan/ftypes/ftype-integer.c40
-rw-r--r--epan/ftypes/ftype-ipv4.c2
-rw-r--r--epan/ftypes/ftype-ipv6.c2
-rw-r--r--epan/ftypes/ftype-none.c2
-rw-r--r--epan/ftypes/ftype-pcre.c2
-rw-r--r--epan/ftypes/ftype-protocol.c (renamed from epan/ftypes/ftype-tvbuff.c)192
-rw-r--r--epan/ftypes/ftype-string.c8
-rw-r--r--epan/ftypes/ftype-time.c4
-rw-r--r--epan/ftypes/ftypes-int.h4
-rw-r--r--epan/ftypes/ftypes.c6
-rw-r--r--epan/ftypes/ftypes.h10
-rw-r--r--epan/proto.c15
19 files changed, 191 insertions, 132 deletions
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-tvbuff.c b/epan/ftypes/ftype-protocol.c
index e44dd7f92a..35c449a701 100644
--- a/epan/ftypes/ftype-tvbuff.c
+++ b/epan/ftypes/ftype-protocol.c
@@ -33,25 +33,28 @@
static void
value_new(fvalue_t *fv)
{
- fv->value.tvb = NULL;
+ 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.tvb && fv->tvb_is_private) {
- tvb_free_chain(fv->value.tvb);
+ 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)
+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.tvb = value;
+ fv->value.protocol.tvb = value;
+ fv->value.protocol.proto_string = g_strdup(name);
}
static void
@@ -80,7 +83,8 @@ val_from_string(fvalue_t *fv, const char *s, gchar **err_msg _U_)
/* And let us know that we need to free the tvbuff */
fv->tvb_is_private = TRUE;
- fv->value.tvb = new_tvb;
+ fv->value.protocol.tvb = new_tvb;
+ fv->value.protocol.proto_string = g_strdup(s);
return TRUE;
}
@@ -109,7 +113,7 @@ val_from_unparsed(fvalue_t *fv, const char *s, gboolean allow_partial_value _U_,
/* And let us know that we need to free the tvbuff */
fv->tvb_is_private = TRUE;
- fv->value.tvb = new_tvb;
+ fv->value.protocol.tvb = new_tvb;
return TRUE;
}
@@ -127,7 +131,7 @@ val_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display _U_)
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;
+ length = tvb_captured_length(fv->value.protocol.tvb) * 3 - 1;
}
CATCH_ALL {
/* nothing */
@@ -145,10 +149,10 @@ val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char * volatile
g_assert(rtype == FTREPR_DFILTER);
TRY {
- length = tvb_captured_length(fv->value.tvb);
+ length = tvb_captured_length(fv->value.protocol.tvb);
if (length)
- buf = bytes_to_hexstr_punct(buf, tvb_get_ptr(fv->value.tvb, 0, length), length, ':');
+ buf = bytes_to_hexstr_punct(buf, tvb_get_ptr(fv->value.protocol.tvb, 0, length), length, ':');
*buf = '\0';
}
CATCH_ALL {
@@ -160,7 +164,7 @@ val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char * volatile
static gpointer
value_get(fvalue_t *fv)
{
- return fv->value.tvb;
+ return fv->value.protocol.tvb;
}
static guint
@@ -169,8 +173,8 @@ len(fvalue_t *fv)
volatile guint length = 0;
TRY {
- if (fv->value.tvb)
- length = tvb_captured_length(fv->value.tvb);
+ if (fv->value.protocol.tvb)
+ length = tvb_captured_length(fv->value.protocol.tvb);
}
CATCH_ALL {
/* nothing */
@@ -185,9 +189,9 @@ slice(fvalue_t *fv, GByteArray *bytes, guint offset, guint length)
{
const guint8* data;
- if (fv->value.tvb) {
+ if (fv->value.protocol.tvb) {
TRY {
- data = tvb_get_ptr(fv->value.tvb, offset, length);
+ data = tvb_get_ptr(fv->value.protocol.tvb, offset, length);
g_byte_array_append(bytes, data, length);
}
CATCH_ALL {
@@ -201,15 +205,19 @@ slice(fvalue_t *fv, GByteArray *bytes, guint offset, guint length)
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;
+ 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 {
- guint a_len = tvb_captured_length(a);
+ if ((a->tvb != NULL) && (b->tvb != NULL)) {
+ guint a_len = tvb_captured_length(a->tvb);
- 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);
+ 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 */
@@ -222,15 +230,18 @@ cmp_eq(const fvalue_t *fv_a, const fvalue_t *fv_b)
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;
+ 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 {
- guint a_len = tvb_captured_length(a);
+ if ((a->tvb != NULL) && (b->tvb != NULL)) {
+ guint a_len = tvb_captured_length(a->tvb);
- 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);
+ 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 {
@@ -244,18 +255,22 @@ cmp_ne(const fvalue_t *fv_a, const fvalue_t *fv_b)
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;
+ 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 {
- 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);
+ 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 {
@@ -269,18 +284,22 @@ cmp_gt(const fvalue_t *fv_a, const fvalue_t *fv_b)
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;
+ 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 {
- 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);
+ 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 {
@@ -294,18 +313,22 @@ cmp_ge(const fvalue_t *fv_a, const fvalue_t *fv_b)
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;
+ 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 {
- 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);
+ 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 {
@@ -319,18 +342,22 @@ cmp_lt(const fvalue_t *fv_a, const fvalue_t *fv_b)
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;
+ 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 {
- 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);
+ 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 {
@@ -344,11 +371,20 @@ cmp_le(const fvalue_t *fv_a, const fvalue_t *fv_b)
static gboolean
cmp_contains(const fvalue_t *fv_a, const fvalue_t *fv_b)
{
- volatile gboolean contains = FALSE;
+ volatile gboolean contains = FALSE;
TRY {
- if (tvb_find_tvb(fv_a->value.tvb, fv_b->value.tvb, 0) > -1) {
- contains = TRUE;
+ /* 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 {
@@ -362,7 +398,7 @@ cmp_contains(const fvalue_t *fv_a, const fvalue_t *fv_b)
static gboolean
cmp_matches(const fvalue_t *fv_a, const fvalue_t *fv_b)
{
- tvbuff_t *tvb = fv_a->value.tvb;
+ 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 */
@@ -379,18 +415,30 @@ cmp_matches(const fvalue_t *fv_a, const fvalue_t *fv_b)
return FALSE;
}
TRY {
- tvb_len = tvb_captured_length(tvb);
- data = (const char *)tvb_get_ptr(tvb, 0, tvb_len);
- rc = g_regex_match_full(
+ 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 */
- data, /* The data to check for the pattern... */
- tvb_len, /* ... and its length */
+ 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 */
);
- /* NOTE - DO NOT g_free(data) */
+ }
}
CATCH_ALL {
return FALSE;
@@ -420,7 +468,7 @@ ftype_register_tvbuff(void)
NULL, /* set_value_guid */
NULL, /* set_value_time */
NULL, /* set_value_string */
- value_set, /* set_value_tvbuff */
+ value_set, /* set_value_protocol */
NULL, /* set_value_uinteger */
NULL, /* set_value_sinteger */
NULL, /* set_value_uinteger64 */
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/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 <wsutil/nstime.h>
#include <epan/dfilter/drange.h>
+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);
diff --git a/epan/proto.c b/epan/proto.c
index 2a1d142b57..e2038c7bb5 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -215,7 +215,7 @@ static void
proto_tree_set_representation(proto_item *pi, const char *format, va_list ap);
static void
-proto_tree_set_protocol_tvb(field_info *fi, tvbuff_t *tvb);
+proto_tree_set_protocol_tvb(field_info *fi, tvbuff_t *tvb, const char* field_data);
static void
proto_tree_set_bytes(field_info *fi, const guint8* start_ptr, gint length);
static void
@@ -1831,7 +1831,7 @@ proto_tree_new_item(field_info *new_fi, proto_tree *tree,
break;
case FT_PROTOCOL:
- proto_tree_set_protocol_tvb(new_fi, tvb);
+ proto_tree_set_protocol_tvb(new_fi, tvb, new_fi->hfinfo->name);
break;
case FT_BYTES:
@@ -2803,9 +2803,9 @@ ptvcursor_advance(ptvcursor_t* ptvc, gint length)
static void
-proto_tree_set_protocol_tvb(field_info *fi, tvbuff_t *tvb)
+proto_tree_set_protocol_tvb(field_info *fi, tvbuff_t *tvb, const char* field_data)
{
- fvalue_set_tvbuff(&fi->value, tvb);
+ fvalue_set_protocol(&fi->value, tvb, field_data);
}
/* Add a FT_PROTOCOL to a proto_tree */
@@ -2816,6 +2816,7 @@ proto_tree_add_protocol_format(proto_tree *tree, int hfindex, tvbuff_t *tvb,
proto_item *pi;
va_list ap;
header_field_info *hfinfo;
+ gchar* protocol_rep;
CHECK_FOR_NULL_TREE(tree);
@@ -2825,7 +2826,11 @@ proto_tree_add_protocol_format(proto_tree *tree, int hfindex, tvbuff_t *tvb,
pi = proto_tree_add_pi(tree, hfinfo, tvb, start, &length);
- proto_tree_set_protocol_tvb(PNODE_FINFO(pi), (start == 0 ? tvb : tvb_new_subset_length(tvb, start, length)));
+ va_start(ap, format);
+ protocol_rep = g_strdup_vprintf(format, ap);
+ proto_tree_set_protocol_tvb(PNODE_FINFO(pi), (start == 0 ? tvb : tvb_new_subset_length(tvb, start, length)), protocol_rep);
+ g_free(protocol_rep);
+ va_end(ap);
TRY_TO_FAKE_THIS_REPR(pi);