summaryrefslogtreecommitdiffhomepage
path: root/derp/derphttp/derphttp_client.go
diff options
context:
space:
mode:
Diffstat (limited to 'derp/derphttp/derphttp_client.go')
-rw-r--r--derp/derphttp/derphttp_client.go20
1 files changed, 18 insertions, 2 deletions
diff --git a/derp/derphttp/derphttp_client.go b/derp/derphttp/derphttp_client.go
index 07317fcbf..cb5d4acae 100644
--- a/derp/derphttp/derphttp_client.go
+++ b/derp/derphttp/derphttp_client.go
@@ -851,7 +851,7 @@ func (c *Client) SendPing(data [8]byte) error {
return ErrClientClosed
}
if client == nil {
- return errors.New("client not connected")
+ return ErrClientNotConnected
}
return client.SendPing(data)
}
@@ -866,11 +866,26 @@ func (c *Client) LocalAddr() (netip.AddrPort, error) {
return netip.AddrPort{}, ErrClientClosed
}
if client == nil {
- return netip.AddrPort{}, errors.New("client not connected")
+ return netip.AddrPort{}, ErrClientNotConnected
}
return client.LocalAddr()
}
+// RTT reports the TCP RTT for the currently-active DERP connection, without
+// any implicit connect or reconnect.
+func (c *Client) RTT() (time.Duration, error) {
+ c.mu.Lock()
+ closed, client := c.closed, c.client
+ c.mu.Unlock()
+ if closed {
+ return 0, ErrClientClosed
+ }
+ if client == nil {
+ return 0, ErrClientNotConnected
+ }
+ return client.RTT()
+}
+
func (c *Client) ForwardPacket(from, to key.NodePublic, b []byte) error {
client, _, err := c.connect(context.TODO(), "derphttp.Client.ForwardPacket")
if err != nil {
@@ -1045,6 +1060,7 @@ func (c *Client) closeForReconnect(brokenClient *derp.Client) {
}
var ErrClientClosed = errors.New("derphttp.Client closed")
+var ErrClientNotConnected = errors.New("client not connected")
func parseMetaCert(certs []*x509.Certificate) (serverPub key.NodePublic, serverProtoVersion int) {
for _, cert := range certs {