On Wed, Jul 1, 2015 at 11:38 AM, Vadim Kochan <[email protected]> wrote:
> 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; }
Also I am thinking about some alternative proto syntax which might
look more nicer when crafting proto header with a lot
of fields in the trafgen's script:
{
eth
{
type=xxx,
dst=FF:FF:FF:FF:FF:FF,
},
tcp
{
flags=syn|ack,
dport=56,
},
dhcp
{
opt(...), /* a lot of dhcp options */
}
}
it should look more nicer than one-line proto description ...
wht do you thing ?
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.