chore(all): use netip.Prefix for ip networks
- remove usage of `net.IPNet` - remove usage of `netaddr.IPPrefix`
This commit is contained in:
33
internal/routing/conversion.go
Normal file
33
internal/routing/conversion.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
)
|
||||
|
||||
func NetipPrefixToIPNet(prefix *netip.Prefix) (ipNet *net.IPNet) {
|
||||
if prefix == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
s := prefix.String()
|
||||
ip, ipNet, err := net.ParseCIDR(s)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
ipNet.IP = ip
|
||||
return ipNet
|
||||
}
|
||||
|
||||
func netIPNetToNetipPrefix(ipNet net.IPNet) (prefix netip.Prefix) {
|
||||
return netip.MustParsePrefix(ipNet.String())
|
||||
}
|
||||
|
||||
func netIPToNetipAddress(ip net.IP) (address netip.Addr) {
|
||||
address, ok := netip.AddrFromSlice(ip)
|
||||
if !ok {
|
||||
panic(fmt.Sprintf("converting %#v to netip.Addr failed", ip))
|
||||
}
|
||||
return address
|
||||
}
|
||||
52
internal/routing/conversion_test.go
Normal file
52
internal/routing/conversion_test.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/netip"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test_netIPToNetipAddress(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
testCases := map[string]struct {
|
||||
ip net.IP
|
||||
address netip.Addr
|
||||
panicMessage string
|
||||
}{
|
||||
"nil ip": {
|
||||
panicMessage: "converting net.IP(nil) to netip.Addr failed",
|
||||
},
|
||||
"IPv4": {
|
||||
ip: net.IPv4(1, 2, 3, 4),
|
||||
address: netip.AddrFrom4([4]byte{1, 2, 3, 4}),
|
||||
},
|
||||
"IPv6": {
|
||||
ip: net.IPv6zero,
|
||||
address: netip.AddrFrom16([16]byte{}),
|
||||
},
|
||||
"IPv4 prefixed with 0xffff": {
|
||||
ip: net.IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 1, 2, 3, 4},
|
||||
address: netip.AddrFrom4([4]byte{1, 2, 3, 4}),
|
||||
},
|
||||
}
|
||||
|
||||
for name, testCase := range testCases {
|
||||
testCase := testCase
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
if testCase.panicMessage != "" {
|
||||
assert.PanicsWithValue(t, testCase.panicMessage, func() {
|
||||
netIPToNetipAddress(testCase.ip)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
address := netIPToNetipAddress(testCase.ip)
|
||||
assert.Equal(t, testCase.address, address)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package routing
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
)
|
||||
@@ -17,8 +17,9 @@ func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err err
|
||||
return fmt.Errorf("adding rule: %w", err)
|
||||
}
|
||||
|
||||
defaultDestinationIPv4 := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
|
||||
defaultDestinationIPv6 := net.IPNet{IP: net.IPv6zero, Mask: net.IPMask(net.IPv6zero)}
|
||||
const bits = 0
|
||||
defaultDestinationIPv4 := netip.PrefixFrom(netip.AddrFrom4([4]byte{}), bits)
|
||||
defaultDestinationIPv6 := netip.PrefixFrom(netip.AddrFrom16([16]byte{}), bits)
|
||||
|
||||
for _, defaultRoute := range defaultRoutes {
|
||||
defaultDestination := defaultDestinationIPv4
|
||||
@@ -36,8 +37,9 @@ func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err err
|
||||
}
|
||||
|
||||
func (r *Routing) unrouteInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
||||
defaultDestinationIPv4 := net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)}
|
||||
defaultDestinationIPv6 := net.IPNet{IP: net.IPv6zero, Mask: net.IPMask(net.IPv6zero)}
|
||||
const bits = 0
|
||||
defaultDestinationIPv4 := netip.PrefixFrom(netip.AddrFrom4([4]byte{}), bits)
|
||||
defaultDestinationIPv6 := netip.PrefixFrom(netip.AddrFrom16([16]byte{}), bits)
|
||||
|
||||
for _, defaultRoute := range defaultRoutes {
|
||||
defaultDestination := defaultDestinationIPv4
|
||||
@@ -60,9 +62,16 @@ func (r *Routing) unrouteInboundFromDefault(defaultRoutes []DefaultRoute) (err e
|
||||
|
||||
func (r *Routing) addRuleInboundFromDefault(table int, defaultRoutes []DefaultRoute) (err error) {
|
||||
for _, defaultRoute := range defaultRoutes {
|
||||
defaultIPMasked32 := netlink.NewIPNet(defaultRoute.AssignedIP)
|
||||
ruleDstNet := (*net.IPNet)(nil)
|
||||
err = r.addIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
||||
assignedIP := netIPToNetipAddress(defaultRoute.AssignedIP)
|
||||
bits := 32
|
||||
if assignedIP.Is6() {
|
||||
bits = 128
|
||||
}
|
||||
r.logger.Debug(fmt.Sprintf("ASSIGNED IP IS %#v -> %s, bits %d",
|
||||
defaultRoute.AssignedIP, assignedIP, bits))
|
||||
defaultIPMasked := netip.PrefixFrom(assignedIP, bits)
|
||||
ruleDstNet := (*netip.Prefix)(nil)
|
||||
err = r.addIPRule(&defaultIPMasked, ruleDstNet, table, inboundPriority)
|
||||
if err != nil {
|
||||
return fmt.Errorf("adding rule for default route %s: %w", defaultRoute, err)
|
||||
}
|
||||
@@ -73,9 +82,14 @@ func (r *Routing) addRuleInboundFromDefault(table int, defaultRoutes []DefaultRo
|
||||
|
||||
func (r *Routing) delRuleInboundFromDefault(table int, defaultRoutes []DefaultRoute) (err error) {
|
||||
for _, defaultRoute := range defaultRoutes {
|
||||
defaultIPMasked32 := netlink.NewIPNet(defaultRoute.AssignedIP)
|
||||
ruleDstNet := (*net.IPNet)(nil)
|
||||
err = r.deleteIPRule(defaultIPMasked32, ruleDstNet, table, inboundPriority)
|
||||
assignedIP := netIPToNetipAddress(defaultRoute.AssignedIP)
|
||||
bits := 32
|
||||
if assignedIP.Is6() {
|
||||
bits = 128
|
||||
}
|
||||
defaultIPMasked := netip.PrefixFrom(assignedIP, bits)
|
||||
ruleDstNet := (*netip.Prefix)(nil)
|
||||
err = r.deleteIPRule(&defaultIPMasked, ruleDstNet, table, inboundPriority)
|
||||
if err != nil {
|
||||
return fmt.Errorf("deleting rule for default route %s: %w", defaultRoute, err)
|
||||
}
|
||||
|
||||
@@ -22,6 +22,18 @@ func ipMatchesFamily(ip net.IP, family int) bool {
|
||||
(family == netlink.FAMILY_V4 && ip.To4() != nil)
|
||||
}
|
||||
|
||||
func ensureNoIPv6WrappedIPv4(candidateIP net.IP) (resultIP net.IP) {
|
||||
const ipv4Size = 4
|
||||
if candidateIP.To4() == nil || len(candidateIP) == ipv4Size { // ipv6 or ipv4
|
||||
return candidateIP
|
||||
}
|
||||
|
||||
// ipv6-wrapped ipv4
|
||||
resultIP = make(net.IP, ipv4Size)
|
||||
copy(resultIP, candidateIP[12:16])
|
||||
return resultIP
|
||||
}
|
||||
|
||||
func (r *Routing) assignedIP(interfaceName string, family int) (ip net.IP, err error) {
|
||||
iface, err := net.InterfaceByName(interfaceName)
|
||||
if err != nil {
|
||||
@@ -34,14 +46,22 @@ func (r *Routing) assignedIP(interfaceName string, family int) (ip net.IP, err e
|
||||
for _, address := range addresses {
|
||||
switch value := address.(type) {
|
||||
case *net.IPAddr:
|
||||
if ipMatchesFamily(value.IP, family) {
|
||||
return value.IP, nil
|
||||
}
|
||||
ip = value.IP
|
||||
case *net.IPNet:
|
||||
if ipMatchesFamily(value.IP, family) {
|
||||
return value.IP, nil
|
||||
}
|
||||
ip = value.IP
|
||||
default:
|
||||
continue
|
||||
}
|
||||
|
||||
if !ipMatchesFamily(ip, family) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Ensure we don't return an IPv6-wrapped IPv4 address
|
||||
// since netip.Address String method works differently than
|
||||
// net.IP String method for this kind of addresses.
|
||||
ip = ensureNoIPv6WrappedIPv4(ip)
|
||||
return ip, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%w: interface %s in %d addresses",
|
||||
errInterfaceIPNotFound, interfaceName, len(addresses))
|
||||
|
||||
@@ -96,3 +96,35 @@ func Test_IPIsPrivate(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_ensureNoIPv6WrappedIPv4(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
testCases := map[string]struct {
|
||||
candidateIP net.IP
|
||||
resultIP net.IP
|
||||
}{
|
||||
"nil": {},
|
||||
"ipv6": {
|
||||
candidateIP: net.IPv6loopback,
|
||||
resultIP: net.IPv6loopback,
|
||||
},
|
||||
"ipv4": {
|
||||
candidateIP: net.IP{1, 2, 3, 4},
|
||||
resultIP: net.IP{1, 2, 3, 4},
|
||||
},
|
||||
"ipv6_wrapped_ipv4": {
|
||||
candidateIP: net.IPv4(1, 2, 3, 4),
|
||||
resultIP: net.IP{1, 2, 3, 4},
|
||||
},
|
||||
}
|
||||
for name, testCase := range testCases {
|
||||
testCase := testCase
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
resultIP := ensureNoIPv6WrappedIPv4(testCase.candidateIP)
|
||||
assert.Equal(t, testCase.resultIP, resultIP)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
)
|
||||
@@ -15,7 +16,7 @@ var (
|
||||
)
|
||||
|
||||
type LocalNetwork struct {
|
||||
IPNet *net.IPNet
|
||||
IPNet netip.Prefix
|
||||
InterfaceName string
|
||||
IP net.IP
|
||||
}
|
||||
@@ -55,7 +56,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||
|
||||
var localNet LocalNetwork
|
||||
|
||||
localNet.IPNet = route.Dst
|
||||
localNet.IPNet = netIPNetToNetipPrefix(*route.Dst)
|
||||
r.logger.Info("local ipnet found: " + localNet.IPNet.String())
|
||||
|
||||
link, err := r.netLinker.LinkByIndex(route.LinkIndex)
|
||||
@@ -66,7 +67,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||
localNet.InterfaceName = link.Attrs().Name
|
||||
|
||||
family := netlink.FAMILY_V6
|
||||
if localNet.IPNet.IP.To4() != nil {
|
||||
if localNet.IPNet.Addr().Is4() {
|
||||
family = netlink.FAMILY_V4
|
||||
}
|
||||
ip, err := r.assignedIP(localNet.InterfaceName, family)
|
||||
@@ -87,7 +88,7 @@ func (r *Routing) LocalNetworks() (localNetworks []LocalNetwork, err error) {
|
||||
}
|
||||
|
||||
func (r *Routing) AddLocalRules(subnets []LocalNetwork) (err error) {
|
||||
for _, net := range subnets {
|
||||
for _, subnet := range subnets {
|
||||
// The main table is a built-in value for Linux, see "man 8 ip-route"
|
||||
const mainTable = 254
|
||||
|
||||
@@ -96,9 +97,9 @@ func (r *Routing) AddLocalRules(subnets []LocalNetwork) (err error) {
|
||||
const localPriority = 98
|
||||
|
||||
// Main table was setup correctly by Docker, just need to add rules to use it
|
||||
err = r.addIPRule(nil, net.IPNet, mainTable, localPriority)
|
||||
err = r.addIPRule(nil, &subnet.IPNet, mainTable, localPriority)
|
||||
if err != nil {
|
||||
return fmt.Errorf("adding rule: %v: %w", net.IPNet, err)
|
||||
return fmt.Errorf("adding rule: %v: %w", subnet.IPNet, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -2,7 +2,7 @@ package routing
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/subnet"
|
||||
)
|
||||
@@ -12,7 +12,7 @@ const (
|
||||
outboundPriority = 99
|
||||
)
|
||||
|
||||
func (r *Routing) SetOutboundRoutes(outboundSubnets []net.IPNet) error {
|
||||
func (r *Routing) SetOutboundRoutes(outboundSubnets []netip.Prefix) error {
|
||||
defaultRoutes, err := r.DefaultRoutes()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -20,7 +20,7 @@ func (r *Routing) SetOutboundRoutes(outboundSubnets []net.IPNet) error {
|
||||
return r.setOutboundRoutes(outboundSubnets, defaultRoutes)
|
||||
}
|
||||
|
||||
func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
|
||||
func (r *Routing) setOutboundRoutes(outboundSubnets []netip.Prefix,
|
||||
defaultRoutes []DefaultRoute) (err error) {
|
||||
r.stateMutex.Lock()
|
||||
defer r.stateMutex.Unlock()
|
||||
@@ -45,7 +45,7 @@ func (r *Routing) setOutboundRoutes(outboundSubnets []net.IPNet,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routing) removeOutboundSubnets(subnets []net.IPNet,
|
||||
func (r *Routing) removeOutboundSubnets(subnets []netip.Prefix,
|
||||
defaultRoutes []DefaultRoute) (warnings []string) {
|
||||
for i, subNet := range subnets {
|
||||
for _, defaultRoute := range defaultRoutes {
|
||||
@@ -56,7 +56,7 @@ func (r *Routing) removeOutboundSubnets(subnets []net.IPNet,
|
||||
}
|
||||
}
|
||||
|
||||
ruleSrcNet := (*net.IPNet)(nil)
|
||||
ruleSrcNet := (*netip.Prefix)(nil)
|
||||
ruleDstNet := &subnets[i]
|
||||
err := r.deleteIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
|
||||
if err != nil {
|
||||
@@ -71,7 +71,7 @@ func (r *Routing) removeOutboundSubnets(subnets []net.IPNet,
|
||||
return warnings
|
||||
}
|
||||
|
||||
func (r *Routing) addOutboundSubnets(subnets []net.IPNet,
|
||||
func (r *Routing) addOutboundSubnets(subnets []netip.Prefix,
|
||||
defaultRoutes []DefaultRoute) (err error) {
|
||||
for i, subnet := range subnets {
|
||||
for _, defaultRoute := range defaultRoutes {
|
||||
@@ -81,7 +81,7 @@ func (r *Routing) addOutboundSubnets(subnets []net.IPNet,
|
||||
}
|
||||
}
|
||||
|
||||
ruleSrcNet := (*net.IPNet)(nil)
|
||||
ruleSrcNet := (*netip.Prefix)(nil)
|
||||
ruleDstNet := &subnets[i]
|
||||
err = r.addIPRule(ruleSrcNet, ruleDstNet, outboundTable, outboundPriority)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,12 +3,13 @@ package routing
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
"strconv"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
)
|
||||
|
||||
func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
||||
func (r *Routing) addRouteVia(destination netip.Prefix, gateway net.IP,
|
||||
iface string, table int) error {
|
||||
destinationStr := destination.String()
|
||||
r.logger.Info("adding route for " + destinationStr)
|
||||
@@ -23,7 +24,7 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
||||
}
|
||||
|
||||
route := netlink.Route{
|
||||
Dst: &destination,
|
||||
Dst: NetipPrefixToIPNet(&destination),
|
||||
Gw: gateway,
|
||||
LinkIndex: link.Attrs().Index,
|
||||
Table: table,
|
||||
@@ -36,7 +37,7 @@ func (r *Routing) addRouteVia(destination net.IPNet, gateway net.IP,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
|
||||
func (r *Routing) deleteRouteVia(destination netip.Prefix, gateway net.IP,
|
||||
iface string, table int) (err error) {
|
||||
destinationStr := destination.String()
|
||||
r.logger.Info("deleting route for " + destinationStr)
|
||||
@@ -51,7 +52,7 @@ func (r *Routing) deleteRouteVia(destination net.IPNet, gateway net.IP,
|
||||
}
|
||||
|
||||
route := netlink.Route{
|
||||
Dst: &destination,
|
||||
Dst: NetipPrefixToIPNet(&destination),
|
||||
Gw: gateway,
|
||||
LinkIndex: link.Attrs().Index,
|
||||
Table: table,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/netip"
|
||||
"sync"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
@@ -48,7 +48,7 @@ type Linker interface {
|
||||
type Routing struct {
|
||||
netLinker NetLinker
|
||||
logger Logger
|
||||
outboundSubnets []net.IPNet
|
||||
outboundSubnets []netip.Prefix
|
||||
stateMutex sync.RWMutex
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,18 @@ import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
|
||||
"github.com/qdm12/gluetun/internal/netlink"
|
||||
)
|
||||
|
||||
func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
func (r *Routing) addIPRule(src, dst *netip.Prefix, table, priority int) error {
|
||||
const add = true
|
||||
r.logger.Debug(ruleDbgMsg(add, src, dst, table, priority))
|
||||
|
||||
rule := netlink.NewRule()
|
||||
rule.Src = src
|
||||
rule.Dst = dst
|
||||
rule.Src = NetipPrefixToIPNet(src)
|
||||
rule.Dst = NetipPrefixToIPNet(dst)
|
||||
rule.Priority = priority
|
||||
rule.Table = table
|
||||
|
||||
@@ -35,13 +36,13 @@ func (r *Routing) addIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routing) deleteIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
func (r *Routing) deleteIPRule(src, dst *netip.Prefix, table, priority int) error {
|
||||
const add = false
|
||||
r.logger.Debug(ruleDbgMsg(add, src, dst, table, priority))
|
||||
|
||||
rule := netlink.NewRule()
|
||||
rule.Src = src
|
||||
rule.Dst = dst
|
||||
rule.Src = NetipPrefixToIPNet(src)
|
||||
rule.Dst = NetipPrefixToIPNet(dst)
|
||||
rule.Priority = priority
|
||||
rule.Table = table
|
||||
|
||||
@@ -60,7 +61,7 @@ func (r *Routing) deleteIPRule(src, dst *net.IPNet, table, priority int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func ruleDbgMsg(add bool, src, dst *net.IPNet,
|
||||
func ruleDbgMsg(add bool, src, dst *netip.Prefix,
|
||||
table, priority int) (debugMessage string) {
|
||||
debugMessage = "ip rule"
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package routing
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"net/netip"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
@@ -11,20 +12,17 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func makeIPNet(t *testing.T, n byte) *net.IPNet {
|
||||
t.Helper()
|
||||
return &net.IPNet{
|
||||
IP: net.IPv4(n, n, n, 0),
|
||||
Mask: net.IPv4Mask(255, 255, 255, 0),
|
||||
}
|
||||
func makeNetipPrefix(n byte) *netip.Prefix {
|
||||
const bits = 24
|
||||
prefix := netip.PrefixFrom(netip.AddrFrom4([4]byte{n, n, n, 0}), bits)
|
||||
return &prefix
|
||||
}
|
||||
|
||||
func makeIPRule(t *testing.T, src, dst *net.IPNet,
|
||||
func makeIPRule(src, dst *netip.Prefix,
|
||||
table, priority int) *netlink.Rule {
|
||||
t.Helper()
|
||||
rule := netlink.NewRule()
|
||||
rule.Src = src
|
||||
rule.Dst = dst
|
||||
rule.Src = NetipPrefixToIPNet(src)
|
||||
rule.Dst = NetipPrefixToIPNet(dst)
|
||||
rule.Table = table
|
||||
rule.Priority = priority
|
||||
return rule
|
||||
@@ -47,8 +45,8 @@ func Test_Routing_addIPRule(t *testing.T) {
|
||||
}
|
||||
|
||||
testCases := map[string]struct {
|
||||
src *net.IPNet
|
||||
dst *net.IPNet
|
||||
src *netip.Prefix
|
||||
dst *netip.Prefix
|
||||
table int
|
||||
priority int
|
||||
dbgMsg string
|
||||
@@ -64,46 +62,46 @@ func Test_Routing_addIPRule(t *testing.T) {
|
||||
err: errors.New("listing rules: dummy error"),
|
||||
},
|
||||
"rule already exists": {
|
||||
src: makeIPNet(t, 1),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 99,
|
||||
priority: 99,
|
||||
dbgMsg: "ip rule add from 1.1.1.0/24 to 2.2.2.0/24 lookup 99 pref 99",
|
||||
ruleList: ruleListCall{
|
||||
rules: []netlink.Rule{
|
||||
*makeIPRule(t, makeIPNet(t, 2), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(2), makeNetipPrefix(2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
},
|
||||
},
|
||||
},
|
||||
"add rule error": {
|
||||
src: makeIPNet(t, 1),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 99,
|
||||
priority: 99,
|
||||
dbgMsg: "ip rule add from 1.1.1.0/24 to 2.2.2.0/24 lookup 99 pref 99",
|
||||
ruleAdd: ruleAddCall{
|
||||
expected: true,
|
||||
ruleToAdd: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
ruleToAdd: makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
err: errDummy,
|
||||
},
|
||||
err: errors.New("adding 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),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 99,
|
||||
priority: 99,
|
||||
dbgMsg: "ip rule add from 1.1.1.0/24 to 2.2.2.0/24 lookup 99 pref 99",
|
||||
ruleList: ruleListCall{
|
||||
rules: []netlink.Rule{
|
||||
*makeIPRule(t, makeIPNet(t, 2), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 101, 101),
|
||||
*makeIPRule(makeNetipPrefix(2), makeNetipPrefix(2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 101, 101),
|
||||
},
|
||||
},
|
||||
ruleAdd: ruleAddCall{
|
||||
expected: true,
|
||||
ruleToAdd: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
ruleToAdd: makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -160,8 +158,8 @@ func Test_Routing_deleteIPRule(t *testing.T) {
|
||||
}
|
||||
|
||||
testCases := map[string]struct {
|
||||
src *net.IPNet
|
||||
dst *net.IPNet
|
||||
src *netip.Prefix
|
||||
dst *netip.Prefix
|
||||
table int
|
||||
priority int
|
||||
dbgMsg string
|
||||
@@ -177,50 +175,50 @@ func Test_Routing_deleteIPRule(t *testing.T) {
|
||||
err: errors.New("listing rules: dummy error"),
|
||||
},
|
||||
"rule delete error": {
|
||||
src: makeIPNet(t, 1),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 99,
|
||||
priority: 99,
|
||||
dbgMsg: "ip rule del from 1.1.1.0/24 to 2.2.2.0/24 lookup 99 pref 99",
|
||||
ruleList: ruleListCall{
|
||||
rules: []netlink.Rule{
|
||||
*makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
},
|
||||
},
|
||||
ruleDel: ruleDelCall{
|
||||
expected: true,
|
||||
ruleToDel: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
ruleToDel: makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
err: errDummy,
|
||||
},
|
||||
err: errors.New("deleting 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),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 99,
|
||||
priority: 99,
|
||||
dbgMsg: "ip rule del from 1.1.1.0/24 to 2.2.2.0/24 lookup 99 pref 99",
|
||||
ruleList: ruleListCall{
|
||||
rules: []netlink.Rule{
|
||||
*makeIPRule(t, makeIPNet(t, 2), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(2), makeNetipPrefix(2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
},
|
||||
},
|
||||
ruleDel: ruleDelCall{
|
||||
expected: true,
|
||||
ruleToDel: makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 99, 99),
|
||||
ruleToDel: makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 99, 99),
|
||||
},
|
||||
},
|
||||
"rule does not exist": {
|
||||
src: makeIPNet(t, 1),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 99,
|
||||
priority: 99,
|
||||
dbgMsg: "ip rule del from 1.1.1.0/24 to 2.2.2.0/24 lookup 99 pref 99",
|
||||
ruleList: ruleListCall{
|
||||
rules: []netlink.Rule{
|
||||
*makeIPRule(t, makeIPNet(t, 2), makeIPNet(t, 2), 99, 99),
|
||||
*makeIPRule(t, makeIPNet(t, 1), makeIPNet(t, 2), 101, 101),
|
||||
*makeIPRule(makeNetipPrefix(2), makeNetipPrefix(2), 99, 99),
|
||||
*makeIPRule(makeNetipPrefix(1), makeNetipPrefix(2), 101, 101),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -266,8 +264,8 @@ func Test_ruleDbgMsg(t *testing.T) {
|
||||
|
||||
testCases := map[string]struct {
|
||||
add bool
|
||||
src *net.IPNet
|
||||
dst *net.IPNet
|
||||
src *netip.Prefix
|
||||
dst *netip.Prefix
|
||||
table int
|
||||
priority int
|
||||
dbgMsg string
|
||||
@@ -277,15 +275,15 @@ func Test_ruleDbgMsg(t *testing.T) {
|
||||
},
|
||||
"add rule": {
|
||||
add: true,
|
||||
src: makeIPNet(t, 1),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 100,
|
||||
priority: 101,
|
||||
dbgMsg: "ip rule add from 1.1.1.0/24 to 2.2.2.0/24 lookup 100 pref 101",
|
||||
},
|
||||
"del rule": {
|
||||
src: makeIPNet(t, 1),
|
||||
dst: makeIPNet(t, 2),
|
||||
src: makeNetipPrefix(1),
|
||||
dst: makeNetipPrefix(2),
|
||||
table: 100,
|
||||
priority: 101,
|
||||
dbgMsg: "ip rule del from 1.1.1.0/24 to 2.2.2.0/24 lookup 100 pref 101",
|
||||
|
||||
Reference in New Issue
Block a user