|  | @@ -18,10 +18,6 @@ const (
 | 
											
												
													
														|  |  	IKCP_RTO_MAX     = 60000
 |  |  	IKCP_RTO_MAX     = 60000
 | 
											
												
													
														|  |  	IKCP_CMD_PUSH    = 81 // cmd: push data
 |  |  	IKCP_CMD_PUSH    = 81 // cmd: push data
 | 
											
												
													
														|  |  	IKCP_CMD_ACK     = 82 // cmd: ack
 |  |  	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_SND     = 32
 | 
											
												
													
														|  |  	IKCP_WND_RCV     = 32
 |  |  	IKCP_WND_RCV     = 32
 | 
											
												
													
														|  |  	IKCP_MTU_DEF     = 1350
 |  |  	IKCP_MTU_DEF     = 1350
 | 
											
										
											
												
													
														|  | @@ -187,11 +183,6 @@ func (kcp *KCP) Recv(buffer []byte) (n int) {
 | 
											
												
													
														|  |  		return -1
 |  |  		return -1
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	var fast_recover bool
 |  | 
 | 
											
												
													
														|  | -	if len(kcp.rcv_queue) >= int(kcp.rcv_wnd) {
 |  | 
 | 
											
												
													
														|  | -		fast_recover = true
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  	// merge fragment
 |  |  	// merge fragment
 | 
											
												
													
														|  |  	count := 0
 |  |  	count := 0
 | 
											
												
													
														|  |  	for _, seg := range kcp.rcv_queue {
 |  |  	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.rcv_queue = kcp.rcv_queue[count:]
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	kcp.DumpReceivingBuf()
 |  |  	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
 |  |  	return
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -385,15 +370,14 @@ func (kcp *KCP) Input(data []byte) int {
 | 
											
												
													
														|  |  			return -2
 |  |  			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
 |  |  			return -3
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		if kcp.rmt_wnd < uint32(wnd) {
 |  |  		if kcp.rmt_wnd < uint32(wnd) {
 | 
											
												
													
														|  |  			kcp.rmt_wnd = uint32(wnd)
 |  |  			kcp.rmt_wnd = uint32(wnd)
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  | -		//kcp.rmt_wnd = uint32(wnd)
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  		kcp.parse_una(una)
 |  |  		kcp.parse_una(una)
 | 
											
												
													
														|  |  		kcp.shrink_buf()
 |  |  		kcp.shrink_buf()
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -425,12 +409,6 @@ func (kcp *KCP) Input(data []byte) int {
 | 
											
												
													
														|  |  					kcp.parse_data(seg)
 |  |  					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 {
 |  |  		} else {
 | 
											
												
													
														|  |  			return -3
 |  |  			return -3
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
										
											
												
													
														|  | @@ -498,56 +476,6 @@ func (kcp *KCP) flush() {
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	kcp.acklist = nil
 |  |  	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
 |  |  	// calculate window size
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	cwnd := _imin_(kcp.snd_una+kcp.snd_wnd, kcp.rmt_wnd)
 |  |  	cwnd := _imin_(kcp.snd_una+kcp.snd_wnd, kcp.rmt_wnd)
 | 
											
										
											
												
													
														|  | @@ -582,18 +510,18 @@ func (kcp *KCP) flush() {
 | 
											
												
													
														|  |  		if segment.xmit == 0 {
 |  |  		if segment.xmit == 0 {
 | 
											
												
													
														|  |  			needsend = true
 |  |  			needsend = true
 | 
											
												
													
														|  |  			segment.xmit++
 |  |  			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 {
 |  |  		} else if _itimediff(current, segment.resendts) >= 0 {
 | 
											
												
													
														|  |  			needsend = true
 |  |  			needsend = true
 | 
											
												
													
														|  |  			segment.xmit++
 |  |  			segment.xmit++
 | 
											
												
													
														|  |  			kcp.xmit++
 |  |  			kcp.xmit++
 | 
											
												
													
														|  | -			segment.resendts = current + kcp.rx_rto + kcp.interval
 |  | 
 | 
											
												
													
														|  | 
 |  | +			segment.resendts = current + (kcp.rx_rto * 3 / 2) + kcp.interval
 | 
											
												
													
														|  |  			//lost = true
 |  |  			//lost = true
 | 
											
												
													
														|  |  		} else if segment.fastack >= resent {
 |  |  		} else if segment.fastack >= resent {
 | 
											
												
													
														|  |  			needsend = true
 |  |  			needsend = true
 | 
											
												
													
														|  |  			segment.xmit++
 |  |  			segment.xmit++
 | 
											
												
													
														|  |  			segment.fastack = 0
 |  |  			segment.fastack = 0
 | 
											
												
													
														|  | -			segment.resendts = current + kcp.rx_rto + kcp.interval
 |  | 
 | 
											
												
													
														|  | 
 |  | +			segment.resendts = current + (kcp.rx_rto * 3 / 2) + kcp.interval
 | 
											
												
													
														|  |  			change++
 |  |  			change++
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  
 |  |  
 |