Commit 77de6882 authored by Pavel Machek's avatar Pavel Machek
Browse files

BGP_PATH masks now actually work as data type.

parent 78c6217c
...@@ -24,7 +24,7 @@ mnozina cisel ASu. Na cestach nadefinuji nasledujici operace: ...@@ -24,7 +24,7 @@ mnozina cisel ASu. Na cestach nadefinuji nasledujici operace:
Filtry by mely podporovat: Filtry by mely podporovat:
- operator pridani AS k ceste [bgp_path_prepend] - operator pridani AS k ceste [bgppath_prepend]
- matchovani na pritomnost podposloupnosti v ceste (pricemz vyskytne-li - matchovani na pritomnost podposloupnosti v ceste (pricemz vyskytne-li
se tam mnozina, tak si ji lze predstavit prerovnanou v libovolnem se tam mnozina, tak si ji lze predstavit prerovnanou v libovolnem
poradi) poradi)
...@@ -65,7 +65,7 @@ CF_DECLS ...@@ -65,7 +65,7 @@ CF_DECLS
CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
ACCEPT, REJECT, ERROR, QUITBIRD, ACCEPT, REJECT, ERROR, QUITBIRD,
INT, BOOL, IP, PREFIX, PAIR, SET, STRING, INT, BOOL, IP, PREFIX, PAIR, SET, STRING, BGP_PATH,
IF, THEN, ELSE, CASE, IF, THEN, ELSE, CASE,
TRUE, FALSE, TRUE, FALSE,
FROM, GW, NET, MASK, SOURCE, FROM, GW, NET, MASK, SOURCE,
...@@ -84,6 +84,8 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, ...@@ -84,6 +84,8 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
%type <e> set_item set_items switch_body %type <e> set_item set_items switch_body
%type <v> set_atom prefix prefix_s ipa %type <v> set_atom prefix prefix_s ipa
%type <s> decls declsn one_decl function_params %type <s> decls declsn one_decl function_params
%type <h> bgp_path
%type <i> bgp_one
CF_GRAMMAR CF_GRAMMAR
...@@ -104,6 +106,7 @@ type: ...@@ -104,6 +106,7 @@ type:
| PREFIX { $$ = T_PREFIX; } | PREFIX { $$ = T_PREFIX; }
| PAIR { $$ = T_PAIR; } | PAIR { $$ = T_PAIR; }
| STRING { $$ = T_STRING; } | STRING { $$ = T_STRING; }
| BGP_PATH { $$ = T_PATH; }
| type SET { | type SET {
switch ($1) { switch ($1) {
default: default:
...@@ -305,6 +308,15 @@ switch_body: /* EMPTY */ { $$ = NULL; } ...@@ -305,6 +308,15 @@ switch_body: /* EMPTY */ { $$ = NULL; }
/* CONST '(' expr ')' { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_INT; $$->a2.i = $3; } */ /* CONST '(' expr ')' { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_INT; $$->a2.i = $3; } */
bgp_one:
NUM { $$ = $1; }
;
bgp_path:
bgp_one { $$ = cfg_alloc(sizeof(struct f_path)); $$->next = NULL; $$->val = $1; }
| bgp_one bgp_path { $$ = cfg_alloc(sizeof(struct f_path)); $$->next = $2; $$->val = $1; }
;
constant: constant:
NUM { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_INT; $$->a2.i = $1; } NUM { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_INT; $$->a2.i = $1; }
| TRUE { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_BOOL; $$->a2.i = 1; } | TRUE { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_BOOL; $$->a2.i = 1; }
...@@ -315,6 +327,7 @@ constant: ...@@ -315,6 +327,7 @@ constant:
| prefix_s {NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; $$->a1.p = val; *val = $1; } | prefix_s {NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; $$->a1.p = val; *val = $1; }
| '[' 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" ); } | '[' 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" ); }
| ENUM { $$ = f_new_inst(); $$->code = 'c'; $$->aux = $1 >> 16; $$->a2.i = $1 & 0xffff; } | ENUM { $$ = f_new_inst(); $$->code = 'c'; $$->aux = $1 >> 16; $$->a2.i = $1 & 0xffff; }
| '/' bgp_path '/' { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_PATH; $$->a2.p = $2; }
; ;
/* /*
...@@ -371,6 +384,7 @@ term: ...@@ -371,6 +384,7 @@ term:
case SYM_VARIABLE | T_PAIR: case SYM_VARIABLE | T_PAIR:
case SYM_VARIABLE | T_PREFIX: case SYM_VARIABLE | T_PREFIX:
case SYM_VARIABLE | T_IP: case SYM_VARIABLE | T_IP:
case SYM_VARIABLE | T_PATH:
$$->code = 'C'; $$->code = 'C';
$$->a1.p = $1->aux2; $$->a1.p = $1->aux2;
break; break;
...@@ -401,7 +415,6 @@ term: ...@@ -401,7 +415,6 @@ term:
/* Paths */ /* Paths */
| term '.' APPEND '(' term ')' { } | term '.' APPEND '(' term ')' { }
/* | term '.' LEN { } Hmm, this would colide with ip.len. What to do with that? */ /* | term '.' LEN { } Hmm, this would colide with ip.len. What to do with that? */
| term '.' MATCH '(' term ')' { }
/* function_call is inlined here */ /* function_call is inlined here */
| SYM '(' var_list ')' { | SYM '(' var_list ')' {
......
...@@ -133,6 +133,7 @@ val_print(struct f_val v) ...@@ -133,6 +133,7 @@ val_print(struct f_val v)
case T_PAIR: PRINTF( "(%d,%d)", v.val.i >> 16, v.val.i & 0xffff ); break; case T_PAIR: PRINTF( "(%d,%d)", v.val.i >> 16, v.val.i & 0xffff ); break;
case T_SET: tree_print( v.val.t ); PRINTF( "\n" ); break; case T_SET: tree_print( v.val.t ); PRINTF( "\n" ); break;
case T_ENUM: PRINTF( "(enum %x)%d", v.type, v.val.i ); break; case T_ENUM: PRINTF( "(enum %x)%d", v.type, v.val.i ); break;
case T_PATH: debug( "(path " ); { struct f_path *p = v.val.s; while (p) { debug("%d ", p->val); p=p->next; } debug(")" ); } break;
default: PRINTF( "[unknown type %x]", v.type ); default: PRINTF( "[unknown type %x]", v.type );
#undef PRINTF #undef PRINTF
} }
...@@ -248,6 +249,7 @@ interpret(struct f_inst *what) ...@@ -248,6 +249,7 @@ interpret(struct f_inst *what)
case T_IP: case T_IP:
case T_PREFIX: case T_PREFIX:
case T_PAIR: case T_PAIR:
case T_PATH:
if (sym->class != (SYM_VARIABLE | v2.type)) if (sym->class != (SYM_VARIABLE | v2.type))
runtime( "Variable of bad type" ); runtime( "Variable of bad type" );
* (struct f_val *) sym->aux2 = v2; * (struct f_val *) sym->aux2 = v2;
......
...@@ -50,6 +50,11 @@ struct f_val { ...@@ -50,6 +50,11 @@ struct f_val {
} val; } val;
}; };
struct f_path {
struct f_path *next;
int val;
};
struct filter { struct filter {
char *name; char *name;
struct f_inst *root; struct f_inst *root;
...@@ -110,6 +115,7 @@ void val_print(struct f_val v); ...@@ -110,6 +115,7 @@ void val_print(struct f_val v);
#define T_IP 0x20 #define T_IP 0x20
#define T_PREFIX 0x21 #define T_PREFIX 0x21
#define T_STRING 0x22 #define T_STRING 0x22
#define T_PATH 0x23 /* BGP path */
#define T_RETURN 0x40 #define T_RETURN 0x40
#define T_SET 0x80 #define T_SET 0x80
......
...@@ -29,6 +29,14 @@ function fifteen() ...@@ -29,6 +29,14 @@ function fifteen()
return 15; return 15;
} }
function paths()
bgp_path p;
{
print "Testing paths";
p = / 1 2 3 4 /;
print p;
}
function startup() function startup()
int i; int i;
prefix px; prefix px;
...@@ -73,6 +81,8 @@ ip p; ...@@ -73,6 +81,8 @@ ip p;
i = fifteen(); i = fifteen();
print "Testing function calls: 15 = ", i; print "Testing function calls: 15 = ", i;
paths();
print "done"; print "done";
quitbird; quitbird;
# print "*** FAIL: this is unreachable"; # print "*** FAIL: this is unreachable";
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment