]> Sergey Matveev's repositories - btrtrc.git/blobdiff - peerconn.go
WIP support for ut_holepunch
[btrtrc.git] / peerconn.go
index 1163ad7740d6143278fe8cc02681222e71925a90..c45d87ff6d06e527f7f82a7c006014352c497d30 100644 (file)
@@ -9,10 +9,13 @@ import (
        "io"
        "math/rand"
        "net"
+       "net/netip"
        "strconv"
        "strings"
        "time"
 
+       utHolepunch "github.com/anacrolix/torrent/peer_protocol/ut-holepunch"
+
        "github.com/RoaringBitmap/roaring"
        . "github.com/anacrolix/generics"
        "github.com/anacrolix/log"
@@ -59,6 +62,8 @@ type PeerConn struct {
        peerSentHaveAll bool
 
        peerRequestDataAllocLimiter alloclim.Limiter
+
+       outstandingHolepunchingRendezvous map[netip.AddrPort]struct{}
 }
 
 func (cn *PeerConn) peerImplStatusLines() []string {
@@ -879,6 +884,13 @@ func (c *PeerConn) onReadExtendedMsg(id pp.ExtensionNumber, payload []byte) (err
                        err = fmt.Errorf("receiving pex message: %w", err)
                }
                return
+       case utHolepunchExtendedId:
+               var msg utHolepunch.Msg
+               err = msg.UnmarshalBinary(payload)
+               if err != nil {
+                       err = fmt.Errorf("unmarshalling ut_holepunch message: %w", err)
+                       return
+               }
        default:
                return fmt.Errorf("unexpected extended message ID: %v", id)
        }
@@ -1050,3 +1062,9 @@ func (cn *PeerConn) PeerPieces() *roaring.Bitmap {
 func (pc *PeerConn) remoteIsTransmission() bool {
        return bytes.HasPrefix(pc.PeerID[:], []byte("-TR")) && pc.PeerID[7] == '-'
 }
+
+func (pc *PeerConn) remoteAddrPort() Option[netip.AddrPort] {
+       return Some(pc.conn.RemoteAddr().(interface {
+               AddrPort() netip.AddrPort
+       }).AddrPort())
+}