mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-07-03 02:08:45 +00:00
XICMP finalmask: Refine seq (#5652)
Example: https://github.com/XTLS/Xray-core/pull/5633#issue-3881559866
This commit is contained in:
@@ -20,6 +20,7 @@ const (
|
|||||||
maxPollDelay = 10 * time.Second
|
maxPollDelay = 10 * time.Second
|
||||||
pollDelayMultiplier = 2.0
|
pollDelayMultiplier = 2.0
|
||||||
pollLimit = 16
|
pollLimit = 16
|
||||||
|
windowSize = 1000
|
||||||
)
|
)
|
||||||
|
|
||||||
type packet struct {
|
type packet struct {
|
||||||
@@ -30,7 +31,6 @@ type packet struct {
|
|||||||
type seqStatus struct {
|
type seqStatus struct {
|
||||||
needSeqByte bool
|
needSeqByte bool
|
||||||
seqByte byte
|
seqByte byte
|
||||||
received bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type xicmpConnClient struct {
|
type xicmpConnClient struct {
|
||||||
@@ -129,12 +129,14 @@ func (c *xicmpConnClient) encode(p []byte) ([]byte, error) {
|
|||||||
c.seqStatus[c.seq] = &seqStatus{
|
c.seqStatus[c.seq] = &seqStatus{
|
||||||
needSeqByte: needSeqByte,
|
needSeqByte: needSeqByte,
|
||||||
seqByte: seqByte,
|
seqByte: seqByte,
|
||||||
received: false,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete(c.seqStatus, int(uint16(c.seq-windowSize)))
|
||||||
|
|
||||||
c.seq++
|
c.seq++
|
||||||
|
|
||||||
if c.seq == 65536 {
|
if c.seq == 65536 {
|
||||||
|
delete(c.seqStatus, int(uint16(c.seq-windowSize)))
|
||||||
c.seq = 1
|
c.seq = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,16 +170,14 @@ func (c *xicmpConnClient) recvLoop() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.mutex.Lock()
|
||||||
seqStatus, ok := c.seqStatus[echo.Seq]
|
seqStatus, ok := c.seqStatus[echo.Seq]
|
||||||
|
c.mutex.Unlock()
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if seqStatus.received {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if seqStatus.needSeqByte {
|
if seqStatus.needSeqByte {
|
||||||
if len(echo.Data) <= 1 {
|
if len(echo.Data) <= 1 {
|
||||||
continue
|
continue
|
||||||
@@ -189,7 +189,9 @@ func (c *xicmpConnClient) recvLoop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(echo.Data) > 0 {
|
if len(echo.Data) > 0 {
|
||||||
seqStatus.received = true
|
c.mutex.Lock()
|
||||||
|
delete(c.seqStatus, echo.Seq)
|
||||||
|
c.mutex.Unlock()
|
||||||
|
|
||||||
buf := make([]byte, len(echo.Data))
|
buf := make([]byte, len(echo.Data))
|
||||||
copy(buf, echo.Data)
|
copy(buf, echo.Data)
|
||||||
|
|||||||
Reference in New Issue
Block a user