|  | @@ -18,10 +18,6 @@ const (
 | 
	
		
			
				|  |  |  	IKCP_RTO_MAX     = 60000
 | 
	
		
			
				|  |  |  	IKCP_CMD_PUSH    = 81 // cmd: push data
 | 
	
		
			
				|  |  |  	IKCP_CMD_ACK     = 82 // cmd: ack
 | 
	
		
			
				|  |  | -	IKCP_CMD_WASK    = 83 // cmd: window probe (ask)
 | 
	
		
			
				|  |  | -	IKCP_CMD_WINS    = 84 // cmd: window size (tell)
 | 
	
		
			
				|  |  | -	IKCP_ASK_SEND    = 1  // need to send IKCP_CMD_WASK
 | 
	
		
			
				|  |  | -	IKCP_ASK_TELL    = 2  // need to send IKCP_CMD_WINS
 | 
	
		
			
				|  |  |  	IKCP_WND_SND     = 32
 | 
	
		
			
				|  |  |  	IKCP_WND_RCV     = 32
 | 
	
		
			
				|  |  |  	IKCP_MTU_DEF     = 1350
 | 
	
	
		
			
				|  | @@ -187,11 +183,6 @@ func (kcp *KCP) Recv(buffer []byte) (n int) {
 | 
	
		
			
				|  |  |  		return -1
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	var fast_recover bool
 | 
	
		
			
				|  |  | -	if len(kcp.rcv_queue) >= int(kcp.rcv_wnd) {
 | 
	
		
			
				|  |  | -		fast_recover = true
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	// merge fragment
 | 
	
		
			
				|  |  |  	count := 0
 | 
	
		
			
				|  |  |  	for _, seg := range kcp.rcv_queue {
 | 
	
	
		
			
				|  | @@ -208,12 +199,6 @@ func (kcp *KCP) Recv(buffer []byte) (n int) {
 | 
	
		
			
				|  |  |  	kcp.rcv_queue = kcp.rcv_queue[count:]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	kcp.DumpReceivingBuf()
 | 
	
		
			
				|  |  | -	// fast recover
 | 
	
		
			
				|  |  | -	if len(kcp.rcv_queue) < int(kcp.rcv_wnd) && fast_recover {
 | 
	
		
			
				|  |  | -		// ready to send back IKCP_CMD_WINS in ikcp_flush
 | 
	
		
			
				|  |  | -		// tell remote my window size
 | 
	
		
			
				|  |  | -		kcp.probe |= IKCP_ASK_TELL
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  |  	return
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -385,15 +370,14 @@ func (kcp *KCP) Input(data []byte) int {
 | 
	
		
			
				|  |  |  			return -2
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		if cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK &&
 | 
	
		
			
				|  |  | -			cmd != IKCP_CMD_WASK && cmd != IKCP_CMD_WINS {
 | 
	
		
			
				|  |  | +		if cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK {
 | 
	
		
			
				|  |  |  			return -3
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if kcp.rmt_wnd < uint32(wnd) {
 | 
	
		
			
				|  |  |  			kcp.rmt_wnd = uint32(wnd)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		//kcp.rmt_wnd = uint32(wnd)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		kcp.parse_una(una)
 | 
	
		
			
				|  |  |  		kcp.shrink_buf()
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -425,12 +409,6 @@ func (kcp *KCP) Input(data []byte) int {
 | 
	
		
			
				|  |  |  					kcp.parse_data(seg)
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -		} else if cmd == IKCP_CMD_WASK {
 | 
	
		
			
				|  |  | -			// ready to send back IKCP_CMD_WINS in Ikcp_flush
 | 
	
		
			
				|  |  | -			// tell remote my window size
 | 
	
		
			
				|  |  | -			kcp.probe |= IKCP_ASK_TELL
 | 
	
		
			
				|  |  | -		} else if cmd == IKCP_CMD_WINS {
 | 
	
		
			
				|  |  | -			// do nothing
 | 
	
		
			
				|  |  |  		} else {
 | 
	
		
			
				|  |  |  			return -3
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -498,56 +476,6 @@ func (kcp *KCP) flush() {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	kcp.acklist = nil
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	// probe window size (if remote window size equals zero)
 | 
	
		
			
				|  |  | -	/*
 | 
	
		
			
				|  |  | -		if kcp.rmt_wnd == 0 {
 | 
	
		
			
				|  |  | -			if kcp.probe_wait == 0 {
 | 
	
		
			
				|  |  | -				kcp.probe_wait = IKCP_PROBE_INIT
 | 
	
		
			
				|  |  | -				kcp.ts_probe = kcp.current + kcp.probe_wait
 | 
	
		
			
				|  |  | -			} else {
 | 
	
		
			
				|  |  | -				if _itimediff(kcp.current, kcp.ts_probe) >= 0 {
 | 
	
		
			
				|  |  | -					if kcp.probe_wait < IKCP_PROBE_INIT {
 | 
	
		
			
				|  |  | -						kcp.probe_wait = IKCP_PROBE_INIT
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					kcp.probe_wait += kcp.probe_wait / 2
 | 
	
		
			
				|  |  | -					if kcp.probe_wait > IKCP_PROBE_LIMIT {
 | 
	
		
			
				|  |  | -						kcp.probe_wait = IKCP_PROBE_LIMIT
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					kcp.ts_probe = kcp.current + kcp.probe_wait
 | 
	
		
			
				|  |  | -					kcp.probe |= IKCP_ASK_SEND
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		} else {
 | 
	
		
			
				|  |  | -			kcp.ts_probe = 0
 | 
	
		
			
				|  |  | -			kcp.probe_wait = 0
 | 
	
		
			
				|  |  | -		}*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// flush window probing commands
 | 
	
		
			
				|  |  | -	/*
 | 
	
		
			
				|  |  | -		if (kcp.probe & IKCP_ASK_SEND) != 0 {
 | 
	
		
			
				|  |  | -			seg.cmd = IKCP_CMD_WASK
 | 
	
		
			
				|  |  | -			size := len(buffer) - len(ptr)
 | 
	
		
			
				|  |  | -			if size+IKCP_OVERHEAD > int(kcp.mtu) {
 | 
	
		
			
				|  |  | -				kcp.output(buffer[:size])
 | 
	
		
			
				|  |  | -				ptr = buffer
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			ptr = seg.encode(ptr)
 | 
	
		
			
				|  |  | -		}*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// flush window probing commands
 | 
	
		
			
				|  |  | -	/*
 | 
	
		
			
				|  |  | -		if (kcp.probe & IKCP_ASK_TELL) != 0 {
 | 
	
		
			
				|  |  | -			seg.cmd = IKCP_CMD_WINS
 | 
	
		
			
				|  |  | -			size := len(buffer) - len(ptr)
 | 
	
		
			
				|  |  | -			if size+IKCP_OVERHEAD > int(kcp.mtu) {
 | 
	
		
			
				|  |  | -				kcp.output(buffer[:size])
 | 
	
		
			
				|  |  | -				ptr = buffer
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			ptr = seg.encode(ptr)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		kcp.probe = 0*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	// calculate window size
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	cwnd := _imin_(kcp.snd_una+kcp.snd_wnd, kcp.rmt_wnd)
 | 
	
	
		
			
				|  | @@ -582,18 +510,18 @@ func (kcp *KCP) flush() {
 | 
	
		
			
				|  |  |  		if segment.xmit == 0 {
 | 
	
		
			
				|  |  |  			needsend = true
 | 
	
		
			
				|  |  |  			segment.xmit++
 | 
	
		
			
				|  |  | -			segment.resendts = current + kcp.rx_rto + kcp.interval
 | 
	
		
			
				|  |  | +			segment.resendts = current + (kcp.rx_rto * 3 / 2) + kcp.interval
 | 
	
		
			
				|  |  |  		} else if _itimediff(current, segment.resendts) >= 0 {
 | 
	
		
			
				|  |  |  			needsend = true
 | 
	
		
			
				|  |  |  			segment.xmit++
 | 
	
		
			
				|  |  |  			kcp.xmit++
 | 
	
		
			
				|  |  | -			segment.resendts = current + kcp.rx_rto + kcp.interval
 | 
	
		
			
				|  |  | +			segment.resendts = current + (kcp.rx_rto * 3 / 2) + kcp.interval
 | 
	
		
			
				|  |  |  			//lost = true
 | 
	
		
			
				|  |  |  		} else if segment.fastack >= resent {
 | 
	
		
			
				|  |  |  			needsend = true
 | 
	
		
			
				|  |  |  			segment.xmit++
 | 
	
		
			
				|  |  |  			segment.fastack = 0
 | 
	
		
			
				|  |  | -			segment.resendts = current + kcp.rx_rto + kcp.interval
 | 
	
		
			
				|  |  | +			segment.resendts = current + (kcp.rx_rto * 3 / 2) + kcp.interval
 | 
	
		
			
				|  |  |  			change++
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 |