From 8cc5bb09e344038a1f8dff96946e05ec80607c93 Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Wed, 2 Dec 2020 05:02:26 +0100 Subject: Filter: Add 'weight' route attribute Add 'weight' route attribute that allows to get and set ECMP weight of nexthops. Similar to 'gw' attribute, it is limited to the first nexthop, but it is useful for handling BGP multipath, where an ECMP route is merged from multiple regular routes. --- filter/config.Y | 3 ++- filter/data.h | 1 + filter/f-inst.c | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) (limited to 'filter') 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); } -- cgit v1.2.3