github.com/anacrolix/torrent@v1.61.0/netip-addrport.go (about) 1 package torrent 2 3 import ( 4 "fmt" 5 "net/netip" 6 7 "github.com/anacrolix/dht/v2/krpc" 8 ) 9 10 type addrPorter interface { 11 AddrPort() netip.AddrPort 12 } 13 14 func ipv4AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error) { 15 ip4 := na.IP.To4() 16 if ip4 == nil { 17 err = fmt.Errorf("not an ipv4 address: %v", na.IP) 18 return 19 } 20 addr := netip.AddrFrom4(*(*[4]byte)(ip4)) 21 addrPort := netip.AddrPortFrom(addr, uint16(na.Port)) 22 return addrPort, nil 23 } 24 25 func ipv6AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error) { 26 ip6 := na.IP.To16() 27 if ip6 == nil { 28 err = fmt.Errorf("not an ipv4 address: %v", na.IP) 29 return 30 } 31 addr := netip.AddrFrom16(*(*[16]byte)(ip6)) 32 addrPort := netip.AddrPortFrom(addr, uint16(na.Port)) 33 return addrPort, nil 34 } 35 36 func addrPortFromPeerRemoteAddr(pra PeerRemoteAddr) (netip.AddrPort, error) { 37 switch v := pra.(type) { 38 case addrPorter: 39 return v.AddrPort(), nil 40 case netip.AddrPort: 41 return v, nil 42 default: 43 return netip.ParseAddrPort(pra.String()) 44 } 45 } 46 47 func krpcNodeAddrFromAddrPort(addrPort netip.AddrPort) krpc.NodeAddr { 48 return krpc.NodeAddr{ 49 IP: addrPort.Addr().AsSlice(), 50 Port: int(addrPort.Port()), 51 } 52 }