chore(all): use netip.Prefix for ip networks

- remove usage of `net.IPNet`
- remove usage of `netaddr.IPPrefix`
This commit is contained in:
Quentin McGaw
2023-04-27 13:41:05 +00:00
parent 801a7fd6fe
commit d21a943779
32 changed files with 344 additions and 315 deletions

View File

@@ -2,21 +2,22 @@ package wireguard
import (
"fmt"
"net"
"net/netip"
"github.com/qdm12/gluetun/internal/netlink"
"github.com/qdm12/gluetun/internal/routing"
)
func (w *Wireguard) addAddresses(link netlink.Link,
addresses []*net.IPNet) (err error) {
addresses []netip.Prefix) (err error) {
for _, ipNet := range addresses {
ipNetIsIPv6 := ipNet.IP.To4() == nil
if !*w.settings.IPv6 && ipNetIsIPv6 {
if !*w.settings.IPv6 && ipNet.Addr().Is6() {
continue
}
ipNet := ipNet
address := &netlink.Addr{
IPNet: ipNet,
IPNet: routing.NetipPrefixToIPNet(&ipNet),
}
err = w.netlink.AddrAdd(link, address)

View File

@@ -2,11 +2,12 @@ package wireguard
import (
"errors"
"net"
"net/netip"
"testing"
"github.com/golang/mock/gomock"
"github.com/qdm12/gluetun/internal/netlink"
"github.com/qdm12/gluetun/internal/routing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -14,8 +15,8 @@ import (
func Test_Wireguard_addAddresses(t *testing.T) {
t.Parallel()
ipNetOne := &net.IPNet{IP: net.IPv4(1, 2, 3, 4), Mask: net.IPv4Mask(255, 255, 255, 255)}
ipNetTwo := &net.IPNet{IP: net.ParseIP("::1234"), Mask: net.CIDRMask(64, 128)}
ipNetOne := netip.PrefixFrom(netip.AddrFrom4([4]byte{1, 2, 3, 4}), 32)
ipNetTwo := netip.PrefixFrom(netip.MustParseAddr("::1234"), 64)
newLink := func() netlink.Link {
linkAttrs := netlink.NewLinkAttrs()
@@ -29,20 +30,20 @@ func Test_Wireguard_addAddresses(t *testing.T) {
testCases := map[string]struct {
link netlink.Link
addrs []*net.IPNet
addrs []netip.Prefix
wgBuilder func(ctrl *gomock.Controller, link netlink.Link) *Wireguard
err error
}{
"success": {
link: newLink(),
addrs: []*net.IPNet{ipNetOne, ipNetTwo},
addrs: []netip.Prefix{ipNetOne, ipNetTwo},
wgBuilder: func(ctrl *gomock.Controller, link netlink.Link) *Wireguard {
netLinker := NewMockNetLinker(ctrl)
firstCall := netLinker.EXPECT().
AddrAdd(link, &netlink.Addr{IPNet: ipNetOne}).
AddrAdd(link, &netlink.Addr{IPNet: routing.NetipPrefixToIPNet(&ipNetOne)}).
Return(nil)
netLinker.EXPECT().
AddrAdd(link, &netlink.Addr{IPNet: ipNetTwo}).
AddrAdd(link, &netlink.Addr{IPNet: routing.NetipPrefixToIPNet(&ipNetTwo)}).
Return(nil).After(firstCall)
return &Wireguard{
netlink: netLinker,
@@ -54,11 +55,11 @@ func Test_Wireguard_addAddresses(t *testing.T) {
},
"first add error": {
link: newLink(),
addrs: []*net.IPNet{ipNetOne, ipNetTwo},
addrs: []netip.Prefix{ipNetOne, ipNetTwo},
wgBuilder: func(ctrl *gomock.Controller, link netlink.Link) *Wireguard {
netLinker := NewMockNetLinker(ctrl)
netLinker.EXPECT().
AddrAdd(link, &netlink.Addr{IPNet: ipNetOne}).
AddrAdd(link, &netlink.Addr{IPNet: routing.NetipPrefixToIPNet(&ipNetOne)}).
Return(errDummy)
return &Wireguard{
netlink: netLinker,
@@ -71,14 +72,14 @@ func Test_Wireguard_addAddresses(t *testing.T) {
},
"second add error": {
link: newLink(),
addrs: []*net.IPNet{ipNetOne, ipNetTwo},
addrs: []netip.Prefix{ipNetOne, ipNetTwo},
wgBuilder: func(ctrl *gomock.Controller, link netlink.Link) *Wireguard {
netLinker := NewMockNetLinker(ctrl)
firstCall := netLinker.EXPECT().
AddrAdd(link, &netlink.Addr{IPNet: ipNetOne}).
AddrAdd(link, &netlink.Addr{IPNet: routing.NetipPrefixToIPNet(&ipNetOne)}).
Return(nil)
netLinker.EXPECT().
AddrAdd(link, &netlink.Addr{IPNet: ipNetTwo}).
AddrAdd(link, &netlink.Addr{IPNet: routing.NetipPrefixToIPNet(&ipNetTwo)}).
Return(errDummy).After(firstCall)
return &Wireguard{
netlink: netLinker,
@@ -91,7 +92,7 @@ func Test_Wireguard_addAddresses(t *testing.T) {
},
"ignore IPv6": {
link: newLink(),
addrs: []*net.IPNet{ipNetTwo},
addrs: []netip.Prefix{ipNetTwo},
wgBuilder: func(ctrl *gomock.Controller, link netlink.Link) *Wireguard {
return &Wireguard{
settings: Settings{

View File

@@ -2,6 +2,7 @@ package wireguard
import (
"net"
"net/netip"
"testing"
"github.com/stretchr/testify/assert"
@@ -33,9 +34,8 @@ func Test_New(t *testing.T) {
Endpoint: &net.UDPAddr{
IP: net.IPv4(1, 2, 3, 4),
},
Addresses: []*net.IPNet{{
IP: net.IPv4(5, 6, 7, 8),
Mask: net.IPv4Mask(255, 255, 255, 255)},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{5, 6, 7, 8}), 32),
},
FirewallMark: 100,
},
@@ -50,9 +50,8 @@ func Test_New(t *testing.T) {
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{{
IP: net.IPv4(5, 6, 7, 8),
Mask: net.IPv4Mask(255, 255, 255, 255)},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{5, 6, 7, 8}), 32),
},
FirewallMark: 100,
IPv6: ptr(false),

View File

@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"net"
"net/netip"
"regexp"
"strings"
@@ -24,7 +25,7 @@ type Settings struct {
Endpoint *net.UDPAddr
// Addresses assigned to the client.
// Note IPv6 addresses are ignored if IPv6 is not supported.
Addresses []*net.IPNet
Addresses []netip.Prefix
// FirewallMark to be used in routing tables and IP rules.
// It defaults to 51820 if left to 0.
FirewallMark int
@@ -77,9 +78,7 @@ var (
ErrEndpointIPMissing = errors.New("endpoint IP is missing")
ErrEndpointPortMissing = errors.New("endpoint port is missing")
ErrAddressMissing = errors.New("interface address is missing")
ErrAddressNil = errors.New("interface address is nil")
ErrAddressIPMissing = errors.New("interface address IP is missing")
ErrAddressMaskMissing = errors.New("interface address mask is missing")
ErrAddressNotValid = errors.New("interface address is not valid")
ErrFirewallMarkMissing = errors.New("firewall mark is missing")
ErrImplementationInvalid = errors.New("invalid implementation")
)
@@ -122,16 +121,9 @@ func (s *Settings) Check() (err error) {
return fmt.Errorf("%w", ErrAddressMissing)
}
for i, addr := range s.Addresses {
switch {
case addr == nil:
if !addr.IsValid() {
return fmt.Errorf("%w: for address %d of %d",
ErrAddressNil, i+1, len(s.Addresses))
case addr.IP == nil:
return fmt.Errorf("%w: for address %d of %d",
ErrAddressIPMissing, i+1, len(s.Addresses))
case addr.Mask == nil:
return fmt.Errorf("%w: for address %d of %d",
ErrAddressMaskMissing, i+1, len(s.Addresses))
ErrAddressNotValid, i+1, len(s.Addresses))
}
}

View File

@@ -3,6 +3,7 @@ package wireguard
import (
"errors"
"net"
"net/netip"
"testing"
"github.com/stretchr/testify/assert"
@@ -177,7 +178,7 @@ func Test_Settings_Check(t *testing.T) {
},
err: ErrAddressMissing,
},
"nil address": {
"invalid address": {
settings: Settings{
InterfaceName: "wg0",
PrivateKey: validKey1,
@@ -186,35 +187,9 @@ func Test_Settings_Check(t *testing.T) {
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{nil},
Addresses: []netip.Prefix{{}},
},
err: errors.New("interface address is nil: for address 1 of 1"),
},
"nil address IP": {
settings: Settings{
InterfaceName: "wg0",
PrivateKey: validKey1,
PublicKey: validKey2,
Endpoint: &net.UDPAddr{
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{{}},
},
err: errors.New("interface address IP is missing: for address 1 of 1"),
},
"nil address mask": {
settings: Settings{
InterfaceName: "wg0",
PrivateKey: validKey1,
PublicKey: validKey2,
Endpoint: &net.UDPAddr{
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4)}},
},
err: errors.New("interface address mask is missing: for address 1 of 1"),
err: errors.New("interface address is not valid: for address 1 of 1"),
},
"zero firewall mark": {
settings: Settings{
@@ -225,7 +200,9 @@ func Test_Settings_Check(t *testing.T) {
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4), Mask: net.CIDRMask(24, 32)}},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{1, 2, 3, 4}), 24),
},
},
err: ErrFirewallMarkMissing,
},
@@ -238,7 +215,9 @@ func Test_Settings_Check(t *testing.T) {
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4), Mask: net.CIDRMask(24, 32)}},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{1, 2, 3, 4}), 24),
},
FirewallMark: 999,
Implementation: "x",
},
@@ -253,7 +232,9 @@ func Test_Settings_Check(t *testing.T) {
IP: net.IPv4(1, 2, 3, 4),
Port: 51820,
},
Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4), Mask: net.CIDRMask(24, 32)}},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{1, 2, 3, 4}), 24),
},
FirewallMark: 999,
Implementation: "userspace",
},
@@ -356,9 +337,9 @@ func Test_Settings_Lines(t *testing.T) {
},
FirewallMark: 999,
RulePriority: 888,
Addresses: []*net.IPNet{
{IP: net.IPv4(1, 1, 1, 1), Mask: net.CIDRMask(24, 32)},
{IP: net.IPv4(2, 2, 2, 2), Mask: net.CIDRMask(32, 32)},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{1, 1, 1, 1}), 24),
netip.PrefixFrom(netip.AddrFrom4([4]byte{2, 2, 2, 2}), 32),
},
IPv6: ptr(true),
Implementation: "userspace",
@@ -386,9 +367,9 @@ func Test_Settings_Lines(t *testing.T) {
},
settings: Settings{
InterfaceName: "wg0",
Addresses: []*net.IPNet{
{IP: net.IPv4(1, 1, 1, 1), Mask: net.CIDRMask(24, 32)},
{IP: net.IPv4(2, 2, 2, 2), Mask: net.CIDRMask(32, 32)},
Addresses: []netip.Prefix{
netip.PrefixFrom(netip.AddrFrom4([4]byte{1, 1, 1, 1}), 24),
netip.PrefixFrom(netip.AddrFrom4([4]byte{2, 2, 2, 2}), 32),
},
IPv6: ptr(false),
},