Commit Graph

34 Commits

Author SHA1 Message Date
Zoltán Papp
dfbc0ef6f1 [client] Extract handleReceiveError to simplify receive logic
Refactor error handling in `receive` to a dedicated `handleReceiveError` method. Streamlines the main logic and isolates error recovery, including backoff reset and connection recreation.
2026-04-01 12:34:40 +02:00
Zoltán Papp
77c583b9df [client] Replace receivedAcks map with atomic counter and improve stream establishment sync in tests
Refactor acknowledgment tracking in tests to use an `atomic.Int32` counter instead of a map. Replace fixed sleep with robust synchronization by waiting on `handlerStarted` signal for stream establishment.
2026-04-01 12:30:46 +02:00
Zoltán Papp
bb7406aa0d [client] Add handlerStarted channel to synchronize stream establishment in tests
Introduce `handlerStarted` channel in the test server to signal when the server-side handler begins, ensuring robust synchronization between client and server during stream establishment. Update relevant test cases to wait for this signal before proceeding.
2026-04-01 12:20:37 +02:00
Zoltán Papp
72bff35751 [client] IPv6 friendly connection
parsedURL.Hostname() strips IPv6 brackets. For http://[::1]:443, this turns it into ::1:443, which is not a valid host:port target for gRPC. Additionally, fmt.Sprintf("%s:%s", hostname, port) produces a trailing colon when the URL has no explicit port—http://example.com becomes example.com:. Both cases break the initial dial and reconnect paths. Use parsedURL.Host directly instead.
2026-04-01 12:18:47 +02:00
Zoltán Papp
2985856900 [client] Introduce minHealthyDuration to refine backoff reset logic
Add `minHealthyDuration` constant to ensure stream retries only reset the backoff timer if the stream survives beyond a minimum duration. Prevents unhealthy, short-lived streams from interfering with `MaxElapsedTime`.
2026-04-01 12:12:35 +02:00
Zoltán Papp
e7ecb5f1f7 [client] Add backoff reset condition to prevent short-lived retry cycles
Refine backoff reset logic to ensure it only occurs for sufficiently long-lived stream connections, avoiding interference with `MaxElapsedTime`.
2026-04-01 12:11:39 +02:00
Zoltán Papp
2a7dafcad4 [client] Add connection generation tracking to prevent stale reconnections
Introduce `connGen` to track connection generations and ensure that stale `recreateConnection` calls do not override newer connections. Update stream establishment and reconnection logic to incorporate generation validation.
2026-04-01 12:07:17 +02:00
Zoltán Papp
506cb0d854 [client] Rename isCancellation to isContextDone and extend handling for DeadlineExceeded
Refactor error handling to include `DeadlineExceeded` scenarios alongside `Canceled`. Update related condition checks for consistency.
2026-04-01 12:03:13 +02:00
Zoltán Papp
d5078d0fa8 [client] Refactor connection handling to use explicit target tracking
Introduce `target` field to store the gRPC connection target directly, simplifying reconnections and ensuring consistent connection reuse logic.
2026-04-01 11:59:18 +02:00
Zoltán Papp
297546e714 [client] Prevent panic on nil connection during Close 2026-04-01 11:36:48 +02:00
Zoltán Papp
8460c3f375 [client] Wait for Events handler to exit in RST_STREAM reconnection test
Ensure the old `Events` handler exits fully before proceeding in the reconnection test to avoid dropped acknowledgments on a broken stream. Add a `handlerDone` channel to synchronize handler exits.
2026-04-01 11:30:26 +02:00
Zoltán Papp
0b8704f36a [client] Adjust connection tracking in reconnection test 2026-04-01 10:43:02 +02:00
Zoltán Papp
910e6668dc [client] Fine-tune the tests 2026-04-01 10:34:35 +02:00
Zoltán Papp
441a85f00f [client] Update Close error message in test for clarity 2026-03-31 23:12:25 +02:00
Zoltán Papp
b4194f8fa8 [client] Add protocol error simulation and enhance reconnection test
Introduce `connTrackListener` to simulate HTTP/2 RST_STREAM with PROTOCOL_ERROR for testing. Refactor and rename `TestReceive_ServerClosesStream` to `TestReceive_ProtocolErrorStreamReconnect` to verify client recovery on protocol errors.
2026-03-31 23:09:07 +02:00
Zoltán Papp
aff14285e3 [client] Add test for handling server-side stream closure and reconnection
Introduce `TestReceive_ServerClosesStream` to verify the client's ability to recover and process acknowledgments after the server closes the stream. Enhance test server with a controlled stream closure mechanism.
2026-03-31 23:00:12 +02:00
Zoltán Papp
62a6dc9386 [client] Ensure stream closure on error during initialization 2026-03-31 22:47:39 +02:00
Zoltán Papp
03f023b00a [client] Reset backoff 2026-03-31 22:22:48 +02:00
Zoltán Papp
e9007f7191 [client] Fix connection swap to properly close old gRPC connection
Close the old `gRPC.ClientConn` after successfully swapping to a new connection during reconnection.
2026-03-31 16:49:41 +02:00
Zoltán Papp
11e9c052b4 [client] Add graceful shutdown handling and test for concurrent Close during Receive
Prevent reconnection attempts after client closure by tracking a `closed` flag. Use `backoff.Permanent` for errors caused by operations on a closed client. Add a test to ensure `Close` does not block when `Receive` is actively running.
2026-03-31 16:35:35 +02:00
Zoltán Papp
bb9ead4e62 Fix test 2026-03-31 16:12:17 +02:00
Zoltán Papp
8ba4183acd [client] Fix error handling in Receive to properly re-establish stream and improve reconnection messaging 2026-03-31 15:50:03 +02:00
Zoltán Papp
a178ec785d [client] Remove Unauthenticated, PermissionDenied, and Unimplemented from permanent error handling 2026-03-31 15:31:46 +02:00
Zoltán Papp
863f1d88b8 [client] Add connection recreation and improve flow client error handling
Store gRPC dial options on the client to enable connection recreation
on Internal errors (RST_STREAM/PROTOCOL_ERROR). Treat Unauthenticated,
PermissionDenied, and Unimplemented as permanent failures. Unify mutex
usage and add reconnection logging for better observability.
2026-03-31 15:26:01 +02:00
Zoltán Papp
fae50520ff [client] remove WaitForReady from stream open call
grpc.WaitForReady(true) parks the RPC call internally until the
connection reaches READY, only unblocking on ctx cancellation.
This means the external backoff.Retry loop in Receive() never gets
control back during a connection outage — it cannot tick, log, or
apply its retry intervals while WaitForReady is blocking.

