@@ -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