chore(all): use netip.Prefix for ip networks
- remove usage of `net.IPNet` - remove usage of `netaddr.IPPrefix`
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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),
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user