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 }