chore(errors): review all errors in codebase
This commit is contained in:
@@ -19,7 +19,7 @@ type DefaultRouteGetter interface {
|
||||
func (r *Routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP, err error) {
|
||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return "", nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
|
||||
return "", nil, fmt.Errorf("cannot list routes: %w", err)
|
||||
}
|
||||
for _, route := range routes {
|
||||
if route.Dst == nil {
|
||||
@@ -27,7 +27,7 @@ func (r *Routing) DefaultRoute() (defaultInterface string, defaultGateway net.IP
|
||||
linkIndex := route.LinkIndex
|
||||
link, err := r.netLinker.LinkByIndex(linkIndex)
|
||||
if err != nil {
|
||||
return "", nil, fmt.Errorf("%w: for default route at index %d: %s", ErrLinkByIndex, linkIndex, err)
|
||||
return "", nil, fmt.Errorf("cannot obtain link by index: for default route at index %d: %w", linkIndex, err)
|
||||
}
|
||||
attributes := link.Attrs()
|
||||
defaultInterface = attributes.Name
|
||||
@@ -46,7 +46,7 @@ type DefaultIPGetter interface {
|
||||
func (r *Routing) DefaultIP() (ip net.IP, err error) {
|
||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
|
||||
return nil, fmt.Errorf("cannot list routes: %w", err)
|
||||
}
|
||||
|
||||
defaultLinkName := ""
|
||||
@@ -55,7 +55,7 @@ func (r *Routing) DefaultIP() (ip net.IP, err error) {
|
||||
linkIndex := route.LinkIndex
|
||||
link, err := r.netLinker.LinkByIndex(linkIndex)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: for default route at index %d: %s", ErrLinkByIndex, linkIndex, err)
|
||||
return nil, fmt.Errorf("cannot find link by index: for default route at index %d: %w", linkIndex, err)
|
||||
}
|
||||
defaultLinkName = link.Attrs().Name
|
||||
}
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrDefaultRoute = errors.New("cannot get default route")
|
||||
ErrAddInboundFromDefault = errors.New("cannot add routes for inbound traffic from default IP")
|
||||
ErrDelInboundFromDefault = errors.New("cannot remove routes for inbound traffic from default IP")
|
||||
ErrSubnetsOutboundSet = errors.New("cannot set outbound subnets routes")
|
||||
)
|
||||
|
||||
type Setuper interface {
|
||||
Setup() (err error)
|
||||
}
|
||||
@@ -19,7 +11,7 @@ type Setuper interface {
|
||||
func (r *Routing) Setup() (err error) {
|
||||
defaultInterfaceName, defaultGateway, err := r.DefaultRoute()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrDefaultRoute, err)
|
||||
return fmt.Errorf("cannot get default route: %w", err)
|
||||
}
|
||||
|
||||
touched := false
|
||||
@@ -35,14 +27,14 @@ func (r *Routing) Setup() (err error) {
|
||||
|
||||
err = r.routeInboundFromDefault(defaultGateway, defaultInterfaceName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrAddInboundFromDefault, err)
|
||||
return fmt.Errorf("cannot add routes for inbound traffic from default IP: %w", err)
|
||||
}
|
||||
|
||||
r.stateMutex.RLock()
|
||||
outboundSubnets := r.outboundSubnets
|
||||
r.stateMutex.RUnlock()
|
||||
if err := r.setOutboundRoutes(outboundSubnets, defaultInterfaceName, defaultGateway); err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrSubnetsOutboundSet, err)
|
||||
return fmt.Errorf("cannot set outbound subnets routes: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -55,16 +47,16 @@ type TearDowner interface {
|
||||
func (r *Routing) TearDown() error {
|
||||
defaultInterfaceName, defaultGateway, err := r.DefaultRoute()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrDefaultRoute, err)
|
||||
return fmt.Errorf("cannot get default route: %w", err)
|
||||
}
|
||||
|
||||
err = r.unrouteInboundFromDefault(defaultGateway, defaultInterfaceName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrDelInboundFromDefault, err)
|
||||
return fmt.Errorf("cannot remove routes for inbound traffic from default IP: %w", err)
|
||||
}
|
||||
|
||||
if err := r.setOutboundRoutes(nil, defaultInterfaceName, defaultGateway); err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrSubnetsOutboundSet, err)
|
||||
return fmt.Errorf("cannot set outbound subnets routes: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -5,7 +5,5 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrLinkByIndex = errors.New("cannot obtain link by index")
|
||||
ErrLinkDefaultNotFound = errors.New("default link not found")
|
||||
ErrRoutesList = errors.New("cannot list routes")
|
||||
)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
@@ -13,19 +12,15 @@ const (
|
||||
inboundPriority = 100
|
||||
)
|
||||
|
||||
var (
|
||||
errDefaultIP = errors.New("cannot get default IP address")
|
||||
)
|
||||
|
||||
func (r *Routing) routeInboundFromDefault(defaultGateway net.IP,
|
||||
defaultInterface string) (err error) {
|
||||
if err := r.addRuleInboundFromDefault(inboundTable); err != nil {
|
||||
return fmt.Errorf("%w: %s", errRuleAdd, err)
|
||||
return fmt.Errorf("cannot add rule: %w", err)
|
||||
}
|
||||
|
||||
defaultDestination := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
|
||||
if err := r.addRouteVia(defaultDestination, defaultGateway, defaultInterface, inboundTable); err != nil {
|
||||
return fmt.Errorf("%w: %s", errRouteAdd, err)
|
||||
return fmt.Errorf("cannot add route: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -35,11 +30,11 @@ func (r *Routing) unrouteInboundFromDefault(defaultGateway net.IP,
|
||||
defaultInterface string) (err error) {
|
||||
defaultDestination := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
|
||||
if err := r.deleteRouteVia(defaultDestination, defaultGateway, defaultInterface, inboundTable); err != nil {
|
||||
return fmt.Errorf("%w: %s", errRouteDelete, err)
|
||||
return fmt.Errorf("cannot delete route: %w", err)
|
||||
}
|
||||
|
||||
if err := r.delRuleInboundFromDefault(inboundTable); err != nil {
|
||||
return fmt.Errorf("%w: %s", errRuleDelete, err)
|
||||
return fmt.Errorf("cannot delete rule: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -48,14 +43,14 @@ func (r *Routing) unrouteInboundFromDefault(defaultGateway net.IP,
|
||||
func (r *Routing) addRuleInboundFromDefault(table int) (err error) {
|
||||
defaultIP, err := r.DefaultIP()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errDefaultIP, err)
|
||||
return fmt.Errorf("cannot find default IP: %w", err)
|
||||
}
|
||||
|
||||
defaultIPMasked32 := netlink.NewIPNet(defaultIP)
|
||||
ruleDstNet := (*net.IPNet)(nil)
|
||||
err = r.addIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errRuleAdd, err)
|
||||
return fmt.Errorf("cannot add rule: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -64,14 +59,14 @@ func (r *Routing) addRuleInboundFromDefault(table int) (err error) {
|
||||
func (r *Routing) delRuleInboundFromDefault(table int) (err error) {
|
||||
defaultIP, err := r.DefaultIP()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errDefaultIP, err)
|
||||
return fmt.Errorf("cannot find default IP: %w", err)
|
||||
}
|
||||
|
||||
defaultIPMasked32 := netlink.NewIPNet(defaultIP)
|
||||
ruleDstNet := (*net.IPNet)(nil)
|
||||
err = r.deleteIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errRuleDelete, err)
|
||||
return fmt.Errorf("cannot delete rule: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -13,18 +13,16 @@ func IPIsPrivate(ip net.IP) bool {
|
||||
|
||||
var (
|
||||
errInterfaceIPNotFound = errors.New("IP address not found for interface")
|
||||
errInterfaceListAddr = errors.New("cannot list interface addresses")
|
||||
errInterfaceNotFound = errors.New("network interface not found")
|
||||
)
|
||||
|
||||
func (r *Routing) assignedIP(interfaceName string) (ip net.IP, err error) {
|
||||
iface, err := net.InterfaceByName(interfaceName)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s: %s", errInterfaceNotFound, interfaceName, err)
|
||||
return nil, fmt.Errorf("network interface %s not found: %w", interfaceName, err)
|
||||
}
|
||||
addresses, err := iface.Addrs()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s: %s", errInterfaceListAddr, interfaceName, err)
|
||||
return nil, fmt.Errorf("cannot list interface %s addresses: %w", interfaceName, err)
|
||||
}
|
||||
for _, address := range addresses {
|
||||
switch value := address.(type) {
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrLinkList = errors.New("cannot list links")
|
||||
ErrLinkLocalNotFound = errors.New("local link not found")
|
||||
ErrSubnetDefaultNotFound = errors.New("default subnet not found")
|
||||
ErrSubnetLocalNotFound = errors.New("local subnet not found")
|
||||
@@ -28,7 +27,7 @@ type LocalSubnetGetter interface {
|
||||
func (r *Routing) LocalSubnet() (defaultSubnet net.IPNet, err error) {
|
||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return defaultSubnet, fmt.Errorf("%w: %s", ErrRoutesList, err)
|
||||
return defaultSubnet, fmt.Errorf("cannot list routes: %w", err)
|
||||
}
|
||||
|
||||
defaultLinkIndex := -1
|
||||
@@ -61,7 +60,7 @@ type LocalNetworksGetter interface {
|
||||
func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||
links, err := r.netLinker.LinkList()
|
||||
if err != nil {
|
||||
return localNetworks, fmt.Errorf("%w: %s", ErrLinkList, err)
|
||||
return localNetworks, fmt.Errorf("cannot list links: %w", err)
|
||||
}
|
||||
|
||||
localLinks := make(map[int]struct{})
|
||||
@@ -81,7 +80,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||
|
||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_V4)
|
||||
if err != nil {
|
||||
return localNetworks, fmt.Errorf("%w: %s", ErrRoutesList, err)
|
||||
return localNetworks, fmt.Errorf("cannot list routes: %w", err)
|
||||
}
|
||||
|
||||
for _, route := range routes {
|
||||
@@ -98,7 +97,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||
|
||||
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
||||
if err != nil {
|
||||
return localNetworks, fmt.Errorf("%w: at index %d: %s", ErrLinkByIndex, route.LinkIndex, err)
|
||||
return localNetworks, fmt.Errorf("cannot find link at index %d: %w", route.LinkIndex, err)
|
||||
}
|
||||
|
||||
localNet.InterfaceName = link.Attrs().Name
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
@@ -13,10 +12,6 @@ const (
|
||||
outboundPriority = 99
|
||||
)
|
||||
|
||||
var (
|
||||
errAddOutboundSubnet = errors.New("cannot add outbound subnet to routes")
|
||||
)
|
||||
|
||||
type OutboundRoutesSetter interface {
|
||||
SetOutboundRoutes(outboundSubnets []net.IPNet) error
|
||||
}
|
||||
@@ -48,7 +43,7 @@ func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
|
||||
|
||||
err = r.addOutboundSubnets(subnetsToAdd, defaultInterfaceName, defaultGateway)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errAddOutboundSubnet, err)
|
||||
return fmt.Errorf("cannot add outbound subnet to routes: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -68,7 +63,7 @@ func (r *Routing) removeOutboundSubnets(subnets []net.IPNet,
|
||||
err = r.deleteIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
|
||||
if err != nil {
|
||||
warnings = append(warnings,
|
||||
errRuleDelete.Error()+": for subnet "+subNet.String()+": "+err.Error())
|
||||
"cannot delete rule: for subnet "+subNet.String()+": "+err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -83,16 +78,14 @@ func (r *Routing) addOutboundSubnets(subnets []net.IPNet,
|
||||
for i, subnet := range subnets {
|
||||
err := r.addRouteVia(subnet, defaultGateway, defaultInterfaceName, outboundTable)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: for subnet %s: %s",
|
||||
errRouteAdd, subnet, err)
|
||||
return fmt.Errorf("cannot add route for subnet %s: %w", subnet, err)
|
||||
}
|
||||
|
||||
ruleSrcNet := (*net.IPNet)(nil)
|
||||
ruleDstNet := &subnets[i]
|
||||
err = r.addIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: for subnet %s: %s",
|
||||
errRuleAdd, subnet, err)
|
||||
return fmt.Errorf("cannot add rule: for subnet %s: %w", subnet, err)
|
||||
}
|
||||
|
||||
r.outboundSubnets = append(r.outboundSubnets, subnet)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"strconv"
|
||||
@@ -9,12 +8,6 @@ import (
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
)
|
||||
|
||||
var (
|
||||
errLinkByName = errors.New("cannot obtain link by name")
|
||||
errRouteAdd = errors.New("cannot add route")
|
||||
errRouteDelete = errors.New("cannot delete route")
|
||||
)
|
||||
|
||||
func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
||||
iface string, table int) error {
|
||||
destinationStr := destination.String()
|
||||
@@ -26,7 +19,7 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
||||
|
||||
link, err := r.netLinker.LinkByName(iface)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: interface %s: %s", errLinkByName, iface, err)
|
||||
return fmt.Errorf("cannot find link for interface %s: %w", iface, err)
|
||||
}
|
||||
|
||||
route := netlink.Route{
|
||||
@@ -36,8 +29,8 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
||||
Table: table,
|
||||
}
|
||||
if err := r.netLinker.RouteReplace(&route); err != nil {
|
||||
return fmt.Errorf("%w: for subnet %s at interface %s",
|
||||
err, destinationStr, iface)
|
||||
return fmt.Errorf("cannot replace route for subnet %s at interface %s: %w",
|
||||
destinationStr, iface, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -54,7 +47,7 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
|
||||
|
||||
link, err := r.netLinker.LinkByName(iface)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: for interface %s: %s", errLinkByName, iface, err)
|
||||
return fmt.Errorf("cannot find link for interface %s: %w", iface, err)
|
||||
}
|
||||
|
||||
route := netlink.Route{
|
||||
@@ -64,8 +57,8 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
|
||||
Table: table,
|
||||
}
|
||||
if err := r.netLinker.RouteDel(&route); err != nil {
|
||||
return fmt.Errorf("%w: for subnet %s at interface %s",
|
||||
err, destinationStr, iface)
|
||||
return fmt.Errorf("cannot delete route: for subnet %s at interface %s: %w",
|
||||
destinationStr, iface, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -2,19 +2,12 @@ package routing
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
)
|
||||
|
||||
var (
|
||||
errRulesList = errors.New("cannot list rules")
|
||||
errRuleAdd = errors.New("cannot add rule")
|
||||
errRuleDelete = errors.New("cannot delete rule")
|
||||
)
|
||||
|
||||
func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
const add = true
|
||||
r.logger.Debug(ruleDbgMsg(add, src, dst, table, priority))
|
||||
@@ -27,7 +20,7 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
|
||||
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errRulesList, err)
|
||||
return fmt.Errorf("cannot list rules: %w", err)
|
||||
}
|
||||
for i := range existingRules {
|
||||
if !rulesAreEqual(&existingRules[i], rule) {
|
||||
@@ -37,7 +30,7 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
}
|
||||
|
||||
if err := r.netLinker.RuleAdd(rule); err != nil {
|
||||
return fmt.Errorf("%w: for rule: %s", err, rule)
|
||||
return fmt.Errorf("cannot add rule %s: %w", rule, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -54,14 +47,14 @@ func (r *Routing) deleteIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
|
||||
existingRules, err := r.netLinker.RuleList(netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %s", errRulesList, err)
|
||||
return fmt.Errorf("cannot list rules: %w", err)
|
||||
}
|
||||
for i := range existingRules {
|
||||
if !rulesAreEqual(&existingRules[i], rule) {
|
||||
continue
|
||||
}
|
||||
if err := r.netLinker.RuleDel(rule); err != nil {
|
||||
return fmt.Errorf("%w: for rule: %s", err, rule)
|
||||
return fmt.Errorf("cannot delete rule %s: %w", rule, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -88,7 +88,7 @@ func Test_Routing_addIPRule(t *testing.T) {
|
||||
ruleToAdd: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
err: errDummy,
|
||||
},
|
||||
err: errors.New("dummy error: for rule: ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99"),
|
||||
err: errors.New("cannot add rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
|
||||
},
|
||||
"add rule success": {
|
||||
src: makeIPNet(t, 1),
|
||||
@@ -193,7 +193,7 @@ func Test_Routing_deleteIPRule(t *testing.T) {
|
||||
ruleToDel: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
err: errDummy,
|
||||
},
|
||||
err: errors.New("dummy error: for rule: ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99"),
|
||||
err: errors.New("cannot delete rule ip rule 99: from 1.1.1.0/24 to 2.2.2.0/24 table 99: dummy error"),
|
||||
},
|
||||
"rule deleted": {
|
||||
src: makeIPNet(t, 1),
|
||||
|
||||
@@ -21,7 +21,7 @@ type VPNDestinationIPGetter interface {
|
||||
func (r *Routing) VPNDestinationIP() (ip net.IP, err error) {
|
||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
|
||||
return nil, fmt.Errorf("cannot list routes: %w", err)
|
||||
}
|
||||
|
||||
defaultLinkIndex := -1
|
||||
@@ -53,12 +53,12 @@ type VPNLocalGatewayIPGetter interface {
|
||||
func (r *Routing) VPNLocalGatewayIP(vpnIntf string) (ip net.IP, err error) {
|
||||
routes, err := r.netLinker.RouteList(nil, netlink.FAMILY_ALL)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s", ErrRoutesList, err)
|
||||
return nil, fmt.Errorf("cannot list routes: %w", err)
|
||||
}
|
||||
for _, route := range routes {
|
||||
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s", ErrLinkByIndex, err)
|
||||
return nil, fmt.Errorf("cannot find link at index %d: %w", route.LinkIndex, err)
|
||||
}
|
||||
interfaceName := link.Attrs().Name
|
||||
if interfaceName == vpnIntf &&
|
||||
|
||||
Reference in New Issue
Block a user