summaryrefslogtreecommitdiffstats
path: root/filter
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>1999-11-24 13:04:32 +0100
committerPavel Machek <pavel@ucw.cz>1999-11-24 13:04:32 +0100
commit48f9e0195488db0a515e4e5140d402fe4fe7d927 (patch)
tree16cc778a08b5fd3dcc2e7f21cfa69f741764208f /filter
parent99bbd23b229419403f673c626001eb0f35cc3a4e (diff)
downloadbird-48f9e0195488db0a515e4e5140d402fe4fe7d927.tar
bird-48f9e0195488db0a515e4e5140d402fe4fe7d927.zip
Filters: write access to dynamic attributes should actually work. It
would be nice to find method of testing such beasts.
Diffstat (limited to 'filter')
-rw-r--r--filter/config.Y4
-rw-r--r--filter/filter.c16
-rw-r--r--filter/test.conf2
3 files changed, 15 insertions, 7 deletions
diff --git a/filter/config.Y b/filter/config.Y
index a24b157..aaea74f 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -364,7 +364,9 @@ cmd:
}
| UNSET '(' RTA '.' any_dynamic ')' ';' {
$$ = $5;
- $$->code = 'eD';
+ $$->aux = T_VOID;
+ $$->code = 'eS';
+ $$->a1.p = NULL;
}
| break_command print_list ';' { $$ = f_new_inst(); $$->code = 'p,'; $$->a1.p = $2; $$->a2.i = $1; }
| SYM '(' var_list ')' ';' {
diff --git a/filter/filter.c b/filter/filter.c
index 36830bd..19e5e45 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -158,7 +158,7 @@ val_print(struct f_val v)
printf( buf );
}
-static struct rte **f_rte;
+static struct rte **f_rte, *f_rte_old;
static struct linpool *f_pool;
static struct f_val interpret(struct f_inst *what);
@@ -338,7 +338,6 @@ interpret(struct f_inst *what)
if (v1.type != what->aux)
runtime("Wrong type when setting dynamic attribute\n");
- /* This willl only work if it is not already there! */
{
struct ea_list *l = lp_alloc(f_pool, sizeof(struct ea_list) + sizeof(eattr));
@@ -352,13 +351,17 @@ interpret(struct f_inst *what)
l->attrs[0].type = EAF_TYPE_INT | EAF_INLINE;
l->attrs[0].u.data = v1.val.i;
break;
+ case T_VOID:
+ l->attrs[0].type = EAF_TYPE_UNDEF | EAF_INLINE;
+ l->attrs[0].u.data = 0;
+ break;
}
- /* FIXME: need to do copy on write of rte + rta + insert at the beggining */
+ *f_rte = rte_do_cow(*f_rte);
+ l->next = *f_rte->attrs->eattrs;
+ *f_rte->attrs->eattrs = l;
}
-
- case 'eD': /*FIXME: unset: implement me */
- die("Implement me!!!" );
break;
+
case 'cp': /* Convert prefix to ... */
ONEARG;
if (v1.type != T_PREFIX)
@@ -419,6 +422,7 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc
debug( "Running filter `%s'...", filter->name );
f_rte = rte;
+ f_rte_old = *rte;
f_pool = tmp_pool;
inst = filter->root;
res = interpret(inst);
diff --git a/filter/test.conf b/filter/test.conf
index 837c423..7a1c07b 100644
--- a/filter/test.conf
+++ b/filter/test.conf
@@ -73,6 +73,8 @@ int j;
if rta.rip_metric > 15 then {
reject "RIP Metric is more than infinity";
}
+ rta.rip_metric = 14;
+ unset(rta.rip_metric);
accept "ok I take that";
}