|  | @@ -166,13 +166,14 @@ func (u *Updater) SetInterval(d time.Duration) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type ConnMetadata struct {
 | 
	
		
			
				|  |  | -	LocalAddr  net.Addr
 | 
	
		
			
				|  |  | -	RemoteAddr net.Addr
 | 
	
		
			
				|  |  | +	LocalAddr    net.Addr
 | 
	
		
			
				|  |  | +	RemoteAddr   net.Addr
 | 
	
		
			
				|  |  | +	Conversation uint16
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Connection is a KCP connection over UDP.
 | 
	
		
			
				|  |  |  type Connection struct {
 | 
	
		
			
				|  |  | -	meta       *ConnMetadata
 | 
	
		
			
				|  |  | +	meta       ConnMetadata
 | 
	
		
			
				|  |  |  	closer     io.Closer
 | 
	
		
			
				|  |  |  	rd         time.Time
 | 
	
		
			
				|  |  |  	wd         time.Time // write deadline
 | 
	
	
		
			
				|  | @@ -181,7 +182,6 @@ type Connection struct {
 | 
	
		
			
				|  |  |  	dataOutput chan bool
 | 
	
		
			
				|  |  |  	Config     *Config
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	conv             uint16
 | 
	
		
			
				|  |  |  	state            State
 | 
	
		
			
				|  |  |  	stateBeginTime   uint32
 | 
	
		
			
				|  |  |  	lastIncomingTime uint32
 | 
	
	
		
			
				|  | @@ -200,11 +200,10 @@ type Connection struct {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // NewConnection create a new KCP connection between local and remote.
 | 
	
		
			
				|  |  | -func NewConnection(conv uint16, meta *ConnMetadata, writer PacketWriter, closer io.Closer, config *Config) *Connection {
 | 
	
		
			
				|  |  | -	log.Trace(newError("creating connection ", conv))
 | 
	
		
			
				|  |  | +func NewConnection(meta ConnMetadata, writer PacketWriter, closer io.Closer, config *Config) *Connection {
 | 
	
		
			
				|  |  | +	log.Trace(newError("creating connection ", meta.Conversation))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	conn := &Connection{
 | 
	
		
			
				|  |  | -		conv:       conv,
 | 
	
		
			
				|  |  |  		meta:       meta,
 | 
	
		
			
				|  |  |  		closer:     closer,
 | 
	
		
			
				|  |  |  		since:      nowMillisec(),
 | 
	
	
		
			
				|  | @@ -414,7 +413,7 @@ func (v *Connection) SetState(state State) {
 | 
	
		
			
				|  |  |  	current := v.Elapsed()
 | 
	
		
			
				|  |  |  	atomic.StoreInt32((*int32)(&v.state), int32(state))
 | 
	
		
			
				|  |  |  	atomic.StoreUint32(&v.stateBeginTime, current)
 | 
	
		
			
				|  |  | -	log.Trace(newError("#", v.conv, " entering state ", state, " at ", current).AtDebug())
 | 
	
		
			
				|  |  | +	log.Trace(newError("#", v.meta.Conversation, " entering state ", state, " at ", current).AtDebug())
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	switch state {
 | 
	
		
			
				|  |  |  	case StateReadyToClose:
 | 
	
	
		
			
				|  | @@ -553,7 +552,7 @@ func (v *Connection) Input(segments []Segment) {
 | 
	
		
			
				|  |  |  	atomic.StoreUint32(&v.lastIncomingTime, current)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	for _, seg := range segments {
 | 
	
		
			
				|  |  | -		if seg.Conversation() != v.conv {
 | 
	
		
			
				|  |  | +		if seg.Conversation() != v.meta.Conversation {
 | 
	
		
			
				|  |  |  			break
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -610,7 +609,7 @@ func (v *Connection) flush() {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if v.State() == StateTerminating {
 | 
	
		
			
				|  |  | -		log.Trace(newError("#", v.conv, " sending terminating cmd.").AtDebug())
 | 
	
		
			
				|  |  | +		log.Trace(newError("#", v.meta.Conversation, " sending terminating cmd.").AtDebug())
 | 
	
		
			
				|  |  |  		v.Ping(current, CommandTerminate)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if current-atomic.LoadUint32(&v.stateBeginTime) > 8000 {
 | 
	
	
		
			
				|  | @@ -641,7 +640,7 @@ func (v *Connection) State() State {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (v *Connection) Ping(current uint32, cmd Command) {
 | 
	
		
			
				|  |  |  	seg := NewCmdOnlySegment()
 | 
	
		
			
				|  |  | -	seg.Conv = v.conv
 | 
	
		
			
				|  |  | +	seg.Conv = v.meta.Conversation
 | 
	
		
			
				|  |  |  	seg.Cmd = cmd
 | 
	
		
			
				|  |  |  	seg.ReceivinNext = v.receivingWorker.NextNumber()
 | 
	
		
			
				|  |  |  	seg.SendingNext = v.sendingWorker.FirstUnacknowledged()
 |