Skip to content

Conversation

@snormore
Copy link
Contributor

@snormore snormore commented Oct 29, 2025

Summary of Changes

  • Adds support for Route Liveness Probing in the doublezerod client daemon, opt-in via the --route-probing-enable flag.
  • Introduces a new probing subsystem integrated at the BGP plugin level, defined per service type (IBRL, IBRL with allocated IP, multicast).
    • Currently, probing is enabled only for the IBRL (without allocated IP) service, where fallback reachability over the public internet path is built-in.
  • Performs ICMP-based reachability checks for all BGP-learned routes:
    • Routes in UP state are installed in the kernel routing table.
    • Routes in DOWN state are withdrawn from the kernel routing table until recovery.
  • Implements a hysteresis-based liveness policy, requiring configurable consecutive successes or failures before transitioning between UP and DOWN.
    • The policy layer is pluggable, allowing future liveness evaluation strategies.
  • Adds a user-space ICMP listener that receives echo replies over the doublezero0 interface even when the corresponding route is not installed in the kernel table.
    • Without this, the kernel ICMP responder would send replies over the internet rather than through doublezero0, preventing successful validation of otherwise reachable peers.
  • Closes client/probing: initial daemon integration #1961
  • Context: RFC: Client Route Liveness Probing #2018
  • NOTE: Prometheus metrics will be added in a follow-up PR: client/probing: prometheus metrics #1964

Testing Verification

@snormore snormore force-pushed the snor/client-probing-mvp branch 5 times, most recently from 3324c15 to c5e6c98 Compare October 29, 2025 22:29
@snormore snormore requested a review from Copilot October 29, 2025 22:35
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Adds support for Route Liveness Probing in the doublezerod client daemon, opt-in via the --route-probing-enable flag. This introduces a new probing subsystem integrated at the BGP plugin level that performs ICMP-based reachability checks for BGP-learned routes with hysteresis-based liveness policy.

  • Implements route liveness probing for IBRL service with ICMP echo requests and hysteresis-based state transitions
  • Adds user-space ICMP listener for probe responses over the doublezero0 interface
  • Integrates probing system into BGP plugin with configurable route manager abstraction

Reviewed Changes

Copilot reviewed 44 out of 45 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tools/uping/pkg/uping/listener.go Changes logging from Info to Debug level for listener events
tools/uping/cmd/uping-send/main.go Adds Linux-only build constraint
tools/uping/cmd/uping-recv/main.go Adds Linux-only build constraint
tools/twamp/pkg/light/stub_fallback.go Removes deprecated build constraint syntax
go.mod Updates prometheus-community/pro-bing dependency version
e2e/multi_client_test.go Disables route probing in E2E tests until containerized connectivity is resolved
e2e/internal/rpc/agent_test.go Adds binary availability check for doublezero
e2e/internal/devnet/device.go Increases device container memory allocation
e2e/internal/devnet/cmd/add-client.go Adds route probing enable flag
e2e/internal/devnet/client.go Adds route probing configuration support
e2e/ibrl_test.go Removes unused parameter from test helper function
e2e/docker/client/entrypoint.sh Adds client flags environment variable support
e2e/docker/client/Dockerfile Adds uping tools and additional packages
e2e/docker/base.dockerfile Builds uping tools in base image
client/doublezerod/internal/services/services_test.go Updates service creation calls for new route manager abstraction
client/doublezerod/internal/services/multicast.go Adds route manager integration
client/doublezerod/internal/services/ibrl.go Adds route manager integration and fixes error message
client/doublezerod/internal/services/edgefiltering.go Adds route manager integration
client/doublezerod/internal/services/base.go Adds NewRouteManagerFunc type definition
client/doublezerod/internal/runtime/run_test.go Updates tests for new runtime Run signature
client/doublezerod/internal/runtime/run.go Refactors to accept NetlinkManager parameter
client/doublezerod/internal/routing/routes.go Adds nil safety checks to Route.String() method
client/doublezerod/internal/routing/netlink.go Improves error handling for route deletion
client/doublezerod/internal/routing/errors.go Adds ErrRouteNotFound error
client/doublezerod/internal/probing/ Complete probing subsystem implementation with worker, manager, liveness tracking, and configuration
client/doublezerod/internal/manager/services.go Adds service creation functions with route manager abstraction
client/doublezerod/internal/manager/manager.go Updates manager to use pluggable service creation
client/doublezerod/internal/manager/http_test.go Updates tests for new manager constructor
client/doublezerod/internal/bgp/plugin.go Replaces RouteReaderWriter with RouteManager interface
client/doublezerod/internal/bgp/bgp_test.go Updates tests for new route manager interface
client/doublezerod/internal/bgp/bgp.go Updates BGP server for route manager integration
client/doublezerod/cmd/doublezerod/main.go Adds route probing command-line flags and configuration
CHANGELOG.md Documents new route liveness probing feature

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@snormore snormore force-pushed the snor/client-probing-mvp branch 10 times, most recently from 8091586 to 330297c Compare October 31, 2025 13:23
@snormore snormore marked this pull request as ready for review October 31, 2025 14:54
@snormore snormore force-pushed the snor/client-probing-mvp branch 4 times, most recently from 5c78943 to b8d82d2 Compare November 2, 2025 15:41
@snormore snormore force-pushed the snor/client-probing-mvp branch from b8d82d2 to b535b34 Compare November 2, 2025 15:51
@snormore snormore force-pushed the snor/client-probing-mvp branch from 42fa110 to 19dce48 Compare November 2, 2025 16:51
@snormore snormore force-pushed the snor/client-probing-mvp branch from e9bc00b to 05fa482 Compare November 2, 2025 17:06
@snormore snormore changed the title client/daemon: route liveness probing client/daemon: initial route liveness probing Nov 2, 2025
@snormore snormore force-pushed the snor/client-probing-mvp branch 4 times, most recently from 6858075 to 9a23120 Compare November 2, 2025 17:50
@snormore snormore force-pushed the snor/client-probing-mvp branch from 9a23120 to 0fc68e9 Compare November 2, 2025 17:53
@snormore snormore force-pushed the snor/client-probing-mvp branch from 0057599 to 1726950 Compare November 2, 2025 20:17
@snormore snormore force-pushed the snor/client-probing-mvp branch from f0c09c7 to 3551325 Compare November 3, 2025 15:36
@snormore snormore marked this pull request as draft November 3, 2025 19:15
@snormore snormore closed this Nov 7, 2025
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.

client/probing: initial daemon integration

2 participants