|
|
|
@ -28,6 +28,22 @@ type Report struct {
|
|
|
|
|
MappingVariesByDestIP opt.Bool // for IPv4
|
|
|
|
|
HairPinning opt.Bool // for IPv4
|
|
|
|
|
DERPLatency map[string]time.Duration // keyed by STUN host:port
|
|
|
|
|
|
|
|
|
|
// TODO: update Clone when adding new fields
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *Report) Clone() *Report {
|
|
|
|
|
if r == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
r2 := *r
|
|
|
|
|
if r2.DERPLatency != nil {
|
|
|
|
|
r2.DERPLatency = map[string]time.Duration{}
|
|
|
|
|
for k, v := range r.DERPLatency {
|
|
|
|
|
r2.DERPLatency[k] = v
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return &r2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetReport(ctx context.Context, logf logger.Logf) (*Report, error) {
|
|
|
|
@ -159,7 +175,7 @@ func GetReport(ctx context.Context, logf logger.Logf) (*Report, error) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mu.Lock()
|
|
|
|
|
defer mu.Unlock() // unnecessary, but feels weird without
|
|
|
|
|
defer mu.Unlock()
|
|
|
|
|
|
|
|
|
|
var checkHairpinning bool
|
|
|
|
|
|
|
|
|
@ -186,5 +202,5 @@ func GetReport(ctx context.Context, logf logger.Logf) (*Report, error) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret, nil
|
|
|
|
|
return ret.Clone(), nil
|
|
|
|
|
}
|
|
|
|
|