75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
package diagnostic
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
const MicrosecondsFactor = 1000.0
|
|
|
|
// For now only support ICMP is provided.
|
|
type IPVersion int
|
|
|
|
const (
|
|
V4 IPVersion = iota
|
|
V6 IPVersion = iota
|
|
)
|
|
|
|
type Hop struct {
|
|
Hop uint8 `json:"hop,omitempty"` // hop number along the route
|
|
Domain string `json:"domain,omitempty"` // domain and/or ip of the hop, this field will be '*' if the hop is a timeout
|
|
Rtts []time.Duration `json:"rtts,omitempty"` // RTT measurements in microseconds
|
|
}
|
|
|
|
type TraceOptions struct {
|
|
ttl uint64 // number of hops to perform
|
|
timeout time.Duration // wait timeout for each response
|
|
address string // address to trace
|
|
useV4 bool
|
|
}
|
|
|
|
func NewTimeoutHop(
|
|
hop uint8,
|
|
) *Hop {
|
|
// Whenever there is a hop in the format of 'N * * *'
|
|
// it means that the hop in the path didn't answer to
|
|
// any probe.
|
|
return NewHop(
|
|
hop,
|
|
"*",
|
|
nil,
|
|
)
|
|
}
|
|
|
|
func NewHop(hop uint8, domain string, rtts []time.Duration) *Hop {
|
|
return &Hop{
|
|
hop,
|
|
domain,
|
|
rtts,
|
|
}
|
|
}
|
|
|
|
func NewTraceOptions(
|
|
ttl uint64,
|
|
timeout time.Duration,
|
|
address string,
|
|
useV4 bool,
|
|
) TraceOptions {
|
|
return TraceOptions{
|
|
ttl,
|
|
timeout,
|
|
address,
|
|
useV4,
|
|
}
|
|
}
|
|
|
|
type NetworkCollector interface {
|
|
// Performs a trace route operation with the specified options.
|
|
// In case the trace fails, it will return a non-nil error and
|
|
// it may return a string which represents the raw information
|
|
// obtained.
|
|
// In case it is successful it will only return an array of Hops
|
|
// an empty string and a nil error.
|
|
Collect(ctx context.Context, options TraceOptions) ([]*Hop, string, error)
|
|
}
|