func (cl *Client) newConnection(nc net.Conn, outgoing bool, remoteAddr net.Addr, network, connString string) (c *PeerConn) {
c = &PeerConn{
- conn: nc,
- outgoing: outgoing,
- choking: true,
- peerChoking: true,
- PeerMaxRequests: 250,
- writeBuffer: new(bytes.Buffer),
- remoteAddr: remoteAddr,
- network: network,
- connString: connString,
+ peer: peer{
+ outgoing: outgoing,
+ choking: true,
+ peerChoking: true,
+ PeerMaxRequests: 250,
+
+ remoteAddr: remoteAddr,
+ network: network,
+ connString: connString,
+ },
+ conn: nc,
+ writeBuffer: new(bytes.Buffer),
}
c.logger = cl.logger.WithValues(c).WithDefaultLevel(log.Debug).WithText(func(m log.Msg) string {
return fmt.Sprintf("%v: %s", c, m.Text())
require.NoError(t, err)
assert.True(t, _new)
defer tt.Drop()
- cn := &PeerConn{
+ cn := &PeerConn{peer: peer{
t: tt,
- }
+ }}
assert.NoError(t, cn.peerSentHave(0))
assert.Error(t, cn.peerSentHave(1))
}
PeerSourcePex = "X"
)
-// Maintains the state of a connection with a peer.
-type PeerConn struct {
- // First to ensure 64-bit alignment for atomics. See #262.
- _stats ConnStats
-
- t *Torrent
- // The actual Conn, used for closing, and setting socket options.
- conn net.Conn
+type peer struct {
+ t *Torrent
connString string
outgoing bool
network string
remoteAddr net.Addr
- // The Reader and Writer for this Conn, with hooks installed for stats,
- // limiting, deadlines etc.
- w io.Writer
- r io.Reader
// True if the connection is operating over MSE obfuscation.
headerEncrypted bool
cryptoMethod mse.CryptoMethod
pieceInclination []int
_pieceRequestOrder prioritybitmap.PriorityBitmap
+ logger log.Logger
+}
+
+// Maintains the state of a connection with a peer.
+type PeerConn struct {
+ // First to ensure 64-bit alignment for atomics. See #262.
+ _stats ConnStats
+
+ peer
+
+ // The actual Conn, used for closing, and setting socket options.
+ conn net.Conn
+ // The Reader and Writer for this Conn, with hooks installed for stats,
+ // limiting, deadlines etc.
+ w io.Writer
+ r io.Reader
+
writeBuffer *bytes.Buffer
uploadTimer *time.Timer
writerCond sync.Cond
-
- logger log.Logger
}
func (cn *PeerConn) updateExpectingChunks() {
conn *PeerConn
f pp.PexPeerFlags
}{
- {&PeerConn{outgoing: false, PeerPrefersEncryption: false}, 0},
- {&PeerConn{outgoing: false, PeerPrefersEncryption: true}, pp.PexPrefersEncryption},
- {&PeerConn{outgoing: true, PeerPrefersEncryption: false}, pp.PexOutgoingConn},
- {&PeerConn{outgoing: true, PeerPrefersEncryption: true}, pp.PexOutgoingConn | pp.PexPrefersEncryption},
- {&PeerConn{remoteAddr: udpAddr}, pp.PexSupportsUtp},
- {&PeerConn{remoteAddr: udpAddr, outgoing: true}, pp.PexOutgoingConn | pp.PexSupportsUtp},
- {&PeerConn{remoteAddr: tcpAddr, outgoing: true}, pp.PexOutgoingConn},
- {&PeerConn{remoteAddr: tcpAddr}, 0},
+ {&PeerConn{peer: peer{outgoing: false, PeerPrefersEncryption: false}}, 0},
+ {&PeerConn{peer: peer{outgoing: false, PeerPrefersEncryption: true}}, pp.PexPrefersEncryption},
+ {&PeerConn{peer: peer{outgoing: true, PeerPrefersEncryption: false}}, pp.PexOutgoingConn},
+ {&PeerConn{peer: peer{outgoing: true, PeerPrefersEncryption: true}}, pp.PexOutgoingConn | pp.PexPrefersEncryption},
+ {&PeerConn{peer: peer{remoteAddr: udpAddr}}, pp.PexSupportsUtp},
+ {&PeerConn{peer: peer{remoteAddr: udpAddr, outgoing: true}}, pp.PexOutgoingConn | pp.PexSupportsUtp},
+ {&PeerConn{peer: peer{remoteAddr: tcpAddr, outgoing: true}}, pp.PexOutgoingConn},
+ {&PeerConn{peer: peer{remoteAddr: tcpAddr}}, 0},
}
for i, tc := range testcases {
f := tc.conn.pexPeerFlags()
}{
{
pexAdd,
- &PeerConn{remoteAddr: udpAddr},
+ &PeerConn{peer: peer{remoteAddr: udpAddr}},
pexEvent{pexAdd, udpAddr, pp.PexSupportsUtp},
},
{
pexDrop,
- &PeerConn{remoteAddr: tcpAddr, outgoing: true, PeerListenPort: dialTcpAddr.Port},
+ &PeerConn{peer: peer{remoteAddr: tcpAddr, outgoing: true, PeerListenPort: dialTcpAddr.Port}},
pexEvent{pexDrop, tcpAddr, pp.PexOutgoingConn},
},
{
pexAdd,
- &PeerConn{remoteAddr: tcpAddr, PeerListenPort: dialTcpAddr.Port},
+ &PeerConn{peer: peer{remoteAddr: tcpAddr, PeerListenPort: dialTcpAddr.Port}},
pexEvent{pexAdd, dialTcpAddr, 0},
},
{
pexDrop,
- &PeerConn{remoteAddr: udpAddr, PeerListenPort: dialUdpAddr.Port},
+ &PeerConn{peer: peer{remoteAddr: udpAddr, PeerListenPort: dialUdpAddr.Port}},
pexEvent{pexDrop, dialUdpAddr, pp.PexSupportsUtp},
},
}
func TestPexAdded(t *testing.T) {
t.Run("noHold", func(t *testing.T) {
s := new(pexState)
- s.Add(&PeerConn{remoteAddr: addrs[0], outgoing: true})
+ s.Add(&PeerConn{peer: peer{remoteAddr: addrs[0], outgoing: true}})
targ := &pexState{
ev: []pexEvent{
pexEvent{pexAdd, addrs[0], pp.PexOutgoingConn},
},
nc: 0,
}
- s.Add(&PeerConn{remoteAddr: addrs[0]})
+ s.Add(&PeerConn{peer: peer{remoteAddr: addrs[0]}})
targ := &pexState{
hold: []pexEvent{
pexEvent{pexDrop, addrs[1], 0},
},
nc: pexTargAdded,
}
- s.Add(&PeerConn{remoteAddr: addrs[0]})
+ s.Add(&PeerConn{peer: peer{remoteAddr: addrs[0]}})
targ := &pexState{
hold: []pexEvent{},
ev: []pexEvent{
func TestPexDropped(t *testing.T) {
t.Run("belowTarg", func(t *testing.T) {
s := &pexState{nc: 1}
- s.Drop(&PeerConn{remoteAddr: addrs[0], pex: pexConnState{Listed: true}})
+ s.Drop(&PeerConn{peer: peer{remoteAddr: addrs[0], pex: pexConnState{Listed: true}}})
targ := &pexState{
hold: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
nc: 0,
})
t.Run("aboveTarg", func(t *testing.T) {
s := &pexState{nc: pexTargAdded + 1}
- s.Drop(&PeerConn{remoteAddr: addrs[0], pex: pexConnState{Listed: true}})
+ s.Drop(&PeerConn{peer: peer{remoteAddr: addrs[0], pex: pexConnState{Listed: true}}})
targ := &pexState{
ev: []pexEvent{pexEvent{pexDrop, addrs[0], 0}},
nc: pexTargAdded,
})
t.Run("aboveTargNotListed", func(t *testing.T) {
s := &pexState{nc: pexTargAdded + 1}
- s.Drop(&PeerConn{remoteAddr: addrs[0], pex: pexConnState{Listed: false}})
+ s.Drop(&PeerConn{peer: peer{remoteAddr: addrs[0], pex: pexConnState{Listed: false}}})
targ := &pexState{nc: pexTargAdded + 1}
require.EqualValues(t, targ, s)
})