Skip to content

Commit 957e5a6

Browse files
authored
XICMP finalmask: Refine seq (#5652)
Example: #5633 (comment)
1 parent 0710c2b commit 957e5a6

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

transport/internet/finalmask/xicmp/client.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const (
2020
maxPollDelay = 10 * time.Second
2121
pollDelayMultiplier = 2.0
2222
pollLimit = 16
23+
windowSize = 1000
2324
)
2425

2526
type packet struct {
@@ -30,7 +31,6 @@ type packet struct {
3031
type seqStatus struct {
3132
needSeqByte bool
3233
seqByte byte
33-
received bool
3434
}
3535

3636
type xicmpConnClient struct {
@@ -129,12 +129,14 @@ func (c *xicmpConnClient) encode(p []byte) ([]byte, error) {
129129
c.seqStatus[c.seq] = &seqStatus{
130130
needSeqByte: needSeqByte,
131131
seqByte: seqByte,
132-
received: false,
133132
}
134133

134+
delete(c.seqStatus, int(uint16(c.seq-windowSize)))
135+
135136
c.seq++
136137

137138
if c.seq == 65536 {
139+
delete(c.seqStatus, int(uint16(c.seq-windowSize)))
138140
c.seq = 1
139141
}
140142

@@ -168,16 +170,14 @@ func (c *xicmpConnClient) recvLoop() {
168170
continue
169171
}
170172

173+
c.mutex.Lock()
171174
seqStatus, ok := c.seqStatus[echo.Seq]
175+
c.mutex.Unlock()
172176

173177
if !ok {
174178
continue
175179
}
176180

177-
if seqStatus.received {
178-
continue
179-
}
180-
181181
if seqStatus.needSeqByte {
182182
if len(echo.Data) <= 1 {
183183
continue
@@ -189,7 +189,9 @@ func (c *xicmpConnClient) recvLoop() {
189189
}
190190

191191
if len(echo.Data) > 0 {
192-
seqStatus.received = true
192+
c.mutex.Lock()
193+
delete(c.seqStatus, echo.Seq)
194+
c.mutex.Unlock()
193195

194196
buf := make([]byte, len(echo.Data))
195197
copy(buf, echo.Data)

0 commit comments

Comments
 (0)