//go:build linux package tc import ( "fmt" "strings" "github.com/hashicorp/go-multierror" "github.com/vishvananda/netlink" ) type Tc interface { Add() error Delete() error Replace() error } func Adder() func(commandList ...Tc) error { var err *multierror.Error return func(commandList ...Tc) error { for _, command := range commandList { err = multierror.Append(err, command.Add()) } return err.ErrorOrNil() } } func Replacer() func(commandList ...Tc) error { var err *multierror.Error return func(commandList ...Tc) error { for _, command := range commandList { err = multierror.Append(err, command.Replace()) } return err.ErrorOrNil() } } func errorIsNotFound(err error) bool { return strings.Contains(err.Error(), "not found") || strings.Contains(err.Error(), "no such file or directory") } func errorIsFileExists(err error) bool { return strings.Contains(err.Error(), "file exists") } func formatTcError(prefix string, linkIndex int, parent, handle uint32, tcErr error) error { link, err := netlink.LinkByIndex(linkIndex) if err != nil { return fmt.Errorf("failed to get link when handling err: %w", tcErr) } return fmt.Errorf( "%s with parent %s and handle %s (dev %s): %w", prefix, netlink.HandleStr(parent), netlink.HandleStr(handle), link.Attrs().Name, err, ) }