forked from tailscale/tailscale
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
doctor/ethtool, ipn/ipnlocal: add ethtool bugreport check
Updates tailscale#11137 Signed-off-by: Andrew Dunham <andrew@du.nham.ca> Change-Id: Idbe862d80e428adb044249c47d9096b87f29d5d8
- Loading branch information
Showing
5 changed files
with
122 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters