Daniel Gröber <dxld@darkboxed.org> writes:
--- doc/bird.sgml | 21 ++++++++++++++------- proto/babel/babel.c | 1 + proto/babel/babel.h | 2 ++ proto/babel/config.Y | 2 ++ 4 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/doc/bird.sgml b/doc/bird.sgml index 5e85d8ec..1fdda7bc 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1865,6 +1865,7 @@ protocol babel [<name>] { ipv4 { <channel config> }; ipv6 [sadr] { <channel config> }; randomize router id <switch>; + ecmp <switch> [limit <num>]; interface <interface pattern> { type <wired|wireless>; rxcost <number>; @@ -1879,7 +1880,7 @@ protocol babel [<name>] { check link <switch>; next hop ipv4 <address>; next hop ipv6 <address>; - ecmp <switch> [limit <num>];
Just add this in the right place the first time around? Or fold this into the first patch entirely; doesn't really need to be a separate patch...
+ ecmp weight <num>; authentication none|mac [permissive]; password "<text>"; password "<text>" { @@ -1910,6 +1911,13 @@ protocol babel [<name>] { router ID every time it starts up, which avoids this problem at the cost of not having stable router IDs in the network. Default: no.
+ <tag><label id="babel-ecmp">ecmp <m>switch</m> [limit <m>number</m>]</tag> + + Determines whether babel will emit ECMP (equal-cost multipath) + routes, allowing to load-balancing traffic across multiple paths. If + enabled the maximum number of next-hops to allow can be specified, + defaulting to 16. + <tag><label id="babel-type">type wired|wireless </tag> This option specifies the interface type: Wired or wireless. On wired interfaces a neighbor is considered unreachable after a small number of @@ -1984,12 +1992,11 @@ protocol babel [<name>] { source for Babel packets will be used. In normal operation, it should not be necessary to set this option.
- <tag><label id="babel-ecmp">ecmp <m>switch</m> [limit <m>number</m>]</tag> - - Determines whether babel will emit ECMP (equal-cost multipath) - routes, allowing to load-balancing traffic across multiple paths. If - enabled the maximum number of next-hops to allow can be specified, - defaulting to 16. + <tag><label id="babel-ecmp-weight">ecmp weight <m>number</m></tag> + This specifies the relative weight used for nexthops going through + the iface when ECMP is enabled. Larger weight values relative to other + nexthops attract more traffic. Valid values are 1-256. Default value + is 1.
<tag><label id="babel-authentication">authentication none|mac [permissive]</tag> Selects authentication method to be used. <cf/none/ means that packets diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 4d9c657c..83d9a1d0 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -639,6 +639,7 @@ babel_nexthop_insert( { nh->gw = r->next_hop; nh->iface = r->neigh->ifa->iface; + nh->weight = r->neigh->ifa->cf->ecmp_weight;
/* * If we cannot find a reachable neighbour, set the entry to be onlink. This diff --git a/proto/babel/babel.h b/proto/babel/babel.h index 3868dcb2..2ad1ded0 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -145,6 +145,8 @@ struct babel_iface_config { int tx_tos; int tx_priority;
+ u8 ecmp_weight; + ip_addr next_hop_ip4; ip_addr next_hop_ip6;
diff --git a/proto/babel/config.Y b/proto/babel/config.Y index 8f18c790..6f03482a 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -70,6 +70,7 @@ babel_iface_start: BABEL_IFACE->tx_tos = IP_PREC_INTERNET_CONTROL; BABEL_IFACE->tx_priority = sk_priority_control; BABEL_IFACE->check_link = 1; + BABEL_IFACE->ecmp_weight = 0; };
@@ -149,6 +150,7 @@ babel_iface_item: | AUTHENTICATION NONE { BABEL_IFACE->auth_type = BABEL_AUTH_NONE; } | AUTHENTICATION MAC { BABEL_IFACE->auth_type = BABEL_AUTH_MAC; BABEL_IFACE->auth_permissive = 0; } | AUTHENTICATION MAC PERMISSIVE { BABEL_IFACE->auth_type = BABEL_AUTH_MAC; BABEL_IFACE->auth_permissive = 1; } + | ECMP WEIGHT expr { BABEL_IFACE->ecmp_weight = $3 - 1; if (($3<1) || ($3>256)) cf_error("ECMP weight must be in range 1-256"); } | password_list ;
-- 2.30.2