diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-12-02 05:02:26 +0100 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-12-02 05:02:26 +0100 |
commit | 8cc5bb09e344038a1f8dff96946e05ec80607c93 (patch) | |
tree | 5c7d1f192d4d7654d40282822c639c887aaaffda /filter/f-inst.c | |
parent | 246586771296d1c42a012c06bdc75b36a7ce0b4f (diff) |
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.
Diffstat (limited to 'filter/f-inst.c')
-rw-r--r-- | filter/f-inst.c | 15 |
1 files changed, 15 insertions, 0 deletions
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); } |