[PATCH] Babel: allow enabling link quality estimation manually
Link quality estimation is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. --- doc/bird.sgml | 6 ++++++ proto/babel/babel.c | 19 ++++++------------- proto/babel/babel.h | 1 + proto/babel/config.Y | 5 ++++- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/doc/bird.sgml b/doc/bird.sgml index 8041faa9..417ec030 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2032,6 +2032,12 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes. + <tag><label id="babel-link-quality">link quality <m/switch/</tag> + If set, link quality estimation is performed on this interface. + Link quality is measured by packet loss and is used for computing + metrics of routes going through this interface. Default: yes for + wireless interfaces, otherwise no. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 7f0cca73..6a238d75 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,21 +593,15 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done; - switch (cf->type) - { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + if (!cf->link_quality) { /* k-out-of-j selection - Appendix 2.1 in the RFC. */ /* Link is bad if less than cf->limit/16 of expected hellos were received */ - if (rcv * 16 < cf->limit * max) - break; - - rxcost = cf->rxcost; - txcost = nbr->txcost; - break; - - case BABEL_IFACE_TYPE_WIRELESS: + if (!(rcv * 16 < cf->limit * max)) { + rxcost = cf->rxcost; + txcost = nbr->txcost; + } + } else { /* * ETX - Appendix 2.2 in the RFC. * @@ -622,7 +616,6 @@ babel_update_cost(struct babel_neighbor *nbr) */ rxcost = MIN( cf->rxcost * max / rcv, BABEL_INFINITY); txcost = MIN(nbr->txcost * max / rcv, BABEL_INFINITY); - break; } if (cf->rtt_cost && nbr->srtt > cf->rtt_min) diff --git a/proto/babel/babel.h b/proto/babel/babel.h index edde4cab..d152d099 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -145,6 +145,7 @@ struct babel_iface_config { u8 type; u8 limit; /* Minimum number of Hellos to keep link up */ u8 check_link; + u8 link_quality; uint port; uint hello_interval; /* Hello interval, in us */ uint ihu_interval; /* IHU interval, in us */ diff --git a/proto/babel/config.Y b/proto/babel/config.Y index b8af0267..cbf873c5 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -26,7 +26,7 @@ CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, TYPE, WIRED, WIRELESS, RX, TX, BUFFER, PRIORITY, LENGTH, CHECK, LINK, NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS, ENTRIES, RANDOMIZE, ROUTER, ID, AUTHENTICATION, NONE, MAC, PERMISSIVE, - EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS) + EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, QUALITY) CF_GRAMMAR @@ -72,6 +72,7 @@ babel_iface_start: BABEL_IFACE->rtt_decay = BABEL_RTT_DECAY; BABEL_IFACE->rtt_send = 1; BABEL_IFACE->check_link = 1; + BABEL_IFACE->link_quality = 0; BABEL_IFACE->ext_next_hop = 1; }; @@ -84,6 +85,7 @@ babel_iface_finish: BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; if (!BABEL_IFACE->rxcost) BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; + BABEL_IFACE->link_quality = 1; } else { @@ -156,6 +158,7 @@ babel_iface_item: | TX tos { BABEL_IFACE->tx_tos = $2; } | TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } | CHECK LINK bool { BABEL_IFACE->check_link = $3; } + | LINK QUALITY bool { BABEL_IFACE->link_quality = $3; } | NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } | NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } | EXTENDED NEXT HOP bool { BABEL_IFACE->ext_next_hop = $4; } -- 2.41.0
Link quality estimation is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. Changes since v1: - fix missing reference to link quality in example configuration - fix mishandling of default configuration --- doc/bird.sgml | 7 +++++++ proto/babel/babel.c | 19 ++++++------------- proto/babel/babel.h | 1 + proto/babel/config.Y | 8 +++++++- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/doc/bird.sgml b/doc/bird.sgml index 8041faa9..e597de83 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1929,6 +1929,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <switch>; next hop ipv4 <address>; next hop ipv6 <address>; extended next hop <switch>; @@ -2032,6 +2033,12 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes. + <tag><label id="babel-link-quality">link quality <m/switch/</tag> + If set, link quality estimation is performed on this interface. + Link quality is measured by packet loss and is used for computing + metrics of routes going through this interface. Default: yes for + wireless interfaces, no otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 7f0cca73..6a238d75 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,21 +593,15 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done; - switch (cf->type) - { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + if (!cf->link_quality) { /* k-out-of-j selection - Appendix 2.1 in the RFC. */ /* Link is bad if less than cf->limit/16 of expected hellos were received */ - if (rcv * 16 < cf->limit * max) - break; - - rxcost = cf->rxcost; - txcost = nbr->txcost; - break; - - case BABEL_IFACE_TYPE_WIRELESS: + if (!(rcv * 16 < cf->limit * max)) { + rxcost = cf->rxcost; + txcost = nbr->txcost; + } + } else { /* * ETX - Appendix 2.2 in the RFC. * @@ -622,7 +616,6 @@ babel_update_cost(struct babel_neighbor *nbr) */ rxcost = MIN( cf->rxcost * max / rcv, BABEL_INFINITY); txcost = MIN(nbr->txcost * max / rcv, BABEL_INFINITY); - break; } if (cf->rtt_cost && nbr->srtt > cf->rtt_min) diff --git a/proto/babel/babel.h b/proto/babel/babel.h index edde4cab..6145bb58 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -145,6 +145,7 @@ struct babel_iface_config { u8 type; u8 limit; /* Minimum number of Hellos to keep link up */ u8 check_link; + u8 link_quality; /* bool + 2 for unspecified */ uint port; uint hello_interval; /* Hello interval, in us */ uint ihu_interval; /* IHU interval, in us */ diff --git a/proto/babel/config.Y b/proto/babel/config.Y index b8af0267..4a3d33cb 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -26,7 +26,7 @@ CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, TYPE, WIRED, WIRELESS, RX, TX, BUFFER, PRIORITY, LENGTH, CHECK, LINK, NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS, ENTRIES, RANDOMIZE, ROUTER, ID, AUTHENTICATION, NONE, MAC, PERMISSIVE, - EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS) + EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, QUALITY) CF_GRAMMAR @@ -72,6 +72,7 @@ babel_iface_start: BABEL_IFACE->rtt_decay = BABEL_RTT_DECAY; BABEL_IFACE->rtt_send = 1; BABEL_IFACE->check_link = 1; + BABEL_IFACE->link_quality = 2; BABEL_IFACE->ext_next_hop = 1; }; @@ -84,6 +85,8 @@ babel_iface_finish: BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; if (!BABEL_IFACE->rxcost) BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; + if (BABEL_IFACE->link_quality == 2) + BABEL_IFACE->link_quality = 1; } else { @@ -93,6 +96,8 @@ babel_iface_finish: BABEL_IFACE->rxcost = BABEL_RXCOST_WIRED; if (BABEL_IFACE->type == BABEL_IFACE_TYPE_TUNNEL && !BABEL_IFACE->rtt_cost) BABEL_IFACE->rtt_cost = BABEL_RXCOST_RTT; + if (BABEL_IFACE->link_quality == 2) + BABEL_IFACE->link_quality = 0; } if (BABEL_IFACE->rtt_cost && !BABEL_IFACE->rtt_send) @@ -156,6 +161,7 @@ babel_iface_item: | TX tos { BABEL_IFACE->tx_tos = $2; } | TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } | CHECK LINK bool { BABEL_IFACE->check_link = $3; } + | LINK QUALITY bool { BABEL_IFACE->link_quality = $3; } | NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } | NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } | EXTENDED NEXT HOP bool { BABEL_IFACE->ext_next_hop = $4; } -- 2.41.0
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. Changes since v2: - change option type from bool to enum - document the properties of the two algorithms Changes since v1: - fix missing reference to link quality in example configuration - fix mishandling of default configuration --- doc/bird.sgml | 10 ++++++++++ proto/babel/babel.c | 8 +++----- proto/babel/babel.h | 8 ++++++++ proto/babel/config.Y | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/doc/bird.sgml b/doc/bird.sgml index 8041faa9..269a5de9 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1929,6 +1929,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <none|etx>; next hop ipv4 <address>; next hop ipv6 <address>; extended next hop <switch>; @@ -2032,6 +2033,15 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes. + <tag><label id="babel-link-quality">link quality none|etx </tag> + This option specifies the link quality estimation algorithm for computing + costs based on Hello history: none or etx. The none (k-out-of-j) algorithm + is suitable for wired links that are either up, in which case they only + occasionally drop a packet, or down, in which case they drop all packets. + The Expected Transmission Cost algorithm, or etx, is suitable for wireless + links that exhibit continuous variation of the link quality. Default: etx for + wireless interfaces, none otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 7f0cca73..eb0f50ef 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,10 +593,9 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done; - switch (cf->type) + switch (cf->link_quality) { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + case BABEL_IFACE_LINK_QUALITY_NONE: /* k-out-of-j selection - Appendix 2.1 in the RFC. */ /* Link is bad if less than cf->limit/16 of expected hellos were received */ @@ -606,8 +605,7 @@ babel_update_cost(struct babel_neighbor *nbr) rxcost = cf->rxcost; txcost = nbr->txcost; break; - - case BABEL_IFACE_TYPE_WIRELESS: + case BABEL_IFACE_LINK_QUALITY_ETX: /* * ETX - Appendix 2.2 in the RFC. * diff --git a/proto/babel/babel.h b/proto/babel/babel.h index edde4cab..6a2968f1 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -118,6 +118,13 @@ enum babel_iface_type { BABEL_IFACE_TYPE_MAX }; +enum babel_iface_link_quality { + BABEL_IFACE_LINK_QUALITY_UNDEF = 0, + BABEL_IFACE_LINK_QUALITY_NONE = 1, + BABEL_IFACE_LINK_QUALITY_ETX = 2, + BABEL_IFACE_LINK_QUALITY_MAX +}; + enum babel_ae_type { BABEL_AE_WILDCARD = 0, BABEL_AE_IP4 = 1, @@ -145,6 +152,7 @@ struct babel_iface_config { u8 type; u8 limit; /* Minimum number of Hellos to keep link up */ u8 check_link; + u8 link_quality; uint port; uint hello_interval; /* Hello interval, in us */ uint ihu_interval; /* IHU interval, in us */ diff --git a/proto/babel/config.Y b/proto/babel/config.Y index b8af0267..285a3f33 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -26,7 +26,7 @@ CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, TYPE, WIRED, WIRELESS, RX, TX, BUFFER, PRIORITY, LENGTH, CHECK, LINK, NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS, ENTRIES, RANDOMIZE, ROUTER, ID, AUTHENTICATION, NONE, MAC, PERMISSIVE, - EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS) + EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, QUALITY, ETX) CF_GRAMMAR @@ -84,6 +84,8 @@ babel_iface_finish: BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; if (!BABEL_IFACE->rxcost) BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } else { @@ -93,6 +95,8 @@ babel_iface_finish: BABEL_IFACE->rxcost = BABEL_RXCOST_WIRED; if (BABEL_IFACE->type == BABEL_IFACE_TYPE_TUNNEL && !BABEL_IFACE->rtt_cost) BABEL_IFACE->rtt_cost = BABEL_RXCOST_RTT; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } if (BABEL_IFACE->rtt_cost && !BABEL_IFACE->rtt_send) @@ -156,6 +160,8 @@ babel_iface_item: | TX tos { BABEL_IFACE->tx_tos = $2; } | TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } | CHECK LINK bool { BABEL_IFACE->check_link = $3; } + | LINK QUALITY NONE { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } + | LINK QUALITY ETX { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } | NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } | NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } | EXTENDED NEXT HOP bool { BABEL_IFACE->ext_next_hop = $4; } -- 2.41.0
Resend of the patch in http://trubka.network.cz/pipermail/bird-users/2023-June/017058.html ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. --- doc/bird.sgml | 10 ++++++++++ proto/babel/babel.c | 8 +++----- proto/babel/babel.h | 8 ++++++++ proto/babel/config.Y | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/doc/bird.sgml b/doc/bird.sgml index f2063325..1a9bab87 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2209,6 +2209,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <none|etx>; next hop ipv4 <address>; next hop ipv6 <address>; extended next hop <switch>; @@ -2312,6 +2313,15 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes. + <tag><label id="babel-link-quality">link quality none|etx </tag> + This option specifies the link quality estimation algorithm for computing + costs based on Hello history: none or etx. The none (k-out-of-j) algorithm + is suitable for wired links that are either up, in which case they only + occasionally drop a packet, or down, in which case they drop all packets. + The Expected Transmission Cost algorithm, or etx, is suitable for wireless + links that exhibit continuous variation of the link quality. Default: etx for + wireless interfaces, none otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 4187d258..f865c089 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,10 +593,9 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done; - switch (cf->type) + switch (cf->link_quality) { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + case BABEL_IFACE_LINK_QUALITY_NONE: /* k-out-of-j selection - Appendix 2.1 in the RFC. */ /* Link is bad if less than cf->limit/16 of expected hellos were received */ @@ -606,8 +605,7 @@ babel_update_cost(struct babel_neighbor *nbr) rxcost = cf->rxcost; txcost = nbr->txcost; break; - - case BABEL_IFACE_TYPE_WIRELESS: + case BABEL_IFACE_LINK_QUALITY_ETX: /* * ETX - Appendix 2.2 in the RFC. * diff --git a/proto/babel/babel.h b/proto/babel/babel.h index edde4cab..6a2968f1 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -118,6 +118,13 @@ enum babel_iface_type { BABEL_IFACE_TYPE_MAX }; +enum babel_iface_link_quality { + BABEL_IFACE_LINK_QUALITY_UNDEF = 0, + BABEL_IFACE_LINK_QUALITY_NONE = 1, + BABEL_IFACE_LINK_QUALITY_ETX = 2, + BABEL_IFACE_LINK_QUALITY_MAX +}; + enum babel_ae_type { BABEL_AE_WILDCARD = 0, BABEL_AE_IP4 = 1, @@ -145,6 +152,7 @@ struct babel_iface_config { u8 type; u8 limit; /* Minimum number of Hellos to keep link up */ u8 check_link; + u8 link_quality; uint port; uint hello_interval; /* Hello interval, in us */ uint ihu_interval; /* IHU interval, in us */ diff --git a/proto/babel/config.Y b/proto/babel/config.Y index b8af0267..285a3f33 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -26,7 +26,7 @@ CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, TYPE, WIRED, WIRELESS, RX, TX, BUFFER, PRIORITY, LENGTH, CHECK, LINK, NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS, ENTRIES, RANDOMIZE, ROUTER, ID, AUTHENTICATION, NONE, MAC, PERMISSIVE, - EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS) + EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, QUALITY, ETX) CF_GRAMMAR @@ -84,6 +84,8 @@ babel_iface_finish: BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; if (!BABEL_IFACE->rxcost) BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } else { @@ -93,6 +95,8 @@ babel_iface_finish: BABEL_IFACE->rxcost = BABEL_RXCOST_WIRED; if (BABEL_IFACE->type == BABEL_IFACE_TYPE_TUNNEL && !BABEL_IFACE->rtt_cost) BABEL_IFACE->rtt_cost = BABEL_RXCOST_RTT; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } if (BABEL_IFACE->rtt_cost && !BABEL_IFACE->rtt_send) @@ -156,6 +160,8 @@ babel_iface_item: | TX tos { BABEL_IFACE->tx_tos = $2; } | TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } | CHECK LINK bool { BABEL_IFACE->check_link = $3; } + | LINK QUALITY NONE { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } + | LINK QUALITY ETX { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } | NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } | NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } | EXTENDED NEXT HOP bool { BABEL_IFACE->ext_next_hop = $4; } -- 2.42.0
On Sat, Oct 28, 2023 at 09:24:56PM -0400, Nick Cao via Bird-users wrote:
Resend of the patch in http://trubka.network.cz/pipermail/bird-users/2023-June/017058.html
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur.
Hi I looked at your patch with intent of merging it, i like a separate option for selection of dynamic metric algorithm, but i noticed that i misunderstood how recently added RTT mechanism interacts with the rest. I thought we have three alternative link quality / metric estimation algorithms: - fixed (k-out-of-j) - ETX - RTT But in fact RTT is independent metric, which is added on top of fixed/ETX metric. Is this intentional? Does it make sense? (This is mainly a question for Toke or Juliusz) -- Elen sila lumenn' omentielvo Ondrej 'Santiago' Zajicek (email: santiago@crfreenet.org) OpenPGP encrypted e-mails preferred (KeyID 0x11DEADC3, wwwkeys.pgp.net) "To err is human -- to blame it on a computer is even more so."
I think it is the intended design. Link quality is about packet losses, while RTT is about, well, RTT, they cover different characteristics of the link, which should all be taken into account for metric calculation. And babeld the reference implementation also allows enabling link quality estimation and the RTT extension at the same time, matching the current behavior of bird. On 11/8/23 11:44, Ondrej Zajicek wrote:
On Sat, Oct 28, 2023 at 09:24:56PM -0400, Nick Cao via Bird-users wrote:
Resend of the patch in http://trubka.network.cz/pipermail/bird-users/2023-June/017058.html
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur.
Hi
I looked at your patch with intent of merging it, i like a separate option for selection of dynamic metric algorithm, but i noticed that i misunderstood how recently added RTT mechanism interacts with the rest.
I thought we have three alternative link quality / metric estimation algorithms:
- fixed (k-out-of-j) - ETX - RTT
But in fact RTT is independent metric, which is added on top of fixed/ETX metric.
Is this intentional? Does it make sense?
(This is mainly a question for Toke or Juliusz)
On Wed, Nov 08, 2023 at 11:56:32AM -0500, Nick Cao wrote:
I think it is the intended design. Link quality is about packet losses, while RTT is about, well, RTT, they cover different characteristics of the link, which should all be taken into account for metric calculation.
RTT has two sources, propagation delay (which is just a question of distance) and queuing/retransmission/MAC delay (which depends on link quality). On wifi with worsening link quality / congestion it starts with raising RTT (due to MAC delay and L2 retransmissions) and fluently continues with raising packet loss, so i would say that both packet loss and RTT are parameters of link quality and should be handled together by one mechanism, instead of two independent mechanisms.
And babeld the reference implementation also allows enabling link quality estimation and the RTT extension at the same time, matching the current behavior of bird.
I agree that it make sense to handle both packet loss and RTT information for purposes of metric estimation. I just do not think it makes sense to estimate two separate metrics and then sum it. Considering that ETX estimates number of retransmissions, then for algorithm that takes into account both RTT and packet loss it makes more sense to have RTT metric multiplied by ETX coeficient?
On 11/8/23 11:44, Ondrej Zajicek wrote:
On Sat, Oct 28, 2023 at 09:24:56PM -0400, Nick Cao via Bird-users wrote:
Resend of the patch in http://trubka.network.cz/pipermail/bird-users/2023-June/017058.html
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur.
Hi
I looked at your patch with intent of merging it, i like a separate option for selection of dynamic metric algorithm, but i noticed that i misunderstood how recently added RTT mechanism interacts with the rest.
I thought we have three alternative link quality / metric estimation algorithms:
- fixed (k-out-of-j) - ETX - RTT
But in fact RTT is independent metric, which is added on top of fixed/ETX metric.
Is this intentional? Does it make sense?
(This is mainly a question for Toke or Juliusz)
-- Elen sila lumenn' omentielvo Ondrej 'Santiago' Zajicek (email: santiago@crfreenet.org) OpenPGP encrypted e-mails preferred (KeyID 0x11DEADC3, wwwkeys.pgp.net) "To err is human -- to blame it on a computer is even more so."
And babeld the reference implementation also allows enabling link quality estimation and the RTT extension at the same time, matching the current behavior of bird.
Exactly right.
Considering that ETX estimates number of retransmissions, then for algorithm that takes into account both RTT and packet loss it makes more sense to have RTT metric multiplied by ETX coeficient?
The current algorithm is described here: https://datatracker.ietf.org/doc/html/draft-ietf-babel-rtt-extension My intuition is that it doesn't matter much. The goal is not to have an accurate model of reality, the goal is to choose optimal paths. And I would guess that in any realistic topology, the two algorithms will yield the same or almost the same set of paths. It looks like your intuition is different from mine: that's exciting, and it means that we need to design an experiment in order to find out who's right. Can you design a topology in which the algorithm described in the draft and the algorithm that you propose yield different sets of paths, and where your proposed algorithm leads to significantly better performance? If it turns out that you're right, I'll be thrilled to write a successor RFC, perhaps with you as co-author. -- Juliusz
Nick Cao via Bird-users <bird-users@network.cz> writes:
Resend of the patch in http://trubka.network.cz/pipermail/bird-users/2023-June/017058.html
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. --- doc/bird.sgml | 10 ++++++++++ proto/babel/babel.c | 8 +++----- proto/babel/babel.h | 8 ++++++++ proto/babel/config.Y | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/doc/bird.sgml b/doc/bird.sgml index f2063325..1a9bab87 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2209,6 +2209,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <none|etx>; next hop ipv4 <address>; next hop ipv6 <address>; extended next hop <switch>; @@ -2312,6 +2313,15 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes.
+ <tag><label id="babel-link-quality">link quality none|etx </tag> + This option specifies the link quality estimation algorithm for computing + costs based on Hello history: none or etx. The none (k-out-of-j) algorithm + is suitable for wired links that are either up, in which case they only + occasionally drop a packet, or down, in which case they drop all packets. + The Expected Transmission Cost algorithm, or etx, is suitable for wireless + links that exhibit continuous variation of the link quality. Default: etx for + wireless interfaces, none otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 4187d258..f865c089 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,10 +593,9 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done;
- switch (cf->type) + switch (cf->link_quality) { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + case BABEL_IFACE_LINK_QUALITY_NONE:
Sorry for missing this earlier, but it looks like with your patch bird will no longer honour the "wires" or "wireless" setting at all? Which will break old configs, so please don't do that. The right way to do this is to have "wired" and "wireless" serve as "presets", and then have the link quality override that setting. So that just setting "wireless" will get the same settings as today, but setting "wired + etx" will get you just the ETX setting. -Toke
On Thu, Nov 09, 2023 at 11:25:10AM +0100, Toke Høiland-Jørgensen via Bird-users wrote:
Nick Cao via Bird-users <bird-users@network.cz> writes:
Sorry for missing this earlier, but it looks like with your patch bird will no longer honour the "wires" or "wireless" setting at all? Which will break old configs, so please don't do that.
The right way to do this is to have "wired" and "wireless" serve as "presets", and then have the link quality override that setting. So that just setting "wireless" will get the same settings as today, but setting "wired + etx" will get you just the ETX setting.
Agreed. -- Elen sila lumenn' omentielvo Ondrej 'Santiago' Zajicek (email: santiago@crfreenet.org) OpenPGP encrypted e-mails preferred (KeyID 0x11DEADC3, wwwkeys.pgp.net) "To err is human -- to blame it on a computer is even more so."
The presets are still handled, in babel_iface_finish of proto/babel/config.Y. On 11/9/23 05:25, Toke Høiland-Jørgensen wrote:
Nick Cao via Bird-users <bird-users@network.cz> writes:
Resend of the patch in http://trubka.network.cz/pipermail/bird-users/2023-June/017058.html
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. --- doc/bird.sgml | 10 ++++++++++ proto/babel/babel.c | 8 +++----- proto/babel/babel.h | 8 ++++++++ proto/babel/config.Y | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/doc/bird.sgml b/doc/bird.sgml index f2063325..1a9bab87 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2209,6 +2209,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <none|etx>; next hop ipv4 <address>; next hop ipv6 <address>; extended next hop <switch>; @@ -2312,6 +2313,15 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes.
+ <tag><label id="babel-link-quality">link quality none|etx </tag> + This option specifies the link quality estimation algorithm for computing + costs based on Hello history: none or etx. The none (k-out-of-j) algorithm + is suitable for wired links that are either up, in which case they only + occasionally drop a packet, or down, in which case they drop all packets. + The Expected Transmission Cost algorithm, or etx, is suitable for wireless + links that exhibit continuous variation of the link quality. Default: etx for + wireless interfaces, none otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 4187d258..f865c089 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,10 +593,9 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done;
- switch (cf->type) + switch (cf->link_quality) { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + case BABEL_IFACE_LINK_QUALITY_NONE:
Sorry for missing this earlier, but it looks like with your patch bird will no longer honour the "wires" or "wireless" setting at all? Which will break old configs, so please don't do that.
The right way to do this is to have "wired" and "wireless" serve as "presets", and then have the link quality override that setting. So that just setting "wireless" will get the same settings as today, but setting "wired + etx" will get you just the ETX setting.
-Toke
Nick Cao <nickcao@nichi.co> writes:
The presets are still handled, in babel_iface_finish of proto/babel/config.Y.
Ah, right, I was misreading that part of your patch, sorry about that. Looks like it is, indeed, doing the right thing wrt the old keywords, so no objections to merging this :) Acked-by: Toke Høiland-Jørgensen <toke@toke.dk> -Toke
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. Changes since v3: - Rebased on v2.15.1 --- doc/bird.sgml | 10 ++++++++++ proto/babel/babel.c | 8 +++----- proto/babel/babel.h | 8 ++++++++ proto/babel/config.Y | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/doc/bird.sgml b/doc/bird.sgml index ced927d4..4825eee6 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2222,6 +2222,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <none|etx>; next hop ipv4 <address>; next hop ipv6 <address>; extended next hop <switch>; @@ -2325,6 +2326,15 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes. + <tag><label id="babel-link-quality">link quality none|etx </tag> + This option specifies the link quality estimation algorithm for computing + costs based on Hello history: none or etx. The none (k-out-of-j) algorithm + is suitable for wired links that are either up, in which case they only + occasionally drop a packet, or down, in which case they drop all packets. + The Expected Transmission Cost algorithm, or etx, is suitable for wireless + links that exhibit continuous variation of the link quality. Default: etx for + wireless interfaces, none otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the next hop address advertised for IPv4 routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 4187d258..f865c089 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,10 +593,9 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done; - switch (cf->type) + switch (cf->link_quality) { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + case BABEL_IFACE_LINK_QUALITY_NONE: /* k-out-of-j selection - Appendix 2.1 in the RFC. */ /* Link is bad if less than cf->limit/16 of expected hellos were received */ @@ -606,8 +605,7 @@ babel_update_cost(struct babel_neighbor *nbr) rxcost = cf->rxcost; txcost = nbr->txcost; break; - - case BABEL_IFACE_TYPE_WIRELESS: + case BABEL_IFACE_LINK_QUALITY_ETX: /* * ETX - Appendix 2.2 in the RFC. * diff --git a/proto/babel/babel.h b/proto/babel/babel.h index edde4cab..6a2968f1 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -118,6 +118,13 @@ enum babel_iface_type { BABEL_IFACE_TYPE_MAX }; +enum babel_iface_link_quality { + BABEL_IFACE_LINK_QUALITY_UNDEF = 0, + BABEL_IFACE_LINK_QUALITY_NONE = 1, + BABEL_IFACE_LINK_QUALITY_ETX = 2, + BABEL_IFACE_LINK_QUALITY_MAX +}; + enum babel_ae_type { BABEL_AE_WILDCARD = 0, BABEL_AE_IP4 = 1, @@ -145,6 +152,7 @@ struct babel_iface_config { u8 type; u8 limit; /* Minimum number of Hellos to keep link up */ u8 check_link; + u8 link_quality; uint port; uint hello_interval; /* Hello interval, in us */ uint ihu_interval; /* IHU interval, in us */ diff --git a/proto/babel/config.Y b/proto/babel/config.Y index d412a54b..623e74b2 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -26,7 +26,7 @@ CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, TYPE, WIRED, WIRELESS, RX, TX, BUFFER, PRIORITY, LENGTH, CHECK, LINK, NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS, ENTRIES, RANDOMIZE, ROUTER, ID, AUTHENTICATION, NONE, MAC, PERMISSIVE, - EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, COST, DELAY) + EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, COST, DELAY, QUALITY, ETX) CF_GRAMMAR @@ -84,6 +84,8 @@ babel_iface_finish: BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; if (!BABEL_IFACE->rxcost) BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } else { @@ -93,6 +95,8 @@ babel_iface_finish: BABEL_IFACE->rxcost = BABEL_RXCOST_WIRED; if (BABEL_IFACE->type == BABEL_IFACE_TYPE_TUNNEL && !BABEL_IFACE->rtt_cost) BABEL_IFACE->rtt_cost = BABEL_RXCOST_RTT; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } if (BABEL_IFACE->rtt_cost && !BABEL_IFACE->rtt_send) @@ -156,6 +160,8 @@ babel_iface_item: | TX tos { BABEL_IFACE->tx_tos = $2; } | TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } | CHECK LINK bool { BABEL_IFACE->check_link = $3; } + | LINK QUALITY NONE { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } + | LINK QUALITY ETX { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } | NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } | NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } | EXTENDED NEXT HOP bool { BABEL_IFACE->ext_next_hop = $4; } -- 2.44.0
ETX link quality estimation algorithm is useful for link types other than wireless, especially when using babel with tunnels where packet losses do occur. Changes since v4: - Rebased on v2.17 --- doc/bird.sgml | 10 ++++++++++ proto/babel/babel.c | 8 +++----- proto/babel/babel.h | 8 ++++++++ proto/babel/config.Y | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/doc/bird.sgml b/doc/bird.sgml index 33030aec5..c362ff1fb 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2323,6 +2323,7 @@ protocol babel [<name>] { rx buffer <number>; tx length <number>; check link <switch>; + link quality <none|etx>; next hop ipv4 <address>; next hop ipv6 <address>; next hop prefer native|ipv6; @@ -2427,6 +2428,15 @@ protocol babel [<name>] { hardware drivers or platforms do not implement this feature. Default: yes. + <tag><label id="babel-link-quality">link quality none|etx </tag> + This option specifies the link quality estimation algorithm for computing + costs based on Hello history: none or etx. The none (k-out-of-j) algorithm + is suitable for wired links that are either up, in which case they only + occasionally drop a packet, or down, in which case they drop all packets. + The Expected Transmission Cost algorithm, or etx, is suitable for wireless + links that exhibit continuous variation of the link quality. Default: etx for + wireless interfaces, none otherwise. + <tag><label id="babel-next-hop-ipv4">next hop ipv4 <m/address/</tag> Set the IPv4 next hop address advertised for (IPv4) routes advertised on this interface. Default: the preferred IPv4 address of the interface. diff --git a/proto/babel/babel.c b/proto/babel/babel.c index cc9bc7647..61402a736 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -593,10 +593,9 @@ babel_update_cost(struct babel_neighbor *nbr) if (!rcv || !nbr->ifa->up) goto done; - switch (cf->type) + switch (cf->link_quality) { - case BABEL_IFACE_TYPE_WIRED: - case BABEL_IFACE_TYPE_TUNNEL: + case BABEL_IFACE_LINK_QUALITY_NONE: /* k-out-of-j selection - Appendix 2.1 in the RFC. */ /* Link is bad if less than cf->limit/16 of expected hellos were received */ @@ -606,8 +605,7 @@ babel_update_cost(struct babel_neighbor *nbr) rxcost = cf->rxcost; txcost = nbr->txcost; break; - - case BABEL_IFACE_TYPE_WIRELESS: + case BABEL_IFACE_LINK_QUALITY_ETX: /* * ETX - Appendix 2.2 in the RFC. * diff --git a/proto/babel/babel.h b/proto/babel/babel.h index 7e070f2db..705dd5a5e 100644 --- a/proto/babel/babel.h +++ b/proto/babel/babel.h @@ -123,6 +123,13 @@ enum babel_next_hop_prefer { BABEL_NHP_IP6 = 1, }; +enum babel_iface_link_quality { + BABEL_IFACE_LINK_QUALITY_UNDEF = 0, + BABEL_IFACE_LINK_QUALITY_NONE = 1, + BABEL_IFACE_LINK_QUALITY_ETX = 2, + BABEL_IFACE_LINK_QUALITY_MAX +}; + enum babel_ae_type { BABEL_AE_WILDCARD = 0, BABEL_AE_IP4 = 1, @@ -150,6 +157,7 @@ struct babel_iface_config { u8 type; u8 limit; /* Minimum number of Hellos to keep link up */ u8 check_link; + u8 link_quality; uint port; uint hello_interval; /* Hello interval, in us */ uint ihu_interval; /* IHU interval, in us */ diff --git a/proto/babel/config.Y b/proto/babel/config.Y index de628f7aa..a5ec35bda 100644 --- a/proto/babel/config.Y +++ b/proto/babel/config.Y @@ -27,7 +27,7 @@ CF_KEYWORDS(BABEL, INTERFACE, METRIC, RXCOST, HELLO, UPDATE, INTERVAL, PORT, NEXT, HOP, IPV4, IPV6, BABEL_METRIC, SHOW, INTERFACES, NEIGHBORS, ENTRIES, RANDOMIZE, ROUTER, ID, AUTHENTICATION, NONE, MAC, PERMISSIVE, EXTENDED, TUNNEL, RTT, MIN, MAX, DECAY, SEND, TIMESTAMPS, COST, DELAY, - PREFER, NATIVE) + PREFER, NATIVE, QUALITY, ETX) CF_GRAMMAR @@ -85,6 +85,8 @@ babel_iface_finish: BABEL_IFACE->hello_interval = BABEL_HELLO_INTERVAL_WIRELESS; if (!BABEL_IFACE->rxcost) BABEL_IFACE->rxcost = BABEL_RXCOST_WIRELESS; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } else { @@ -94,6 +96,8 @@ babel_iface_finish: BABEL_IFACE->rxcost = BABEL_RXCOST_WIRED; if (BABEL_IFACE->type == BABEL_IFACE_TYPE_TUNNEL && !BABEL_IFACE->rtt_cost) BABEL_IFACE->rtt_cost = BABEL_RXCOST_RTT; + if (!BABEL_IFACE->link_quality) + BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } if (BABEL_IFACE->rtt_cost && !BABEL_IFACE->rtt_send) @@ -157,6 +161,8 @@ babel_iface_item: | TX tos { BABEL_IFACE->tx_tos = $2; } | TX PRIORITY expr { BABEL_IFACE->tx_priority = $3; } | CHECK LINK bool { BABEL_IFACE->check_link = $3; } + | LINK QUALITY NONE { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_NONE; } + | LINK QUALITY ETX { BABEL_IFACE->link_quality = BABEL_IFACE_LINK_QUALITY_ETX; } | NEXT HOP IPV4 ipa { BABEL_IFACE->next_hop_ip4 = $4; if (!ipa_is_ip4($4)) cf_error("Must be an IPv4 address"); } | NEXT HOP IPV6 ipa { BABEL_IFACE->next_hop_ip6 = $4; if (!ipa_is_ip6($4)) cf_error("Must be an IPv6 address"); } | NEXT HOP PREFER NATIVE { BABEL_IFACE->next_hop_prefer = BABEL_NHP_NATIVE; } -- 2.48.1
+ <tag><label id="babel-link-quality">link quality <m/switch/</tag> + If set, link quality estimation is performed on this interface.
There are multiple algorithms for estimating link quality, and the one currently implemented by BIRD is ETX. Hence, I feel that this should not be a mere switch, but a selector with possible values none etx in case we ever choose to implement some other LQ algorithm. -- Juliusz
participants (4)
-
Juliusz Chroboczek -
Nick Cao -
Ondrej Zajicek -
Toke Høiland-Jørgensen