Removing it restores fail-fast behaviour: Events() returns immediately
with codes.Unavailable when the connection is not ready, which is
exactly what the backoff loop expects. The backoff becomes the single
authority over retry timing and cadence, as originally intended.
2026-03-31 14:56:01 +02:00
Zoltán Papp
13dfc5fcdd [client] Fix flow client Receive retry loop not stopping after Close
Use backoff.Permanent for canceled gRPC errors so Receive returns
immediately instead of retrying until context deadline when the
connection is already closed. Add TestNewClient_PermanentClose to
verify the behavior.

The connectivity.Shutdown check was meaningless because when the connection is
shut down, c.realClient.Events(ctx, grpc.WaitForReady(true)) on the nex line
already fails with codes.Canceled — which is now handled as a permanent error.
The explicit state check was just duplicating what gRPC already reports
through its normal error path.
2026-03-31 14:50:25 +02:00
Viktor Liu
4d7e59f199 [client,signal,management] Adjust browser client ws proxy paths (#4565) 2025-10-02 00:10:47 +02:00
Viktor Liu
b5daec3b51 [client,signal,management] Add browser client support (#4415) 2025-10-01 20:10:11 +02:00
Viktor Liu
55126f990c [client] Use native windows sock opts to avoid routing loops (#4314)
- Move `util/grpc` and `util/net` to `client` so `internal` packages can be accessed
 - Add methods to return the next best interface after the NetBird interface.
- Use `IP_UNICAST_IF` sock opt to force the outgoing interface for the NetBird `net.Dialer` and `net.ListenerConfig` to avoid routing loops. The interface is picked by the new route lookup method.
- Some refactoring to avoid import cycles
- Old behavior is available through `NB_USE_LEGACY_ROUTING=true` env var
2025-09-20 09:31:04 +02:00
Viktor Liu
29a6e5be71 [client] Stop flow grpc receiver properly (#3596) 2025-03-28 16:08:31 +01:00
Maycon Santos
8b4c0c58e4 [client] Add initiator field to ack (#3563)
added the new field and client handling
2025-03-22 22:22:34 +01:00
Viktor Liu
2bbe0f3f09 [client] Don't permanently fail on flow grpc shutdown (#3557) 2025-03-22 11:56:00 +01:00
Maycon Santos
d9d051cb1e Add initiator field and parse url (#3558)
- Add initiator field to flow proto
- Parse URL
- Update a few trace logs
2025-03-21 14:47:04 +01:00
Maycon Santos
c02e236196 [client,management] add netflow support to client and update management (#3414)
adds NetFlow functionality to track and log network traffic information between peers, with features including:

- Flow logging for TCP, UDP, and ICMP traffic
- Integration with connection tracking system
- Resource ID tracking in NetFlow events
- DNS and exit node collection configuration
- Flow API and Redis cache in management
- Memory-based flow storage implementation
- Kernel conntrack counters and userspace counters
- TCP state machine improvements for more accurate tracking
- Migration from net.IP to netip.Addr in the userspace firewall
2025-03-20 17:05:48 +01:00