package dht
-import (
- "net"
-
- "github.com/anacrolix/missinggo"
-)
+import "net"
// Used internally to refer to node network addresses.
type Addr interface {
- net.Addr
UDPAddr() *net.UDPAddr
- IP() net.IP
+ String() string
}
// Speeds up some of the commonly called Addr methods.
type cachedAddr struct {
- a net.Addr
+ ua net.UDPAddr
s string
- ip net.IP
-}
-
-func (ca cachedAddr) Network() string {
- return ca.a.Network()
}
func (ca cachedAddr) String() string {
}
func (ca cachedAddr) UDPAddr() *net.UDPAddr {
- return ca.a.(*net.UDPAddr)
-}
-
-func (ca cachedAddr) IP() net.IP {
- return ca.ip
+ return &ca.ua
}
-func newDHTAddr(addr net.Addr) Addr {
- return cachedAddr{addr, addr.String(), missinggo.AddrIP(addr)}
+func NewAddr(ua *net.UDPAddr) Addr {
+ return cachedAddr{
+ ua: *ua,
+ s: ua.String(),
+ }
}
"log"
"time"
- "github.com/anacrolix/missinggo"
"github.com/anacrolix/sync"
"github.com/willf/bloom"
return nil, err
}
for _, addr := range addrs {
- startAddrs = append(startAddrs, newDHTAddr(addr))
+ startAddrs = append(startAddrs, NewAddr(addr))
}
}
disc := &Announce{
}
func (me *Announce) gotNodeAddr(addr Addr) {
- if missinggo.AddrPort(addr) == 0 {
+ if addr.UDPAddr().Port == 0 {
// Not a contactable address.
return
}
if len(peerId) != 20 {
return
}
- if !NodeIdSecure(peerId, to.IP()) {
+ if !NodeIdSecure(peerId, to.UDPAddr().IP) {
return
}
}
err = errors.New("nil addr in node info")
return
}
- buf.Write(ni.Addr.IP().To4())
+ buf.Write(ni.Addr.UDPAddr().IP.To4())
binary.Write(&buf, binary.BigEndian, uint16(ni.Addr.UDPAddr().Port))
}
return bencode.Marshal(buf.Bytes())
if n.id.IsUnset() {
return false
}
- return NodeIdSecure(n.id.ByteString(), n.addr.IP())
+ return NodeIdSecure(n.id.ByteString(), n.addr.UDPAddr().IP)
}
func (n *node) idString() string {
}
addr, err := net.ResolveUDPAddr("udp4", "1.2.3.4:5")
require.NoError(t, err)
- cni.Addr = newDHTAddr(addr)
+ cni.Addr = NewAddr(addr)
var b [CompactIPv4NodeInfoLen]byte
err = cni.PutCompact(b[:])
require.NoError(t, err)
R: &Return{
Nodes: CompactIPv4NodeInfo{
NodeInfo{
- Addr: newDHTAddr(&net.UDPAddr{
+ Addr: NewAddr(&net.UDPAddr{
IP: net.IPv4(1, 2, 3, 4).To4(),
Port: 0x1234,
}),
if n := copy(b[:], ni.ID[:]); n != 20 {
panic(n)
}
- ip := missinggo.AddrIP(ni.Addr).To4()
+ ip := ni.Addr.UDPAddr().IP.To4()
if len(ip) != 4 {
return errors.New("expected ipv4 address")
}
if n := copy(b[20:], ip); n != 4 {
panic(n)
}
- binary.BigEndian.PutUint16(b[24:], uint16(missinggo.AddrPort(ni.Addr)))
+ binary.BigEndian.PutUint16(b[24:], uint16(ni.Addr.UDPAddr().Port))
return nil
}
return errors.New("expected 26 bytes")
}
missinggo.CopyExact(cni.ID[:], b[:20])
- cni.Addr = newDHTAddr(&net.UDPAddr{
+ cni.Addr = NewAddr(&net.UDPAddr{
IP: append(make([]byte, 0, 4), b[20:24]...),
Port: int(binary.BigEndian.Uint16(b[24:26])),
})
readBlocked.Add(1)
continue
}
- s.processPacket(b[:n], newDHTAddr(addr))
+ s.processPacket(b[:n], NewAddr(addr.(*net.UDPAddr)))
}
}
func (s *Server) Ping(node *net.UDPAddr) (*Transaction, error) {
s.mu.Lock()
defer s.mu.Unlock()
- return s.query(newDHTAddr(node), "ping", nil, nil)
+ return s.query(NewAddr(node), "ping", nil, nil)
}
func (s *Server) announcePeer(node Addr, infoHash string, port int, token string, impliedPort bool) (err error) {
return
}
for _, cni := range d.R.Nodes {
- if missinggo.AddrPort(cni.Addr) == 0 {
+ if cni.Addr.UDPAddr().Port == 0 {
// TODO: Why would people even do this?
continue
}
- if s.ipBlocked(missinggo.AddrIP(cni.Addr)) {
+ if s.ipBlocked(cni.Addr.UDPAddr().IP) {
continue
}
n := s.getNode(cni.Addr, string(cni.ID[:]))
continue
}
s.nodes[addr.String()] = &node{
- addr: newDHTAddr(addr),
+ addr: NewAddr(addr),
}
}
return nil