Skip to content

Commit 9a47656

Browse files
add some per session snmp stats
close socket when kcp session is closed increase dead link detection from 20 to 200
1 parent da7b321 commit 9a47656

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

kcp.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const (
4545
IKCP_ACK_FAST = 3
4646
IKCP_INTERVAL = 100
4747
IKCP_OVERHEAD = 24
48-
IKCP_DEADLINK = 20
48+
IKCP_DEADLINK = 200 //rodent, 20 seems to low
4949
IKCP_THRESH_INIT = 2
5050
IKCP_THRESH_MIN = 2
5151
IKCP_PROBE_INIT = 7000 // 7 secs to probe window size
@@ -148,6 +148,7 @@ func (seg *segment) encode(ptr []byte) []byte {
148148
ptr = ikcp_encode32u(ptr, seg.una)
149149
ptr = ikcp_encode32u(ptr, uint32(len(seg.data)))
150150
atomic.AddUint64(&DefaultSnmp.OutSegs, 1)
151+
151152
return ptr
152153
}
153154

@@ -176,6 +177,7 @@ type KCP struct {
176177

177178
buffer []byte
178179
output output_callback
180+
snmp Snmp
179181
}
180182

181183
type ackItem struct {
@@ -608,6 +610,7 @@ func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int {
608610
}
609611
if regular && repeat {
610612
atomic.AddUint64(&DefaultSnmp.RepeatSegs, 1)
613+
atomic.AddUint64(&kcp.snmp.RepeatSegs, 1)
611614
}
612615
} else if cmd == IKCP_CMD_WASK {
613616
// ready to send back IKCP_CMD_WINS in Ikcp_flush
@@ -623,6 +626,7 @@ func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int {
623626
data = data[length:]
624627
}
625628
atomic.AddUint64(&DefaultSnmp.InSegs, inSegs)
629+
atomic.AddUint64(&kcp.snmp.InSegs, inSegs)
626630

627631
// update rtt with the latest ts
628632
// ignore the FEC packet
@@ -712,6 +716,7 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
712716
if _itimediff(ack.sn, kcp.rcv_nxt) >= 0 || len(kcp.acklist)-1 == i {
713717
seg.sn, seg.ts = ack.sn, ack.ts
714718
ptr = seg.encode(ptr)
719+
atomic.AddUint64(&kcp.snmp.OutSegs, 1)
715720
}
716721
}
717722
kcp.acklist = kcp.acklist[0:0]
@@ -750,13 +755,15 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
750755
seg.cmd = IKCP_CMD_WASK
751756
makeSpace(IKCP_OVERHEAD)
752757
ptr = seg.encode(ptr)
758+
atomic.AddUint64(&kcp.snmp.OutSegs, 1)
753759
}
754760

755761
// flush window probing commands
756762
if (kcp.probe & IKCP_ASK_TELL) != 0 {
757763
seg.cmd = IKCP_CMD_WINS
758764
makeSpace(IKCP_OVERHEAD)
759765
ptr = seg.encode(ptr)
766+
atomic.AddUint64(&kcp.snmp.OutSegs, 1)
760767
}
761768

762769
kcp.probe = 0
@@ -843,6 +850,7 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
843850
need := IKCP_OVERHEAD + len(segment.data)
844851
makeSpace(need)
845852
ptr = segment.encode(ptr)
853+
atomic.AddUint64(&kcp.snmp.OutSegs, 1)
846854
copy(ptr, segment.data)
847855
ptr = ptr[len(segment.data):]
848856

@@ -862,19 +870,23 @@ func (kcp *KCP) flush(ackOnly bool) uint32 {
862870

863871
// counter updates
864872
sum := lostSegs
865-
if lostSegs > 0 {
873+
if lostSegs > 0 {
866874
atomic.AddUint64(&DefaultSnmp.LostSegs, lostSegs)
875+
atomic.AddUint64(&kcp.snmp.LostSegs, lostSegs)
867876
}
868877
if fastRetransSegs > 0 {
869878
atomic.AddUint64(&DefaultSnmp.FastRetransSegs, fastRetransSegs)
879+
atomic.AddUint64(&kcp.snmp.FastRetransSegs, fastRetransSegs)
870880
sum += fastRetransSegs
871881
}
872882
if earlyRetransSegs > 0 {
873883
atomic.AddUint64(&DefaultSnmp.EarlyRetransSegs, earlyRetransSegs)
884+
atomic.AddUint64(&kcp.snmp.EarlyRetransSegs, earlyRetransSegs)
874885
sum += earlyRetransSegs
875886
}
876887
if sum > 0 {
877888
atomic.AddUint64(&DefaultSnmp.RetransSegs, sum)
889+
atomic.AddUint64(&kcp.snmp.RetransSegs, sum)
878890
}
879891

880892
// cwnd update

sess.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,13 @@ func (s *UDPSession) update() {
692692
// GetConv gets conversation id of a session
693693
func (s *UDPSession) GetConv() uint32 { return s.kcp.conv }
694694

695+
// GetState gets the kcp state of a sessions
696+
// mostly useful for "dead" state = 0xFFFFFFFF dead_link after 20 unacks ?
697+
func (s *UDPSession) GetState() uint32 { return s.kcp.state }
698+
699+
// GetSnmp gets the snmp table of a session
700+
func (s *UDPSession) GetSnmp() *Snmp { return &s.kcp.snmp }
701+
695702
// GetRTO gets current rto of the session
696703
func (s *UDPSession) GetRTO() uint32 {
697704
s.mu.Lock()
@@ -1065,6 +1072,7 @@ func (l *Listener) closeSession(remote net.Addr) (ret bool) {
10651072
l.sessionLock.Lock()
10661073
defer l.sessionLock.Unlock()
10671074
if _, ok := l.sessions[remote.String()]; ok {
1075+
l.sessions[remote.String()].Close()
10681076
delete(l.sessions, remote.String())
10691077
return true
10701078
}

0 commit comments

Comments
 (0)