Enable FT_BYTES dfiltering, from Ed Warnicke.
authorgram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 22 Dec 2000 12:05:38 +0000 (12:05 +0000)
committergram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 22 Dec 2000 12:05:38 +0000 (12:05 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@2768 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dfilter-grammar.y
epan/dfilter-int.h
epan/dfilter.c
epan/strutil.c
epan/strutil.h
gtk/main.c

index 61e1775f7e5fbfcafc7ab4e23cf8cd4745f1069e..757798c8ecd3079b7f837ba222ae62e9a8ff5af5 100644 (file)
@@ -1,9 +1,8 @@
 %{
-
 /* dfilter-grammar.y
  * Parser for display filters
  *
- * $Id: dfilter-grammar.y,v 1.1 2000/09/27 04:54:47 gram Exp $
+ * $Id: dfilter-grammar.y,v 1.2 2000/12/22 12:05:36 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -92,7 +91,7 @@ static GNode* dfilter_mknode_ipv6_value(char *host);
 static GNode* dfilter_mknode_ipv6_variable(gint id);
 static GNode* dfilter_mknode_existence(gint id);
 static GNode* dfilter_mknode_bytes_value(GByteArray *barray);
-static GNode* dfilter_mknode_bytes_variable(gint id, gint offset, guint length);
+static GNode* dfilter_mknode_bytes_variable(gint id, gint offset, guint length, gboolean to_the_end);
 static GNode* dfilter_mknode_string_value(char *s);
 static GNode* dfilter_mknode_string_variable(gint id);
 
@@ -549,11 +548,22 @@ ipv6_variable:            T_FT_IPv6       { $$ = dfilter_mknode_ipv6_variable($1.id); }
 string_variable:       T_FT_STRING     { $$ = dfilter_mknode_string_variable($1.id); }
        ;
 
+bytes_variable:                T_FT_BYTES T_VAL_BYTE_RANGE
+               {
+                       $$ = dfilter_mknode_bytes_variable($1.id, $2.offset, $2.length, FALSE);
+               }
+
+        |               T_FT_BYTES      
+                {
+                       $$ = dfilter_mknode_bytes_variable($1.id, 0, 0, TRUE);
+               }
+
+       ;
+
 variable_name:         any_variable_type
-       {
+                {
                GNode   *variable;
                GNode   *value;
-
                if ($1.type == T_FT_BOOLEAN) {
                        /* Make "variable == TRUE" for BOOLEAN variable */
                        variable = dfilter_mknode_numeric_variable($1.id);
@@ -566,12 +576,6 @@ variable_name:             any_variable_type
        }
        ;
 
-bytes_variable:                any_variable_type T_VAL_BYTE_RANGE
-               {
-                       $$ = dfilter_mknode_bytes_variable($1.id, $2.offset, $2.length);
-               }
-       ;
-
 any_variable_type:     T_FT_UINT8      { $$ = $1; }
        |               T_FT_UINT16     { $$ = $1; }
        |               T_FT_UINT24     { $$ = $1; }
@@ -788,7 +792,7 @@ dfilter_mknode_string_variable(gint id)
 }
 
 static GNode*
