|
|
@ -168,13 +168,15 @@ type SystemConnection interface {
|
|
|
|
Overhead() int
|
|
|
|
Overhead() int
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
type ConnMetadata struct {
|
|
|
|
_ buf.Reader = (*Connection)(nil)
|
|
|
|
LocalAddr net.Addr
|
|
|
|
)
|
|
|
|
RemoteAddr net.Addr
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Connection is a KCP connection over UDP.
|
|
|
|
// Connection is a KCP connection over UDP.
|
|
|
|
type Connection struct {
|
|
|
|
type Connection struct {
|
|
|
|
conn SystemConnection
|
|
|
|
meta *ConnMetadata
|
|
|
|
|
|
|
|
closer io.Closer
|
|
|
|
rd time.Time
|
|
|
|
rd time.Time
|
|
|
|
wd time.Time // write deadline
|
|
|
|
wd time.Time // write deadline
|
|
|
|
since int64
|
|
|
|
since int64
|
|
|
@ -201,24 +203,24 @@ type Connection struct {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewConnection create a new KCP connection between local and remote.
|
|
|
|
// NewConnection create a new KCP connection between local and remote.
|
|
|
|
func NewConnection(conv uint16, sysConn SystemConnection, config *Config) *Connection {
|
|
|
|
func NewConnection(conv uint16, meta *ConnMetadata, writer PacketWriter, closer io.Closer, config *Config) *Connection {
|
|
|
|
log.Trace(newError("creating connection ", conv))
|
|
|
|
log.Trace(newError("creating connection ", conv))
|
|
|
|
|
|
|
|
|
|
|
|
conn := &Connection{
|
|
|
|
conn := &Connection{
|
|
|
|
conv: conv,
|
|
|
|
conv: conv,
|
|
|
|
conn: sysConn,
|
|
|
|
meta: meta,
|
|
|
|
|
|
|
|
closer: closer,
|
|
|
|
since: nowMillisec(),
|
|
|
|
since: nowMillisec(),
|
|
|
|
dataInput: make(chan bool, 1),
|
|
|
|
dataInput: make(chan bool, 1),
|
|
|
|
dataOutput: make(chan bool, 1),
|
|
|
|
dataOutput: make(chan bool, 1),
|
|
|
|
Config: config,
|
|
|
|
Config: config,
|
|
|
|
output: NewRetryableWriter(NewSegmentWriter(sysConn)),
|
|
|
|
output: NewRetryableWriter(NewSegmentWriter(writer)),
|
|
|
|
mss: config.GetMTUValue() - uint32(sysConn.Overhead()) - DataSegmentOverhead,
|
|
|
|
mss: config.GetMTUValue() - uint32(writer.Overhead()) - DataSegmentOverhead,
|
|
|
|
roundTrip: &RoundTripInfo{
|
|
|
|
roundTrip: &RoundTripInfo{
|
|
|
|
rto: 100,
|
|
|
|
rto: 100,
|
|
|
|
minRtt: config.GetTTIValue(),
|
|
|
|
minRtt: config.GetTTIValue(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sysConn.Reset(conn.Input)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
conn.receivingWorker = NewReceivingWorker(conn)
|
|
|
|
conn.receivingWorker = NewReceivingWorker(conn)
|
|
|
|
conn.sendingWorker = NewSendingWorker(conn)
|
|
|
|
conn.sendingWorker = NewSendingWorker(conn)
|
|
|
@ -413,7 +415,7 @@ func (v *Connection) Close() error {
|
|
|
|
if state.Is(StateReadyToClose, StateTerminating, StateTerminated) {
|
|
|
|
if state.Is(StateReadyToClose, StateTerminating, StateTerminated) {
|
|
|
|
return ErrClosedConnection
|
|
|
|
return ErrClosedConnection
|
|
|
|
}
|
|
|
|
}
|
|
|
|
log.Trace(newError("closing connection to ", v.conn.RemoteAddr()))
|
|
|
|
log.Trace(newError("closing connection to ", v.meta.RemoteAddr))
|
|
|
|
|
|
|
|
|
|
|
|
if state == StateActive {
|
|
|
|
if state == StateActive {
|
|
|
|
v.SetState(StateReadyToClose)
|
|
|
|
v.SetState(StateReadyToClose)
|
|
|
@ -433,7 +435,7 @@ func (v *Connection) LocalAddr() net.Addr {
|
|
|
|
if v == nil {
|
|
|
|
if v == nil {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return v.conn.LocalAddr()
|
|
|
|
return v.meta.LocalAddr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it.
|
|
|
|
// RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it.
|
|
|
@ -441,7 +443,7 @@ func (v *Connection) RemoteAddr() net.Addr {
|
|
|
|
if v == nil {
|
|
|
|
if v == nil {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return v.conn.RemoteAddr()
|
|
|
|
return v.meta.RemoteAddr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.
|
|
|
|
// SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.
|
|
|
@ -488,7 +490,7 @@ func (v *Connection) Terminate() {
|
|
|
|
v.OnDataInput()
|
|
|
|
v.OnDataInput()
|
|
|
|
v.OnDataOutput()
|
|
|
|
v.OnDataOutput()
|
|
|
|
|
|
|
|
|
|
|
|
v.conn.Close()
|
|
|
|
v.closer.Close()
|
|
|
|
v.sendingWorker.Release()
|
|
|
|
v.sendingWorker.Release()
|
|
|
|
v.receivingWorker.Release()
|
|
|
|
v.receivingWorker.Release()
|
|
|
|
}
|
|
|
|
}
|
|
|
|