Revision 04632fd7 filter/config.Y
filter/config.Y | ||
---|---|---|
475 | 475 |
* Complex types, their bison value is struct f_val |
476 | 476 |
*/ |
477 | 477 |
fipa: |
478 |
ipa_raw %prec PREFIX_DUMMY { $$.type = T_IP; $$.val.ip = $1; } |
|
478 |
IP4 %prec PREFIX_DUMMY { $$.type = T_IP; $$.val.ip = ipa_from_ip4($1); } |
|
479 |
| IP6 %prec PREFIX_DUMMY { $$.type = T_IP; $$.val.ip = ipa_from_ip6($1); } |
|
479 | 480 |
; |
480 | 481 |
|
481 | 482 |
|
... | ... | |
571 | 572 |
; |
572 | 573 |
|
573 | 574 |
fprefix: |
574 |
net_ip { $$.net = $1; $$.lo = $1.n.pxlen; $$.hi = $1.n.pxlen; }
|
|
575 |
| net_ip '+' { $$.net = $1; $$.lo = $1.n.pxlen; $$.hi = net_max_prefix_length[$1.n.type]; }
|
|
576 |
| net_ip '-' { $$.net = $1; $$.lo = 0; $$.hi = $1.n.pxlen; }
|
|
577 |
| net_ip '{' NUM ',' NUM '}' { |
|
575 |
net_ip_ { $$.net = $1; $$.lo = $1.pxlen; $$.hi = $1.pxlen; }
|
|
576 |
| net_ip_ '+' { $$.net = $1; $$.lo = $1.pxlen; $$.hi = net_max_prefix_length[$1.type]; }
|
|
577 |
| net_ip_ '-' { $$.net = $1; $$.lo = 0; $$.hi = $1.pxlen; }
|
|
578 |
| net_ip_ '{' NUM ',' NUM '}' {
|
|
578 | 579 |
$$.net = $1; $$.lo = $3; $$.hi = $5; |
579 |
if ((0 > $3) || ($3 > $5) || ($5 > net_max_prefix_length[$1.n.type]))
|
|
580 |
if ((0 > $3) || ($3 > $5) || ($5 > net_max_prefix_length[$1.type])) |
|
580 | 581 |
cf_error("Invalid prefix pattern range: {%d, %d}", $3, $5); |
581 | 582 |
} |
582 | 583 |
; |
583 | 584 |
|
584 | 585 |
fprefix_set: |
585 |
fprefix { $$ = f_new_trie(cfg_mem, sizeof(struct f_trie_node)); trie_add_prefix($$, &($1.net.n), $1.lo, $1.hi); }
|
|
586 |
| fprefix_set ',' fprefix { $$ = $1; trie_add_prefix($$, &($3.net.n), $3.lo, $3.hi); }
|
|
586 |
fprefix { $$ = f_new_trie(cfg_mem, sizeof(struct f_trie_node)); trie_add_prefix($$, &($1.net), $1.lo, $1.hi); } |
|
587 |
| fprefix_set ',' fprefix { $$ = $1; trie_add_prefix($$, &($3.net), $3.lo, $3.hi); } |
|
587 | 588 |
; |
588 | 589 |
|
589 | 590 |
switch_body: /* EMPTY */ { $$ = NULL; } |
... | ... | |
635 | 636 |
| FALSE { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_BOOL; $$->a2.i = 0; } |
636 | 637 |
| TEXT { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_STRING; $$->a2.p = $1; } |
637 | 638 |
| fipa { NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; $$->a1.p = val; *val = $1; } |
638 |
| net_any { NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; val->type = T_NET; val->val.net = $1; $$->a1.p = val; }
|
|
639 |
| net_ { NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; val->type = T_NET; val->val.net = $1; $$->a1.p = val; }
|
|
639 | 640 |
| '[' set_items ']' { DBG( "We've got a set here..." ); $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_SET; $$->a2.p = build_tree($2); DBG( "ook\n" ); } |
640 | 641 |
| '[' fprefix_set ']' { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_PREFIX_SET; $$->a2.p = $2; } |
641 | 642 |
| ENUM { $$ = f_new_inst(); $$->code = 'c'; $$->aux = $1 >> 16; $$->a2.i = $1 & 0xffff; } |
Also available in: Unified diff