]> Sergey Matveev's repositories - btrtrc.git/blob - netip-addrport.go
Drop support for go 1.20
[btrtrc.git] / netip-addrport.go
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 }