Skip to content

Conversation

@sinuscosinustan
Copy link

Description

This PR fixes three edge cases in the FRR parser that cause failures:

  1. Empty route query results (when a route is not in the RIB)
  2. Missing optional fields (metric and used) on next-hops in multipath routes
  3. Local prefixes with zero-length AS_PATH

Please see individual commit messages for detailed explanations and examples.

Related Issues

None that I could find.

Motivation and Context

When I set up hyperglass backed by an FRR instance I noticed that some edge cases cause the parser to fail (like a route that's not in the DFZ and so on).

Tests

Test Environment: Docker on Ubuntu 24.04, with FRR as device

Devices Tested: FRR 10.4.1 with bgpd enabled

Test Cases:

  • Empty route queries (routes not in RIB)
  • Multipath routes with missing optional next-hop attributes
  • Local prefixes with zero-length AS_PATH

In case a route is not present in the RIB, FRR returns an empty JSON
object:

```
$ vtysh -c "show bgp ipv4 unicast 1.2.3.4 json"
{}
```

Skip these empty objects to prevent the parser from failing.

Signed-off-by: Tan Siewert <[email protected]>
The metric and used fields might not be returned, causing the parser to
fail if they are not present. The absence was observed in FRR 10.4.1
with a multipath IPv6 route that has two next-hops (one GUA, one LL):
```
$ vtysh -c "show bgp ipv6 unicast 2003::/19 json" | jq '.paths[].nexthops'
[
  {
    "ip": "2a0d:2146:bdff:120::1",
    "afi": "ipv6",
    "scope": "global",
    "linkLocalOnly": false,
    "length": 32,
    "metric": 0,
    "accessible": true
  },
  {
    "ip": "fe80::3e61:408:1e3e:cff0",
    "afi": "ipv6",
    "scope": "link-local",
    "length": 32,
    "accessible": true,
    "used": true
  }
]
[
  {
    "ip": "2a0d:2146:bdff:120::1",
    "afi": "ipv6",
    "scope": "global",
    "linkLocalOnly": false,
    "length": 32,
    "metric": 0,
    "accessible": true
  },
  {
    "ip": "fe80::3e61:408:1e3e:cff0",
    "afi": "ipv6",
    "scope": "link-local",
    "length": 32,
    "accessible": true,
    "used": true
  }
]
```

Tested: Query a prefix with multiple next-hops where the metric or used
attributes are missing on one of them.

Signed-off-by: Tan Siewert <[email protected]>
Local prefixes usually do not have an AS_PATH:
```
vtysh -c "show bgp ipv4 unicast 10.10.10.10 json" | jq '.paths[].aspath'
{
  "string": "Local",
  "segments": [],
  "length": 0
}
```

Set AS0 as a temporary solution when AS_PATH length is zero. This
avoids parser failures for local prefixes, though ideally we should
use the device's actual ASN (see TODO in code).

Signed-off-by: Tan Siewert <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant