Updates #11137 Signed-off-by: Andrew Dunham <andrew@du.nham.ca> Change-Id: Idbe862d80e428adb044249c47d9096b87f29d5d8main
parent
38bba2d23a
commit
52f16b5d10
@ -0,0 +1,23 @@ |
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package ethtool provides a doctor.Check that prints diagnostic information
|
||||
// obtained from the 'ethtool' utility on the current system.
|
||||
package ethtool |
||||
|
||||
import ( |
||||
"context" |
||||
|
||||
"tailscale.com/types/logger" |
||||
) |
||||
|
||||
// Check implements the doctor.Check interface.
|
||||
type Check struct{} |
||||
|
||||
func (Check) Name() string { |
||||
return "ethtool" |
||||
} |
||||
|
||||
func (Check) Run(_ context.Context, logf logger.Logf) error { |
||||
return ethtoolImpl(logf) |
||||
} |
||||
@ -0,0 +1,78 @@ |
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package ethtool |
||||
|
||||
import ( |
||||
"net/netip" |
||||
"sort" |
||||
|
||||
"github.com/safchain/ethtool" |
||||
"tailscale.com/net/interfaces" |
||||
"tailscale.com/types/logger" |
||||
"tailscale.com/util/set" |
||||
) |
||||
|
||||
func ethtoolImpl(logf logger.Logf) error { |
||||
et, err := ethtool.NewEthtool() |
||||
if err != nil { |
||||
logf("could not create ethtool: %v", err) |
||||
return nil |
||||
} |
||||
defer et.Close() |
||||
|
||||
interfaces.ForeachInterface(func(iface interfaces.Interface, _ []netip.Prefix) { |
||||
ilogf := logger.WithPrefix(logf, iface.Name+": ") |
||||
features, err := et.Features(iface.Name) |
||||
if err == nil { |
||||
enabled := []string{} |
||||
for feature, value := range features { |
||||
if value { |
||||
enabled = append(enabled, feature) |
||||
} |
||||
} |
||||
sort.Strings(enabled) |
||||
ilogf("features: %v", enabled) |
||||
} else { |
||||
ilogf("features: error: %v", err) |
||||
} |
||||
|
||||
stats, err := et.Stats(iface.Name) |
||||
if err == nil { |
||||
printStats(ilogf, stats) |
||||
} else { |
||||
ilogf("stats: error: %v", err) |
||||
} |
||||
}) |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// Stats that should be printed if non-zero
|
||||
var nonzeroStats = set.SetOf([]string{ |
||||
// AWS ENA driver statistics; see:
|
||||
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html
|
||||
"bw_in_allowance_exceeded", |
||||
"bw_out_allowance_exceeded", |
||||
"conntrack_allowance_exceeded", |
||||
"linklocal_allowance_exceeded", |
||||
"pps_allowance_exceeded", |
||||
}) |
||||
|
||||
// Stats that should be printed if zero
|
||||
var zeroStats = set.SetOf([]string{ |
||||
// AWS ENA driver statistics; see:
|
||||
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html
|
||||
"conntrack_allowance_available", |
||||
}) |
||||
|
||||
func printStats(logf logger.Logf, stats map[string]uint64) { |
||||
for name, value := range stats { |
||||
if value != 0 && nonzeroStats.Contains(name) { |
||||
logf("stats: warning: %s = %d > 0", name, value) |
||||
} |
||||
if value == 0 && zeroStats.Contains(name) { |
||||
logf("stats: warning: %s = %d == 0", name, value) |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,17 @@ |
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build !linux
|
||||
|
||||
package ethtool |
||||
|
||||
import ( |
||||
"runtime" |
||||
|
||||
"tailscale.com/types/logger" |
||||
) |
||||
|
||||
func ethtoolImpl(logf logger.Logf) error { |
||||
logf("unsupported on %s/%s", runtime.GOOS, runtime.GOARCH) |
||||
return nil |
||||
} |
||||
Loading…
Reference in new issue