Skip to content

Commit 49dce0a

Browse files
committed
Convert wgfreebsd to use netip.Prefix
Signed-off-by: MrMelon54 <[email protected]>
1 parent 2a11b05 commit 49dce0a

File tree

1 file changed

+32
-35
lines changed

1 file changed

+32
-35
lines changed

internal/wgfreebsd/client_freebsd.go

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import (
1212
"encoding/binary"
1313
"fmt"
1414
"net"
15+
"net/netip"
1516
"os"
1617
"runtime"
18+
"strconv"
1719
"time"
1820
"unsafe"
1921

@@ -275,24 +277,18 @@ func parseEndpoint(ep []byte) *net.UDPAddr {
275277
case unix.AF_INET:
276278
sa := (*unix.RawSockaddrInet4)(unsafe.Pointer(&ep[0]))
277279

278-
ep := &net.UDPAddr{
279-
IP: make(net.IP, net.IPv4len),
280-
Port: ntohs(sa.Port),
281-
}
282-
copy(ep.IP, sa.Addr[:])
283-
284-
return ep
280+
return net.UDPAddrFromAddrPort(netip.AddrPortFrom(netip.AddrFrom4(sa.Addr), sa.Port))
285281
case unix.AF_INET6:
286282
sa := (*unix.RawSockaddrInet6)(unsafe.Pointer(&ep[0]))
287283

288-
// TODO(mdlayher): IPv6 zone?
289-
ep := &net.UDPAddr{
290-
IP: make(net.IP, net.IPv6len),
291-
Port: ntohs(sa.Port),
292-
}
293-
copy(ep.IP, sa.Addr[:])
284+
addr := netip.AddrFrom16(sa.Addr)
294285

295-
return ep
286+
// If the address is an IPv6 link-local address and the scope ID is non-zero
287+
// then use the scope ID as the zone
288+
if addr.Is6() && addr.IsLinkLocalUnicast() && sa.Scope_id != 0 {
289+
addr = addr.WithZone(strconv.FormatUint(uint64(sa.Scope_id), 10))
290+
}
291+
return net.UDPAddrFromAddrPort(netip.AddrPortFrom(addr, sa.Port))
296292
default:
297293
// No endpoint configured.
298294
return nil
@@ -302,54 +298,55 @@ func parseEndpoint(ep []byte) *net.UDPAddr {
302298
func unparseEndpoint(ep net.UDPAddr) []byte {
303299
var b []byte
304300

305-
if v4 := ep.IP.To4(); v4 != nil {
301+
addrPort := ep.AddrPort()
302+
addr := addrPort.Addr().Unmap()
303+
304+
switch {
305+
case addr.Is4():
306306
b = make([]byte, unsafe.Sizeof(unix.RawSockaddrInet4{}))
307307
sa := (*unix.RawSockaddrInet4)(unsafe.Pointer(&b[0]))
308308

309309
sa.Family = unix.AF_INET
310310
sa.Port = htons(ep.Port)
311-
copy(sa.Addr[:], v4)
312-
} else if v6 := ep.IP.To16(); v6 != nil {
311+
sa.Addr = addr.As4()
312+
case addr.Is6():
313313
b = make([]byte, unsafe.Sizeof(unix.RawSockaddrInet6{}))
314314
sa := (*unix.RawSockaddrInet6)(unsafe.Pointer(&b[0]))
315315

316316
sa.Family = unix.AF_INET6
317317
sa.Port = htons(ep.Port)
318-
copy(sa.Addr[:], v6)
318+
sa.Addr = addr.As16()
319319
}
320320

321321
return b
322322
}
323323

324324
// parseAllowedIP unpacks a net.IPNet from a WGAIP structure.
325-
func parseAllowedIP(aip nv.List) net.IPNet {
325+
func parseAllowedIP(aip nv.List) netip.Prefix {
326326
cidr := int(aip["cidr"].(uint64))
327327
if ip, ok := aip["ipv4"]; ok {
328-
return net.IPNet{
329-
IP: net.IP(ip.([]byte)),
330-
Mask: net.CIDRMask(cidr, 32),
331-
}
328+
addr, _ := netip.AddrFromSlice(ip.([]byte))
329+
return netip.PrefixFrom(addr, cidr)
332330
} else if ip, ok := aip["ipv6"]; ok {
333-
return net.IPNet{
334-
IP: net.IP(ip.([]byte)),
335-
Mask: net.CIDRMask(cidr, 128),
336-
}
331+
addr, _ := netip.AddrFromSlice(ip.([]byte))
332+
return netip.PrefixFrom(addr, cidr)
337333
} else {
338334
panicf("wgfreebsd: invalid address family for allowed IP: %+v", aip)
339-
return net.IPNet{}
335+
return netip.Prefix{}
340336
}
341337
}
342338

343-
func unparseAllowedIP(aip net.IPNet) nv.List {
339+
func unparseAllowedIP(aip netip.Prefix) nv.List {
344340
m := nv.List{}
345341

346-
ones, _ := aip.Mask.Size()
347-
m["cidr"] = uint64(ones)
342+
m["cidr"] = uint64(aip.Bits())
348343

349-
if v4 := aip.IP.To4(); v4 != nil {
350-
m["ipv4"] = []byte(v4)
351-
} else if v6 := aip.IP.To16(); v6 != nil {
352-
m["ipv6"] = []byte(v6)
344+
addr := aip.Addr().Unmap()
345+
switch {
346+
case addr.Is4():
347+
m["ipv4"] = addr.AsSlice()
348+
case addr.Is6():
349+
m["ipv6"] = addr.AsSlice()
353350
}
354351

355352
return m

0 commit comments

Comments
 (0)