Rayhaan JaufeerallyandClaude Fable 5.1 a4a180e948 Make the session state machine explicit and free of I/O
A session was one function that walked OpenSent, OpenConfirm and
Established with the socket, the timers, collision detection, the registry
and the RIB all in the same loop. There was no state or event type, and no
way to test a transition without a TCP connection.

It is now two pieces:

- fsm.rs is the state machine of RFC 4271 section 8 for a connection. It
  takes an Event and returns the Actions to carry out. It owns no socket,
  timer or task. What the OPENs negotiated lives in the states that have
  it, so there is nothing to unwrap. Thirteen tests cover the handshake,
  hold-time negotiation, refused OPENs, messages out of turn, timer expiry,
  collisions and shutdown by feeding it events.
- connection.rs is the driver: it turns the socket, the timers and the
  outbound queue into events and carries the actions out.

Behaviour changes:

- A message that arrived in pieces was lost if a timer fired between the
  pieces: read_exact was used inside select!, which discards what it has
  read when another branch wins. Messages are now framed from a buffer
  that survives cancellation.
- A NOTIFICATION from the peer during the handshake is no longer answered
  with an FSM error; RFC 4271 says to close without replying.
- A session the peer ended is reported as 'peer sent NOTIFICATION: ...'
  with its error, where the dialer used to record 'session closed by peer'.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-01 21:59:55 +02:00
2026-10-01 21:01:26 +02:00

BGP

The bgp crate is an implementation of the Border Gateway Protocol, which is used to exchange routing and control plane information between Autonomous Systems.

The aim of this project is to provide a modern, high performance, secure, programmatic and customizable software package that can be useful to network operators, researchers, and people interested in Internet.

Current status.

The project is currently being rewritten from scratch to be more modular and maintainable, as well as to fix deeper issues with the previous implementation.

⚠️ Warning: This is currently a work in progress and not ready for use.

🛣️ Roadmap to v1.0

We aim for the 1.0 release to be functional and stable to operate peering sessions, and to install routes in the Linux Kernel.

  • ☐ Implement basic parsers for the fundamental types required
    • ✅ Path Attributes from RFC4271
    • ✅ Open message
      • ✅ Capabilities from RFC4271
    • ✅ Update message
    • ☐ Notification message
  • ✅ Implement scaffolding required to start and configure a server
  • ✅ Implement connection logic to establish sessions with peers (passive and active)
  • ✅ Routes originated from the configuration, with communities, announced to all peers
  • ✅ Read-only HTTP API, status page and Prometheus metrics
  • ☐ Implement an efficient data structure for storing prefixes (e.g. Poptrie)
  • ☐ Filtering for peer RIB in / out
  • ☐ Main / auxiliary RIBs for exchanging routes between peers

Development

CI runs these three on every push, and fails on any warning:

cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace

Lints are configured once, under [workspace.lints] in the root Cargo.toml. unsafe code is forbidden throughout.

License

Apache License 2.0; see LICENSE.

S
Description
Ferrix BGP Speaker
Readme
5 MiB
0 Stars 0 Watchers 0 Forks
Languages
Rust 92.3%
Shell 4.2%
HTML 3.5%