-dfilter_mknode_bytes_variable(gint id, gint offset, guint length)
+dfilter_mknode_bytes_variable(gint id, gint offset, guint length, gboolean to_the_end)
 {
        dfilter_node    *node;
        GNode           *gnode;
@@ -802,6 +806,7 @@ dfilter_mknode_bytes_variable(gint id, gint offset, guint length)
        node->value.variable = id;
        node->offset = offset;
        node->length = length;
+       node->to_the_end = to_the_end;
        gnode = g_node_new(node);
 
        return gnode;
index 207584e49c95230d64cb5d01290cb2263eb78ec7..c50462440d4e1bdda42366ba25430a746fd07093 100644 (file)
@@ -2,7 +2,7 @@
  * Definitions for routines common to multiple modules in the display
  * filter code, but not used outside that code.
  *
- * $Id: dfilter-int.h,v 1.1 2000/09/27 04:54:48 gram Exp $
+ * $Id: dfilter-int.h,v 1.2 2000/12/22 12:05:36 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -137,6 +137,9 @@ typedef struct dfilter_node {
        /* used for byte-ranges */
        gint                            offset;
        guint                           length;
+
+        /* used to indicate range should go to end of sequence */
+        gboolean                        to_the_end;
 } dfilter_node;
 
 /* lookup an abbreviation in our token hash, returing the ID # */
index 9911fd600c44f7a6a6116733b055321745c03a8d..378c109d9b7b345672d69a44965ccba5b425d20f 100644 (file)
@@ -1,7 +1,7 @@
 /* dfilter.c
  * Routines for display filters
  *
- * $Id: dfilter.c,v 1.2 2000/09/28 03:16:15 gram Exp $
+ * $Id: dfilter.c,v 1.3 2000/12/22 12:05:36 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -57,6 +57,7 @@ static int g_strcmp(gconstpointer a, gconstpointer b);
 /* Silly global variables used to pass parameter to check_relation_bytes() */
 int bytes_offset = 0;
 int bytes_length = 0;
+gboolean bytes_to_the_end = FALSE;
 
 YYSTYPE yylval;
 
@@ -431,8 +432,6 @@ check_relation(gint operand, GNode *a, GNode *b, proto_tree *ptree, const guint8
        gboolean        retval;
 
 
-       bytes_length = MIN(node_a->length, node_b->length);
-       bytes_offset = MIN(node_a->offset, node_b->offset);
        if (node_a->ntype == variable)
                vals_a = get_values_from_ptree(node_a, ptree, pd);
        else
@@ -482,6 +481,14 @@ get_values_from_ptree(dfilter_node *dnode, proto_tree *ptree, const guint8 *pd)
        g_assert(dnode->elem_size > 0);
        result_array = g_array_new(FALSE, FALSE, dnode->elem_size);
 
+       /* Set bytes_offset, bytes_length, and bytes_to_the_end 
+        * for this dnode
+        */
+
+       bytes_offset = dnode->offset;
+       bytes_length = dnode->length;
+       bytes_to_the_end = dnode->to_the_end;
+
        /* Cull the finfos from the proto_tree */
        finfo_array = proto_get_finfo_ptr_array(ptree, dnode->value.variable);
        if (!finfo_array) {
@@ -544,7 +551,7 @@ void
 fill_array_bytes_variable(field_info *finfo, GArray *array, const guint8 *pd)
 {
        GByteArray              *barray;
-       guint                   read_start, pkt_end;
+       guint                   read_start, pkt_end, read_len;
 
        if (bytes_offset < 0) {
                /* Handle negative byte offsets */
@@ -561,14 +568,19 @@ fill_array_bytes_variable(field_info *finfo, GArray *array, const guint8 *pd)
 
        pkt_end = finfo->start + finfo->length;
        read_start = finfo->start + bytes_offset;
-
+       if(bytes_to_the_end){
+               read_len = pkt_end - read_start;;
+       }
+       else {
+               read_len = bytes_length;
+       }
        /* Check to make sure entire length requested is inside field */
-       if (pkt_end < read_start + bytes_length) {
+       if (pkt_end < read_start + read_len) {
                return;
        }
 
        barray = g_byte_array_new();
-       g_byte_array_append(barray, pd + read_start, bytes_length);
+       g_byte_array_append(barray, pd + read_start, read_len);
        g_array_append_val(array, barray);
 }
 
@@ -980,7 +992,8 @@ gboolean check_relation_bytes(gint operand, GArray *a, GArray *b)
                        ptr_a = g_array_index(a, GByteArray*, i);
                        for (j = 0; j < len_b; j++) {
                                ptr_b = g_array_index(b, GByteArray*, j);
-                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) == 0)
+                               if(ptr_a->len != ptr_b->len)
+                                       return FALSE;                                                          if (memcmp(ptr_a->data, ptr_b->data, ptr_a->len) == 0)
                                        return TRUE;
                        }
                }
@@ -991,7 +1004,9 @@ gboolean check_relation_bytes(gint operand, GArray *a, GArray *b)
                        ptr_a = g_array_index(a, GByteArray*, i);
                        for (j = 0; j < len_b; j++) {
                                ptr_b = g_array_index(b, GByteArray*, j);
-                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) != 0)
+                               if(ptr_a->len != ptr_b->len)
+                                       return TRUE;
+                               if (memcmp(ptr_a->data, ptr_b->data, ptr_a->len) != 0)
                                        return TRUE;
                        }
                }
@@ -1002,7 +1017,11 @@ gboolean check_relation_bytes(gint operand, GArray *a, GArray *b)
                        ptr_a = g_array_index(a, GByteArray*, i);
                        for (j = 0; j < len_b; j++) {
                                ptr_b = g_array_index(b, GByteArray*, j);
-                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) > 0)
+                               if(ptr_a->len > ptr_b->len)
+                                       return TRUE;
+                               if(ptr_a->len < ptr_b->len)
+                                       return FALSE;
+                               if (memcmp(ptr_a->data, ptr_b->data, ptr_a->len) > 0)
                                        return TRUE;
                        }
                }
