56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package transport
|
|
|
|
import "encoding/binary"
|
|
|
|
const kcpPacketHeaderSize = 24
|
|
|
|
func parseKCPPacketMetadata(packet []byte) (*uint32, []KCPPacketDebugSegment) {
|
|
conv := parseKCPConversationID(packet)
|
|
segments, ok := parseKCPPacketSegments(packet)
|
|
if !ok {
|
|
return conv, nil
|
|
}
|
|
return conv, segments
|
|
}
|
|
|
|
func parseKCPConversationID(packet []byte) *uint32 {
|
|
if len(packet) < 4 {
|
|
return nil
|
|
}
|
|
conv := binary.LittleEndian.Uint32(packet[:4])
|
|
return &conv
|
|
}
|
|
|
|
func parseKCPPacketSegments(packet []byte) ([]KCPPacketDebugSegment, bool) {
|
|
if len(packet) == 0 {
|
|
return nil, false
|
|
}
|
|
|
|
data := packet
|
|
segments := make([]KCPPacketDebugSegment, 0, 1)
|
|
for len(data) > 0 {
|
|
if len(data) < kcpPacketHeaderSize {
|
|
return nil, false
|
|
}
|
|
|
|
segmentLen := binary.LittleEndian.Uint32(data[20:])
|
|
totalLen := kcpPacketHeaderSize + int(segmentLen)
|
|
if len(data) < totalLen {
|
|
return nil, false
|
|
}
|
|
|
|
segments = append(segments, KCPPacketDebugSegment{
|
|
Cmd: data[4],
|
|
Frg: data[5],
|
|
Wnd: binary.LittleEndian.Uint16(data[6:8]),
|
|
SN: binary.LittleEndian.Uint32(data[12:16]),
|
|
UNA: binary.LittleEndian.Uint32(data[16:20]),
|
|
Len: segmentLen,
|
|
})
|
|
|
|
data = data[totalLen:]
|
|
}
|
|
|
|
return segments, true
|
|
}
|