// See the order given in Transmission's tr_peerMsgsNew.
func (cl *Client) sendInitialMessages(conn *PeerConn, torrent *Torrent) {
if conn.PeerExtensionBytes.SupportsExtended() && cl.config.Extensions.SupportsExtended() {
- conn.post(pp.Message{
+ conn.write(pp.Message{
Type: pp.Extended,
ExtendedID: pp.HandshakeExtendedID,
ExtendedPayload: func() []byte {
func() {
if conn.fastEnabled() {
if torrent.haveAllPieces() {
- conn.post(pp.Message{Type: pp.HaveAll})
+ conn.write(pp.Message{Type: pp.HaveAll})
conn.sentHaves.AddRange(0, bitmap.BitIndex(conn.t.NumPieces()))
return
} else if !torrent.haveAnyPieces() {
- conn.post(pp.Message{Type: pp.HaveNone})
+ conn.write(pp.Message{Type: pp.HaveNone})
conn.sentHaves.Clear()
return
}
conn.postBitfield()
}()
if conn.PeerExtensionBytes.SupportsDHT() && cl.config.Extensions.SupportsDHT() && cl.haveDhtServer() {
- conn.post(pp.Message{
+ conn.write(pp.Message{
Type: pp.Port,
Port: cl.dhtPort(),
})
return err
case pp.RequestMetadataExtensionMsgType:
if !t.haveMetadataPiece(piece) {
- c.post(t.newMetadataExtensionMessage(c, pp.RejectMetadataExtensionMsgType, d["piece"], nil))
+ c.write(t.newMetadataExtensionMessage(c, pp.RejectMetadataExtensionMsgType, d["piece"], nil))
return nil
}
start := (1 << 14) * piece
c.logger.WithDefaultLevel(log.Debug).Printf("sending metadata piece %d", piece)
- c.post(t.newMetadataExtensionMessage(c, pp.DataMetadataExtensionMsgType, piece, t.metadataBytes[start:start+t.metadataPieceSize(piece)]))
+ c.write(t.newMetadataExtensionMessage(c, pp.DataMetadataExtensionMsgType, piece, t.metadataBytes[start:start+t.metadataPieceSize(piece)]))
return nil
case pp.RejectMetadataExtensionMsgType:
return nil
// https://github.com/pion/datachannel/issues/59 is fixed.
const writeBufferHighWaterLen = 1 << 15
-// Writes a message into the write buffer. Returns whether it's okay to keep writing. Posting is
-// done asynchronously, so it may be that we're not able to honour backpressure from this method. It
-// might be possible to merge this with PeerConn.write down the track? They seem to be very similar.
-func (cn *PeerConn) post(msg pp.Message) bool {
- torrent.Add(fmt.Sprintf("messages posted of type %s", msg.Type.String()), 1)
+// Writes a message into the write buffer. Returns whether it's okay to keep writing. Writing is
+// done asynchronously, so it may be that we're not able to honour backpressure from this method.
+func (cn *PeerConn) write(msg pp.Message) bool {
+ torrent.Add(fmt.Sprintf("messages written of type %s", msg.Type.String()), 1)
// We don't need to track bytes here because a connection.w Writer wrapper takes care of that
// (although there's some delay between us recording the message, and the connection writer
// flushing it out.).
cn.writeBuffer.Write(msg.MustMarshalBinary())
- // Last I checked only Piece messages affect stats, and we don't post those.
- cn.wroteMsg(&msg)
- cn.tickleWriter()
- return cn.writeBuffer.Len() < writeBufferHighWaterLen
-}
-
-// Returns true if there's room to write more.
-func (cn *PeerConn) write(msg pp.Message) bool {
+ // Last I checked only Piece messages affect stats, and we don't write those.
cn.wroteMsg(&msg)
- cn.writeBuffer.Write(msg.MustMarshalBinary())
- torrent.Add(fmt.Sprintf("messages filled of type %s", msg.Type.String()), 1)
cn.tickleWriter()
return !cn.writeBufferFull()
}
return
}
cn.logger.WithDefaultLevel(log.Debug).Printf("requesting metadata piece %d", index)
- cn.post(pp.Message{
+ cn.write(pp.Message{
Type: pp.Extended,
ExtendedID: eID,
ExtendedPayload: func() []byte {
if cn.sentHaves.Get(bitmap.BitIndex(piece)) {
return
}
- cn.post(pp.Message{
+ cn.write(pp.Message{
Type: pp.Have,
Index: pp.Integer(piece),
})
if !cn.t.haveAnyPieces() {
return
}
- cn.post(pp.Message{
+ cn.write(pp.Message{
Type: pp.Bitfield,
Bitfield: cn.t.bitfield(),
})
if !c.fastEnabled() {
panic("fast not enabled")
}
- c.post(r.ToMsg(pp.Reject))
+ c.write(r.ToMsg(pp.Reject))
delete(c.peerRequests, r)
}
if c.choking {
c.logger.WithDefaultLevel(log.Warning).Printf("already choking peer, requests might not be rejected correctly")
}
- c.choke(c.post)
+ c.choke(c.write)
}
func readPeerRequestData(r Request, c *PeerConn) ([]byte, error) {