forked from osmocom/wireshark
Fixed the byte_range implementation, and removed some of the C-style
operators that I had thrown in at the last moment. Sorry! But I'm trying to get rid of those embarrassing shift/reduce and reduce/reduce warnings. I also removed wiretap/wiretap.c, which is no longer needed. svn path=/trunk/; revision=345
This commit is contained in:
parent
856e356a7a
commit
56c0587491
|
@ -39,7 +39,6 @@
|
|||
#endif
|
||||
|
||||
void dfilter_yacc_init(void);
|
||||
static void dfilter_print_parse_tree(GNode *gnode);
|
||||
static GNode* dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2);
|
||||
static GNode* dfilter_mknode_unary(int operand, GNode *n2);
|
||||
static GNode* dfilter_mknode_numeric_variable(gint id);
|
||||
|
@ -210,7 +209,11 @@ relation: numeric_variable numeric_relation numeric_value
|
|||
;
|
||||
|
||||
|
||||
numeric_value: T_VAL_ID { $$ = dfilter_mknode_numeric_value(string_to_value($1)); }
|
||||
numeric_value: T_VAL_ID
|
||||
{
|
||||
$$ = dfilter_mknode_numeric_value(string_to_value($1));
|
||||
g_free($1);
|
||||
}
|
||||
;
|
||||
|
||||
ether_value: T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID
|
||||
|
@ -225,10 +228,25 @@ ether_value: T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_
|
|||
}
|
||||
;
|
||||
|
||||
ipv4_value: T_VAL_ID { $$ = dfilter_mknode_ipv4_value($1); }
|
||||
ipv4_value: T_VAL_ID
|
||||
{
|
||||
$$ = dfilter_mknode_ipv4_value($1);
|
||||
g_free($1);
|
||||
}
|
||||
;
|
||||
|
||||
bytes_value: numeric_variable
|
||||
bytes_value: T_VAL_ID
|
||||
{
|
||||
GByteArray *barray = g_byte_array_new();
|
||||
guint8 val;
|
||||
char *endptr;
|
||||
|
||||
dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray);
|
||||
val = (guint8) strtoul($1, &endptr, 16);
|
||||
g_byte_array_append(barray, &val, 1);
|
||||
$$ = dfilter_mknode_bytes_value(barray);
|
||||
g_free($1);
|
||||
}
|
||||
| byte_range { $$ = dfilter_mknode_bytes_value($1); }
|
||||
;
|
||||
|
||||
|
@ -243,6 +261,8 @@ byte_range: T_VAL_ID ':' T_VAL_ID
|
|||
g_byte_array_append(barray, &val, 1);
|
||||
val = (guint8) strtoul($3, &endptr, 16);
|
||||
$$ = g_byte_array_append(barray, &val, 1);
|
||||
g_free($1);
|
||||
g_free($3);
|
||||
}
|
||||
|
||||
| byte_range ':' T_VAL_ID
|
||||
|
@ -252,6 +272,7 @@ byte_range: T_VAL_ID ':' T_VAL_ID
|
|||
|
||||
val = (guint8) strtoul($3, &endptr, 16);
|
||||
$$ = g_byte_array_append($1, &val, 1);
|
||||
g_free($3);
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -277,10 +298,13 @@ protocol_name: T_FT_NONE { $$ = dfilter_mknode_existence($1); }
|
|||
bytes_variable: any_variable_type '[' T_VAL_ID ':' T_VAL_ID ']'
|
||||
{
|
||||
$$ = dfilter_mknode_bytes_variable($1, string_to_value($3), string_to_value($5));
|
||||
g_free($3);
|
||||
g_free($5);
|
||||
}
|
||||
| any_variable_type '[' T_VAL_ID ']'
|
||||
{
|
||||
$$ = dfilter_mknode_bytes_variable($1, string_to_value($3), 0);
|
||||
$$ = dfilter_mknode_bytes_variable($1, string_to_value($3), 1);
|
||||
g_free($3);
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -334,19 +358,15 @@ type_ne: TOK_NE { $$ = $1; }
|
|||
;
|
||||
|
||||
type_gt: TOK_GT { $$ = $1; }
|
||||
| '>' { $$ = TOK_GT; }
|
||||
;
|
||||
|
||||
type_ge: TOK_GE { $$ = $1; }
|
||||
| '>' '=' { $$ = TOK_GE; }
|
||||
;
|
||||
|
||||
type_lt: TOK_LT { $$ = $1; }
|
||||
| '<' { $$ = TOK_LT; }
|
||||
;
|
||||
|
||||
type_le: TOK_LE { $$ = $1; }
|
||||
| '<' '=' { $$ = TOK_LE; }
|
||||
;
|
||||
|
||||
|
||||
|
|
|
@ -1,310 +0,0 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <glib.h>
|
||||
#include "config.h"
|
||||
#include "wtap.h"
|
||||
#include "bpf-engine.h"
|
||||
|
||||
#ifdef HAVE_GLIB10
|
||||
#include "glib-new.h"
|
||||
#endif
|
||||
|
||||
void bpf_dump(wtap *wth);
|
||||
char *bpf_image(struct bpf_instruction *p, int n);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
wtap *wth;
|
||||
char *fsyntax;
|
||||
int i;
|
||||
|
||||
if (argc <= 1) {
|
||||
fprintf(stderr, "usage: wiretap filter\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
fsyntax = g_strdup(argv[1]);
|
||||
|
||||
for (i = 2; i < argc; i++) {
|
||||
fsyntax = g_strjoin(" ", fsyntax, argv[i], NULL);
|
||||
}
|
||||
wth = (wtap*)g_malloc(sizeof(wtap));
|
||||
|
||||
/* initialization */
|
||||
wth->file_encap = WTAP_ENCAP_NONE;
|
||||
wth->filter.offline = NULL;
|
||||
wth->filter_type = WTAP_FILTER_NONE;
|
||||
wth->filter_length = 0;
|
||||
wth->offline_filter_lengths = NULL;
|
||||
|
||||
wtap_offline_filter(wth, fsyntax);
|
||||
bpf_dump(wth);
|
||||
|
||||
g_free(wth);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
bpf_dump(wtap *wth)
|
||||
{
|
||||
struct bpf_instruction *fentry;
|
||||
int flen;
|
||||
int i;
|
||||
|
||||
fentry = wth->filter.offline[WTAP_ENCAP_ETHERNET];
|
||||
flen = wth->offline_filter_lengths[WTAP_ENCAP_ETHERNET];
|
||||
|
||||
/* this loop is from tcpdump's bpf_dump.c */
|
||||
for (i = 0; i < flen; ++fentry, ++i) {
|
||||
puts(bpf_image(fentry, i));
|
||||
}
|
||||
}
|
||||
|
||||
/* this entire function is from libpcap's bpf_image.c */
|
||||
char *
|
||||
bpf_image(struct bpf_instruction *p, int n)
|
||||
{
|
||||
int v;
|
||||
char *fmt, *op;
|
||||
static char image[256];
|
||||
char operand[64];
|
||||
|
||||
v = p->k;
|
||||
switch (p->code) {
|
||||
|
||||
default:
|
||||
op = "unimp";
|
||||
fmt = "0x%x";
|
||||
v = p->code;
|
||||
break;
|
||||
|
||||
case BPF_RET|BPF_K:
|
||||
op = "ret";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_RET|BPF_A:
|
||||
op = "ret";
|
||||
fmt = "";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_W|BPF_ABS:
|
||||
op = "ld";
|
||||
fmt = "[%d]";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_H|BPF_ABS:
|
||||
op = "ldh";
|
||||
fmt = "[%d]";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_B|BPF_ABS:
|
||||
op = "ldb";
|
||||
fmt = "[%d]";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_W|BPF_LEN:
|
||||
op = "ld";
|
||||
fmt = "#pktlen";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_W|BPF_IND:
|
||||
op = "ld";
|
||||
fmt = "[x + %d]";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_H|BPF_IND:
|
||||
op = "ldh";
|
||||
fmt = "[x + %d]";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_B|BPF_IND:
|
||||
op = "ldb";
|
||||
fmt = "[x + %d]";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_IMM:
|
||||
op = "ld";
|
||||
fmt = "#0x%x";
|
||||
break;
|
||||
|
||||
case BPF_LDX|BPF_IMM:
|
||||
op = "ldx";
|
||||
fmt = "#0x%x";
|
||||
break;
|
||||
|
||||
case BPF_LDX|BPF_MSH|BPF_B:
|
||||
op = "ldxb";
|
||||
fmt = "4*([%d]&0xf)";
|
||||
break;
|
||||
|
||||
case BPF_LD|BPF_MEM:
|
||||
op = "ld";
|
||||
fmt = "M[%d]";
|
||||
break;
|
||||
|
||||
case BPF_LDX|BPF_MEM:
|
||||
op = "ldx";
|
||||
fmt = "M[%d]";
|
||||
break;
|
||||
|
||||
case BPF_ST:
|
||||
op = "st";
|
||||
fmt = "M[%d]";
|
||||
break;
|
||||
|
||||
case BPF_STX:
|
||||
op = "stx";
|
||||
fmt = "M[%d]";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JA:
|
||||
op = "ja";
|
||||
fmt = "%d";
|
||||
v = n + 1 + p->k;
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JGT|BPF_K:
|
||||
op = "jgt";
|
||||
fmt = "#0x%x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JGE|BPF_K:
|
||||
op = "jge";
|
||||
fmt = "#0x%x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JEQ|BPF_K:
|
||||
op = "jeq";
|
||||
fmt = "#0x%08x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JSET|BPF_K:
|
||||
op = "jset";
|
||||
fmt = "#0x%x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JGT|BPF_X:
|
||||
op = "jgt";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JGE|BPF_X:
|
||||
op = "jge";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JEQ|BPF_X:
|
||||
op = "jeq";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_JMP|BPF_JSET|BPF_X:
|
||||
op = "jset";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_ADD|BPF_X:
|
||||
op = "add";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_SUB|BPF_X:
|
||||
op = "sub";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_MUL|BPF_X:
|
||||
op = "mul";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_DIV|BPF_X:
|
||||
op = "div";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_AND|BPF_X:
|
||||
op = "and";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_OR|BPF_X:
|
||||
op = "or";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_LSH|BPF_X:
|
||||
op = "lsh";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_RSH|BPF_X:
|
||||
op = "rsh";
|
||||
fmt = "x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_ADD|BPF_K:
|
||||
op = "add";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_SUB|BPF_K:
|
||||
op = "sub";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_MUL|BPF_K:
|
||||
op = "mul";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_DIV|BPF_K:
|
||||
op = "div";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_AND|BPF_K:
|
||||
op = "and";
|
||||
fmt = "#0x%08x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_OR|BPF_K:
|
||||
op = "or";
|
||||
fmt = "#0x%x";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_LSH|BPF_K:
|
||||
op = "lsh";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_RSH|BPF_K:
|
||||
op = "rsh";
|
||||
fmt = "#%d";
|
||||
break;
|
||||
|
||||
case BPF_ALU|BPF_NEG:
|
||||
op = "neg";
|
||||
fmt = "";
|
||||
break;
|
||||
|
||||
case BPF_MISC|BPF_TAX:
|
||||
op = "tax";
|
||||
fmt = "";
|
||||
break;
|
||||
|
||||
case BPF_MISC|BPF_TXA:
|
||||
op = "txa";
|
||||
fmt = "";
|
||||
break;
|
||||
}
|
||||
(void)sprintf(operand, fmt, v);
|
||||
(void)sprintf(image,
|
||||
(BPF_CLASS(p->code) == BPF_JMP &&
|
||||
BPF_OP(p->code) != BPF_JA) ?
|
||||
"(%03d) %-8s %-16s jt %d\tjf %d"
|
||||
: "(%03d) %-8s %s",
|
||||
n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
|
||||
return image;
|
||||
}
|
Loading…
Reference in New Issue