@@ -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 {
302298func 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