Routing
How AthenaBNG's control plane advertises subscribers and integrates with the core via FRRouting.
Overview
AthenaBNG separates routing into two planes with distinct jobs:
- IGP (IS-IS) carries only the router loopback reachability across the core, so iBGP can peer loopback-to-loopback.
- BGP carries subscribers (as a route policy) and handles upstream/core peering.
Subscribers are never injected into the IGP. This keeps the IGP small and stable while BGP scales to hold the subscriber table.
The IGP: IS-IS (loopback carrier)
IS-IS runs as a single, dual-stack (IPv4 + IPv6) instance —
single-topology, metric-style wide. Its sole purpose is to advertise the
router's loopback:
- The IPv4 loopback (
system.router_id/32) is exported into IS-IS via a route-map matched to the loopback only (ISIS-EXPORT/ISIS-LOOPBACK). - The IPv6 loopback (
system.router_id_v6/128), when configured, is advertised via a passiveinterface lostanza (ipv6 router isis+isis passive). This is a deliberate quirk: FRR isisd does not emit loopback/128s throughredistribute ipv6 connectedthe way it does for IPv4, so the loopback address is activated passively (no hellos, just the address).
Core interfaces are activated explicitly (isis.interfaces), typically as
point-to-point to skip DIS election. Subscribers stay out of IS-IS.
The subscriber plane: BGP
IPv4 — per-host routes
When announce_subscriber_routes is on:
- Subscriber session established (PPPoE or IPoE/DHCP).
- Subscriber IP assigned (e.g.
100.64.0.10). - A
/32host route appears in the kernel (via the subscriber interface). - FRR redistributes it into the BGP IPv4 unicast AF through the
SUB-ROUTES-TO-BGProute-map, which permits only/32s that fall within the configuredsubscriber_networksand excludes the router loopback. - The route is advertised to BGP neighbours; upstream can reach the subscriber directly.
When the subscriber disconnects the kernel route is removed, FRR withdraws it, and neighbours receive the withdrawal.
IPv6 — aggregate only
IPv6 is handled differently. Instead of per-customer routes, BGP announces the aggregate only:
- Each
subscriber_networks_v6entry rendersaggregate-address <net> summary-onlyin the IPv6 unicast AF. - A matching
ipv6 route <net> blackholegives the aggregate a permanent contributing route, so the aggregate is announced even with zero active subscribers, and traffic to unallocated space is discarded (no loop back to the core). - Per-customer delegated prefixes (typically
/56) are installed locally for forwarding but suppressed from BGP bysummary-only.
Per-subscriber IPv6 prefixes come solely from RADIUS (fail-closed — no local pool); the BNG never invents a prefix, so a session with no RADIUS-supplied prefix degrades to IPv4-only.
iBGP: loopback-to-loopback
iBGP peers are reached over the loopbacks that IS-IS carries, using
update-source lo:
- IPv4 neighbours join the
UPSTREAMpeer-group and are activated underaddress-family ipv4 unicast. - IPv6 neighbours join a separate
UPSTREAM6peer-group, activated underaddress-family ipv6 unicastwithnext-hop-self. IPv6 iBGP runs natively over the v6 loopbacks — v6 NLRI over a v6 session, not v6-over-v4. no bgp default ipv4-unicastensures a v6-only peer is not auto-activated for IPv4.
OSPF
OSPF is still supported as a legacy IGP option (routing.ospf) but IS-IS is the
current, recommended IGP. In the reference deployment the upstream routers run
OSPF while migrating to IS-IS; see
BGP/OSPF Integration for the interop detail.
Configuration
system:
router_id: "10.255.0.4"
router_id_v6: "2001:df4:2040::4"
routing:
isis:
enabled: true
net: "49.0001.0000.0000.0004.00"
interfaces:
- name: upstream0
network_type: point-to-point
bgp:
enabled: true
asn: 64512
neighbors:
- address: "10.255.0.1"
remote_as: 64512
update_source: "lo"
- address: "2001:df4:2040::1"
remote_as: 64512
update_source: "lo"
announce_subscriber_routes: true
subscriber_networks: ["100.64.0.0/10"]
announce_subscriber_routes_v6: true
subscriber_networks_v6: ["2001:df4:2040:1000::/52"]
See Routing Configuration for every knob.
Monitoring
abng> show bgp summary
abng> show routes
sudo vtysh -c "show isis neighbor"
sudo vtysh -c "show bgp ipv4 unicast"
sudo vtysh -c "show bgp ipv6 unicast"
Troubleshooting
iBGP not establishing
- Confirm the peer loopback is reachable via IS-IS, then
pingit. - Confirm
update_source: loon both ends. - For v6 peers, confirm
router_id_v6is set and in IS-IS.
IPv4 subscriber routes not advertised
- Check
announce_subscriber_routesand that the IP is withinsubscriber_networks. sudo vtysh -c "show bgp ipv4 unicast".
IPv6 aggregate not advertised
The per-customer prefixes are suppressed by design — check the aggregate:
sudo vtysh -c "show bgp ipv6 unicast 2001:df4:2040:1000::/52"
If it is missing, confirm the ipv6 route … blackhole contributor exists
(announce_subscriber_routes_v6 must be on).
Best practices
- Keep IS-IS loopback-only; let BGP carry subscribers.
- Peer iBGP loopback-to-loopback with
update_source: lo. - Announce the IPv6 aggregate, never per-customer more-specifics.
- Use
point-to-pointIS-IS on core links. - Monitor BGP session state and IS-IS adjacencies.
Next steps
- RADIUS AAA — subscriber authentication and address assignment
- BGP/OSPF Integration — upstream interop
- Monitoring — Prometheus and syslog