Hi,

There are some examples of the possible proto syntax:

        { eth(src=AA:BB:CC:DD:DD:FF, dst=11:22:33:44:55:66, proto=0x0800), 
tcp(flags=syn|ack, dport=rand) }

        { dns(q="xxx.com") }

Here is an example of little complicated param's value which might require more 
parameters:

        dns answer:
        { dns(a=(host="www.xxx.com", type=INET, addr=192.168.1.1)) }

also I think about cases where param name can be omitted and specify value only 
which
is more shorter, of course this is useful only for few such parameters:

        wlan beacon:
        { beacon(ssid="my wife-i", ie=(100, 0xabcdef)) }

        id & data can be specified w/o parameter names which is faster to type 
and not
        complicated to memorize.

I also changed trafgen grammar to have possibility to do not specify '{' '}' 
which is useful for command line mode:

    $ echo 'eth(arg="xxx" , arg2 = "ccc"),ip(dst="1.1.1.1")' | trafgen/trafgen 
--dev lo -i -

Also I am not sure which way to choose:

    1) have a generic grammar and dynamically lookup proto name from parser, 
this allows to do not
       modify parser each time when add new proto (I am in 80% for this).

    2) have defined each param in the grammar, this might help with having some 
special syntax for some proto,
       but it needs to change modify parser when add new proto & it will get 
parser FATter.

Below is just some dirty-draft-demo patch (not a good in parsers):

diff --git a/trafgen_lexer.l b/trafgen_lexer.l
index a361bfc..d1fb94e 100644
--- a/trafgen_lexer.l
+++ b/trafgen_lexer.l
@@ -115,6 +115,7 @@ number_ascii        ([a-zA-Z])
 "]"            { return ']'; }
 ","            { return ','; }
 ":"            { return ':'; }
+"="            { return '='; }
 
 "\n"           { yylineno++; }
 
@@ -150,6 +151,9 @@ number_ascii        ([a-zA-Z])
 "'"."'"                { yylval.number = (uint8_t) (*(yytext + 1));
                  return number; }
 
+[a-z][a-z0-9]* { yylval.str = xstrdup(yytext);
+                 return name; }
+
 ";"[^\n]*      {/* NOP */}
 .              { printf("Unknown character '%s'", yytext);
                  yyerror("lex Unknown character"); }
diff --git a/trafgen_parser.y b/trafgen_parser.y
index ee3d476..bc9ae89 100644
--- a/trafgen_parser.y
+++ b/trafgen_parser.y
@@ -324,10 +324,10 @@ static void set_dynamic_incdec(uint8_t start, uint8_t 
stop, uint8_t stepping,
 
 %token ',' '{' '}' '(' ')' '[' ']' ':' '-' '+' '*' '/' '%' '&' '|' '<' '>' '^'
 
-%token number string
+%token number string name
 
 %type <number> number expression
-%type <str> string
+%type <str> string name param value
 
 %left '-' '+' '*' '/' '%' '&' '|' '<' '>' '^'
 
@@ -360,6 +360,11 @@ noenforce_white
        | delimiter_nowhite { }
        ;
 
+skip_white
+       : {}
+       | K_WHITE {}
+       ;
+
 packet
        : '{' noenforce_white payload noenforce_white '}' {
                        min_cpu = max_cpu = -1;
@@ -382,6 +387,7 @@ packet
                        min_cpu = max_cpu = $3;
                        realloc_packet();
                }
+       | proto_expr { }
        ;
 
 payload
@@ -411,8 +417,39 @@ elem
        | csum { }
        | const { }
        | inline_comment { }
+       | proto {}
+       ;
+
+proto_expr
+       : proto { }
+       | proto_expr ',' proto { }
+       ;
+proto
+       : name param_list { printf("proto(%s)\n", $1); }
+       | name {  printf("proto(%s)\n", $1); }
+       ;
+
+param_list
+       : '(' param_list_name_value ')' { }
        ;
 
+param_list_name_value
+       : name_value { }
+       | param_list_name_value ',' name_value { }
+       ;
+
+name_value
+       : skip_white param skip_white '=' skip_white value skip_white { }
+       ;
+
+param
+       : name { printf("param=%s\n", $1); }
+       ;
+
+value  : string { printf("value=%s\n", $1); }
+       | param_list { }
+       ;
+
 expression
        : number
                { $$ = $1; }

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to netsniff-ng+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to