diff options
Diffstat (limited to 'filter')
-rw-r--r-- | filter/config.Y | 3 | ||||
-rw-r--r-- | filter/data.h | 1 | ||||
-rw-r--r-- | filter/f-inst.c | 15 |
3 files changed, 18 insertions, 1 deletions
diff --git a/filter/config.Y b/filter/config.Y index 557a951f..5cd52e40 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -278,7 +278,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, SET, STRING, BGPMASK, BGPPATH, CLIST, ECLIST, LCLIST, IF, THEN, ELSE, CASE, TRUE, FALSE, RT, RO, UNKNOWN, GENERIC, - FROM, GW, NET, MASK, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX, + FROM, GW, NET, MASK, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX, WEIGHT, PREFERENCE, ROA_CHECK, ASN, SRC, DST, IS_V4, IS_V6, @@ -750,6 +750,7 @@ static_attr: | DEST { $$ = f_new_static_attr(T_ENUM_RTD, SA_DEST, 0); } | IFNAME { $$ = f_new_static_attr(T_STRING, SA_IFNAME, 0); } | IFINDEX { $$ = f_new_static_attr(T_INT, SA_IFINDEX, 1); } + | WEIGHT { $$ = f_new_static_attr(T_INT, SA_WEIGHT, 0); } ; term: diff --git a/filter/data.h b/filter/data.h index 4ebce73b..a0ec3819 100644 --- a/filter/data.h +++ b/filter/data.h @@ -99,6 +99,7 @@ enum f_sa_code { SA_DEST, SA_IFNAME, SA_IFINDEX, + SA_WEIGHT, } PACKED; /* Static attribute definition (members of struct rta) */ diff --git a/filter/f-inst.c b/filter/f-inst.c index df908e26..58717d55 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -516,6 +516,7 @@ case SA_DEST: RESULT(sa.f_type, i, rta->dest); break; case SA_IFNAME: RESULT(sa.f_type, s, rta->nh.iface ? rta->nh.iface->name : ""); break; case SA_IFINDEX: RESULT(sa.f_type, i, rta->nh.iface ? rta->nh.iface->index : 0); break; + case SA_WEIGHT: RESULT(sa.f_type, i, rta->nh.weight + 1); break; default: bug("Invalid static attribute access (%u/%u)", sa.f_type, sa.sa_code); @@ -586,6 +587,20 @@ } break; + case SA_WEIGHT: + { + int i = v1.val.i; + if (i < 1 || i > 256) + runtime( "Setting weight value out of bounds" ); + if (rta->dest != RTD_UNICAST) + runtime( "Setting weight needs regular nexthop " ); + + /* Set weight on all next hops */ + for (struct nexthop *nh = &rta->nh; nh; nh = nh->next) + nh->weight = i - 1; + } + break; + default: bug("Invalid static attribute access (%u/%u)", sa.f_type, sa.sa_code); } |