linkspeed_linux.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. //go:build linux && !android
  4. package linkspeed
  5. import (
  6. "github.com/mdlayher/genetlink"
  7. "github.com/mdlayher/netlink"
  8. "github.com/tailscale/wireguard-go/tun"
  9. "golang.org/x/sys/unix"
  10. "tailscale.com/net/tstun"
  11. )
  12. func init() {
  13. tstun.HookSetLinkAttrs.Set(setLinkAttrs)
  14. }
  15. // setLinkSpeed sets the advertised link speed of the TUN interface.
  16. func setLinkSpeed(iface tun.Device, mbps int) error {
  17. name, err := iface.Name()
  18. if err != nil {
  19. return err
  20. }
  21. conn, err := genetlink.Dial(&netlink.Config{Strict: true})
  22. if err != nil {
  23. return err
  24. }
  25. defer conn.Close()
  26. f, err := conn.GetFamily(unix.ETHTOOL_GENL_NAME)
  27. if err != nil {
  28. return err
  29. }
  30. ae := netlink.NewAttributeEncoder()
  31. ae.Nested(unix.ETHTOOL_A_LINKMODES_HEADER, func(nae *netlink.AttributeEncoder) error {
  32. nae.String(unix.ETHTOOL_A_HEADER_DEV_NAME, name)
  33. return nil
  34. })
  35. ae.Uint32(unix.ETHTOOL_A_LINKMODES_SPEED, uint32(mbps))
  36. b, err := ae.Encode()
  37. if err != nil {
  38. return err
  39. }
  40. _, err = conn.Execute(
  41. genetlink.Message{
  42. Header: genetlink.Header{
  43. Command: unix.ETHTOOL_MSG_LINKMODES_SET,
  44. Version: unix.ETHTOOL_GENL_VERSION,
  45. },
  46. Data: b,
  47. },
  48. f.ID,
  49. netlink.Request|netlink.Acknowledge,
  50. )
  51. return err
  52. }
  53. // setLinkAttrs sets up link attributes that can be queried by external tools.
  54. // Its failure is non-fatal to interface bringup.
  55. func setLinkAttrs(iface tun.Device) error {
  56. // By default the link speed is 10Mbps, which is easily exceeded and causes monitoring tools to complain (#3933).
  57. return setLinkSpeed(iface, unix.SPEED_UNKNOWN)
  58. }