@@ -1013,7 +1032,11 @@ gboolean check_relation_bytes(gint operand, GArray *a, GArray *b)
                        ptr_a = g_array_index(a, GByteArray*, i);
                        for (j = 0; j < len_b; j++) {
                                ptr_b = g_array_index(b, GByteArray*, j);
-                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) < 0)
+                               if(ptr_a->len < ptr_b->len)
+                                       return TRUE;
+                               if(ptr_a->len > ptr_b->len)
+                                       return FALSE;
+                               if (memcmp(ptr_a->data, ptr_b->data, ptr_a->len) < 0)
                                        return TRUE;
                        }
                }
index 8c73202dd9aa4cc78595ff60d652db7b683f0f7f..9886240ff462fa4cfa80870d80dc7f4419a927af 100644 (file)
@@ -1,7 +1,7 @@
 /* strutil.c
  * String utility routines
  *
- * $Id: strutil.c,v 1.6 2000/11/13 07:19:32 guy Exp $
+ * $Id: strutil.c,v 1.7 2000/12/22 12:05:36 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -246,6 +246,14 @@ format_text(const u_char *string, int len)
 #define        N_BYTES_TO_STR_STRINGS  6
 gchar *
 bytes_to_str(const guint8 *bd, int bd_len) {
+  return bytes_to_str_punct(bd,bd_len,'\0');
+}
+
+/* Turn an array of bytes into a string showing the bytes in hex with 
+ * punct as a bytes separator.
+ */
+gchar *
+bytes_to_str_punct(const guint8 *bd, int bd_len, gchar punct) {
   static gchar  str[N_BYTES_TO_STR_STRINGS][MAX_BYTE_STR_LEN+3+1];
   static int    cur_idx;
   gchar        *cur;
@@ -266,6 +274,10 @@ bytes_to_str(const guint8 *bd, int bd_len) {
     len -= 2;
     bd++;
     bd_len--;
+    if(punct && bd_len > 0){
+      *p++ = punct;
+      len--;
+    }
   }
   if (bd_len != 0) {
     /* Note that we're not showing the full string.  */
index 652f07e0f75e115fafc69dcc943be2a5774be772..6b3599c9db3f78a536f5a43a54a9a8a266011cca 100644 (file)
@@ -1,7 +1,7 @@
 /* strutil.h
  * String utility definitions
  *
- * $Id: strutil.h,v 1.5 2000/11/13 07:19:33 guy Exp $
+ * $Id: strutil.h,v 1.6 2000/12/22 12:05:36 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -42,5 +42,5 @@ int        get_token_len(const u_char *linep, const u_char *lineend,
     const u_char **next_token);
 gchar*     format_text(const u_char *line, int len);
 gchar*     bytes_to_str(const guint8 *, int);
-
+gchar*     bytes_to_str_punct(const guint8 *, int, gchar punct);
 #endif /* __STRUTIL_H__ */
index 1238f0bd6d39d31e8662a6997d740581158c501e..6f84aee1774d28e202724ca95eed136d6eb7cfec 100644 (file)
@@ -1,6 +1,6 @@
 /* main.c
  *
- * $Id: main.c,v 1.168 2000/12/15 13:53:11 gram Exp $
+ * $Id: main.c,v 1.169 2000/12/22 12:05:38 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "gtkglobals.h"
 #include "plugins.h"
 #include "colors.h"
+#include "strutil.h"
 
 packet_info  pi;
 capture_file cfile;
@@ -265,6 +266,14 @@ match_selected_cb(GtkWidget *w, gpointer data)
                                 finfo_selected->value.string);
                        break;
 
+               case FT_BYTES:
+                       dfilter_len = finfo_selected->length*3 - 1;
+                       dfilter_len += abbrev_len + 7;
+                       buf = g_malloc0(dfilter_len);
+                       snprintf(buf, dfilter_len, "%s == %s",
+                                hfinfo->abbrev,
+                                bytes_to_str_punct(finfo_selected->value.bytes, finfo_selected->length,':'));
+                       break;                       
                default:
                    c = cfile.pd + finfo_selected->start;
                    buf = g_malloc0(32 + finfo_selected->length * 3);