Repository navigation
1.1.0
BNG Blaster 1.1.0
This release adds BGP L2VPN (RFC 6624), EVPN E-LAN, targeted LDP, LAG member flapping and LACP passive mode. It also makes BGP and TCP more robust at scale, adds a containerlab example, and fixes many bugs found by a code review of the whole code base, including LSPGEN.
New features
Routing
- BGP L2VPN (RFC 6624): BGP sessions with the family
l2vpnlearn the label blocks of remote CEs, which the new commandbgp-l2vpn-routesshows. Traffic streams withbgp-l2vpn-rd,bgp-l2vpn-ce-idandbgp-l2vpn-local-ce-idsend Ethernet over MPLS frames over the pseudowire to the remote CE. - EVPN E-LAN: traffic streams with
bgp-evpn-elansend to the label of the MAC/IP route of the destination (known unicast). If the MAC isn't learned, they fall back to the ingress replication label of the IMET route (unknown unicast). The new stream optiontx-control-wordadds the PW control word to EVPN VPWS and E-LAN traffic. A new EVPN test guide is part of the documentation. - Targeted LDP (RFC 5036 extended discovery) for IPv4 and IPv6, configured with the new LDP options
targeted-neighbors,targeted-hold-timeandtargeted-hello-accept. - LDP label withdraw: LDP now handles label withdraw messages and the loss of a session. Streams stop sending until the label is advertised again, and
ldp-databaseshows whether each entry is active. - BGP TCP-AO: the new BGP option
tcp-ao-exclude-optionskeeps TCP options other than TCP-AO out of the MAC (RFC 5925). This is required for TCP-AO sessions with Junos unlesstcp-ao-optionis enabled there. - Routing teardown order: BGP and LDP sessions are now closed before IS-IS and OSPF withdraw their routes, so that sessions between loopbacks close cleanly. The new IS-IS and OSPF option
teardown-delaydelays the withdraw further.
Access
- PPPoE
lcp-restartcommand: sends a new LCP Configure-Request on established sessions without PADT, to test LCP renegotiation on the BNG (#360). - L2TP proxy authentication on the LNS: if the ICCN carries Proxy Authen AVPs, the LNS answers PAP or CHAP at once instead of waiting for a retransmission (#154). The new
l2tp-serveroptionproxy-auth(defaulttrue) turns this off. - L2TP tunnel session counts:
l2tp-tunnelsnow showssessionsandsessions-establishedfor every tunnel. - PPPoE MRU limit: the LCP MRU is now limited to the PPP-Max-Payload (RFC 4638). Larger MRUs are answered with Configure-Nak and counted as
lcp-mru-invalid.
Interfaces and I/O
- LAG monkey: with the new LAG option
monkey, one random member interface is disabled or enabled every 30 seconds. It is controlled withmonkey-startandmonkey-stop, like the session monkey. - LACP passive mode: the new LAG option
lacp-passive(defaultfalse) clears the LACP activity flag. The first LACPDU is now sent as soon as a member is added. Before, it went out only after the first periodic interval, which delayed the LAG by 30 seconds with the long timeout. - Gratuitous ARP and unsolicited NA: the new network interface options
gratuitous-arpandunsolicited-naannounce all interface addresses at the start and, withannounce-interval, periodically. The new commandnetwork-announcerestarts the announcements. They are counted astx-garpandtx-unsolicited-na. - AF_XDP
copy-rxmode: the newaf-xdp-modevaluecopy-rxbinds the RX queues in copy mode and the TX queues in zero-copy mode. This is for NICs like the i40e with an IOMMU in translation mode, where zero-copy RX fails while zero-copy TX works. - Stream capture: with
capture-include-streams, the capture now includes stream packets sent and received by the TX and RX threads. The outer VLAN that the kernel stripped is restored for these packets. - Logging: the log now includes the process ID at the start, and the thread ID and CPU of every I/O thread.
Container and containerlab
- The container image now includes bash completion for
bngblaster-cliand the other tools, also indocker execshells. - The image includes the BNG Blaster controller 1.1.1, which can start a test automatically and wait for its interfaces. It also provides a health check and writes the report when the container is stopped.
- New example
examples/containerlab/pppoe: a PPPoE lab for containerlab.
Improvements
- BGP at scale:
- A single listen socket now accepts sessions of any local address. Before, at most 256 local addresses could be used.
- Received segments find their session in a hashtable instead of searching a list. This was 30% of the CPU with 1000 sessions.
- TCP: data queued from timers or the control socket is now sent at once, instead of with the next received packet or the 500 ms poll. Sending also resumes after a full TX queue. This fixes stalled raw updates with many parallel BGP sessions.
- BGP teardown: sessions with pending data are now closed with RST, so that teardown doesn't wait for a peer that has stopped reading. The notification is no longer sent behind a partially sent raw update. BGP notifications are logged with their data and the shutdown communication.
- PACKET_MMAP: jumbo frames are rounded up to the page size, so that they also work on systems with 16K or 64K pages (e.g. aarch64).
Bug fixes
Access
- A10NSP: every 65536th session got the reserved PPPoE session ID 0 and hung in PPPoE Request.
- DHCPv6: an Advertise or Reply was ignored if one of the requested IAs returned a status code (e.g. IA_PD with NoPrefixAvail). The client then sent Solicits forever.
- DHCPv6: IA_NA and IA_PD timers and lifetimes were sent in the wrong byte order.
- DHCP: decoding of a repeated relay agent information option.
- L2TP: TX buffer overflow, retry backoff shift, and a stack overflow of
l2tp-csurqwith many sessions.
Routing
- IS-IS: own LSPs are now re-originated if the neighbor floods back a purge with the same sequence number. Before, the BNG Blaster stayed unreachable after a restart until the next LSP refresh.
- IS-IS: LSP garbage collection removed level 1 LSPs from the level 2 database as well, which could overflow the stack.
- IS-IS: hello neighbor TLV overflow and cleartext authentication.
- OSPF: LSAs of type 43 are now rejected, and short packets are decoded correctly (also IGMP).
- LDP: decoding of invalid lengths when receiving and in raw updates.
- BGP: the
bgp-sessions,bgp-raw-updateandbgp-disconnectcommands applied the IPv6 address filters to IPv4 sessions as well. - BGP: read buffer rebase.
Interfaces, streams and control socket
- LAG: disabling a member of a LAG without LACP left it active, and its streams were lost. LAGs without LACP are now limited to 64 links.
- LACP: decoding of invalid TLVs.
- Streams:
stream-updateof streams without I/O and with invalid rates. - Streams: the label databases are now locked while TX threads search them.
- Control socket: commands that walk dynamic structures (
session-info,l2tp-tunnels,l2tp-sessions,isis-database,ospf-database,ldp-database,li-flows) now run in the main loop, which fixes races. Argument conversion is fixed as well. - Signals: teardown signals are now handled in the main thread only. Log output and ncurses output are serialized.
- Timers: a use-after-free of timer owners after
timer_del, and a skipped timer when a callback moved its timer. - I/O: PACKET_MMAP now uses the captured length and acquire/release ordering of the frame status.
- Configuration: integer values outside the range in the schema are now rejected (e.g.
tx-interval,rx-cpuset, IS-ISsr-algo), as are non-string IS-IS area entries, which crashed. - Utilities: parsing of prefix lengths and ISO addresses.
- ICMP client: a request data overflow with size 0 or 1.
- LI flow keys, HTTP response parsing, and TUN and ARP client errors.
- Schema: the default of DHCPv6
ia-separateis nowfalse, as in the code and the documentation.
LSPGEN
LSPGEN got many fixes and new unit tests, among them:
- OSPF packet checksum, area ID byte order, prefix SIDs, network masks and connectors.
- IS-IS fragmentation and connector parsing.
- Links between subgraphs of large topologies.
- Reading of config files (root node, OSPF link IDs and prefixes, OSPFv3 hostnames, IS-IS router capabilities). Config files with errors are now rejected.
- Control socket error handling.
- Memory leaks, buffer overflows and out of bounds reads.
- Graphviz is now executed without a shell.
Documentation
- New EVPN test guide.
- The performance guide is updated for AF_XDP and stream capture.
- Documentation for targeted LDP, BGP L2VPN, L2TP proxy authentication and the LSPGEN tool is updated.
- Epoch values in the API are now documented as monotonic clock seconds.
Full changelog: 1.0.2...1.1.0