feat(protocol): carry complete encoded media frames
Verify Protocol / verify (push) Canceled after 0s
Verify Protocol / module (push) Successful in 53s

This commit is contained in:
sechmachine
2026-07-30 22:23:22 +07:00
parent d1d00d6472
commit c554cac00d
25 changed files with 303 additions and 74 deletions
+24 -11
View File
@@ -14,11 +14,6 @@ import (
protocol "git.sechmachine.io.vn/sechmachine/VerseVDI-Protocol/gen/go/protocol"
)
const (
datagramHeaderBytes = 21
maximumFrameBytes = 65536
)
func main() {
entries, err := os.ReadDir("fixtures/conformance")
if err != nil {
@@ -320,16 +315,24 @@ func classifyDatagram(encoded string) string {
if err != nil {
return "invalid:hex"
}
if len(raw) < datagramHeaderBytes {
if len(raw) < 3 {
return "invalid:truncated"
}
if string(raw[:2]) != "VD" {
return "invalid:magic"
}
if raw[2] != 1 {
if raw[2] != 1 && raw[2] != 2 {
return "invalid:unsupported_version"
}
headerBytes := 21
limits := map[byte]int{1: 1024, 2: 2048, 3: 65515, 10: 1179, 11: 1179, 12: 1179}
if raw[2] == 2 {
headerBytes = 23
limits = map[byte]int{10: 1177, 11: 1177}
}
if len(raw) < headerBytes {
return "invalid:truncated"
}
limit, ok := limits[raw[3]]
if !ok {
return "invalid:unknown_channel"
@@ -337,17 +340,27 @@ func classifyDatagram(encoded string) string {
if raw[4] != 0 {
return "invalid:flags"
}
if raw[18] == 0 || raw[17] >= raw[18] {
fragmentIndex, fragmentCount := int(raw[17]), int(raw[18])
payloadOffset := 19
if raw[2] == 2 {
fragmentIndex = int(raw[17])<<8 | int(raw[18])
fragmentCount = int(raw[19])<<8 | int(raw[20])
payloadOffset = 21
if fragmentCount > 891 {
return "invalid:fragment_limit"
}
}
if fragmentCount == 0 || fragmentIndex >= fragmentCount {
return "invalid:fragment"
}
payloadLength := int(raw[19])<<8 | int(raw[20])
payloadLength := int(raw[payloadOffset])<<8 | int(raw[payloadOffset+1])
if payloadLength > limit {
return "invalid:payload_limit"
}
if len(raw) != datagramHeaderBytes+payloadLength {
if len(raw) != headerBytes+payloadLength {
return "invalid:length_mismatch"
}
if len(raw) > maximumFrameBytes {
if raw[2] == 1 && len(raw) > 65536 || raw[2] == 2 && len(raw) > 1200 {
return "invalid:frame_limit"
}
return "valid"