From 69192d956aa2b6b3dbf87bac0e265e718b49dd70 Mon Sep 17 00:00:00 2001 From: bt Date: Tue, 10 Mar 2026 14:48:51 +0100 Subject: Update spec --- cmd/client/main.go | 2 +- solec.ksy | 21 ++ solec.lua | 155 +++++++++++---- solec.svg | 549 ++++++++++++++++++++++++++++++++--------------------- 4 files changed, 468 insertions(+), 259 deletions(-) diff --git a/cmd/client/main.go b/cmd/client/main.go index bf28e87..6e5d996 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -29,7 +29,7 @@ func main() { func ping(conn net.Conn) { for { log.Print("ping") - data, err := core.Encode(core.Ping{}) + data, err := core.Encode(core.Pong{Timestamp: time.Now()}) if err != nil { panic(err) } diff --git a/solec.ksy b/solec.ksy index 01c7481..82f3bf7 100644 --- a/solec.ksy +++ b/solec.ksy @@ -21,6 +21,10 @@ seq: type: switch-on: payload_type cases: + 'type::handshake': handshake + 'type::ping': ping + 'type::pong': pong +# 'type::message': message 'type::test': test types: @@ -32,13 +36,30 @@ types: type: str size: len_payload encoding: UTF-8 + binary: seq: - id: len_payload type: u2 - id: payload size: len_payload + + handshake: + seq: + - id: proto_ver_major + type: u1 + - id: proto_ver_minor + type: u1 + + ping: {} + + pong: + seq: + - id: timestamp + type: u8 + test: + doc: Test payload, used for parsers testing seq: - id: num1 type: u1 diff --git a/solec.lua b/solec.lua index f48831b..e4c8514 100644 --- a/solec.lua +++ b/solec.lua @@ -13,15 +13,6 @@ local Solec_payload_type = ProtoField.new('payload_type', 'Solec.payload_type', table.insert(proto.fields, Solec_payload_type) local Solec_payload_length = ProtoField.new('payload_length', 'Solec.payload_length', ftypes.UINT32) table.insert(proto.fields, Solec_payload_length) -local Solec_String_len_payload = ProtoField.new('len_payload', 'Solec.String.len_payload', ftypes.UINT32) -table.insert(proto.fields, Solec_String_len_payload) -local str_decode = require("string_decode") -local Solec_String_payload = ProtoField.new('payload', 'Solec.String.payload', ftypes.STRINGZ) -table.insert(proto.fields, Solec_String_payload) -local Solec_Binary_len_payload = ProtoField.new('len_payload', 'Solec.Binary.len_payload', ftypes.UINT32) -table.insert(proto.fields, Solec_Binary_len_payload) -local Solec_Binary_payload = ProtoField.new('payload', 'Solec.Binary.payload', ftypes.BYTES) -table.insert(proto.fields, Solec_Binary_payload) local Solec_Test_num1 = ProtoField.new('num1', 'Solec.Test.num1', ftypes.UINT8) table.insert(proto.fields, Solec_Test_num1) local Solec_Test_time1 = ProtoField.new('time1', 'Solec.Test.time1', ftypes.UINT32) @@ -32,6 +23,21 @@ local Solec_Test_num3 = ProtoField.new('num3', 'Solec.Test.num3', ftypes.UINT32) table.insert(proto.fields, Solec_Test_num3) local Solec_Test_num4 = ProtoField.new('num4', 'Solec.Test.num4', ftypes.UINT32) table.insert(proto.fields, Solec_Test_num4) +local Solec_Binary_len_payload = ProtoField.new('len_payload', 'Solec.Binary.len_payload', ftypes.UINT32) +table.insert(proto.fields, Solec_Binary_len_payload) +local Solec_Binary_payload = ProtoField.new('payload', 'Solec.Binary.payload', ftypes.BYTES) +table.insert(proto.fields, Solec_Binary_payload) +local Solec_String_len_payload = ProtoField.new('len_payload', 'Solec.String.len_payload', ftypes.UINT32) +table.insert(proto.fields, Solec_String_len_payload) +local str_decode = require("string_decode") +local Solec_String_payload = ProtoField.new('payload', 'Solec.String.payload', ftypes.STRINGZ) +table.insert(proto.fields, Solec_String_payload) +local Solec_Handshake_proto_ver_major = ProtoField.new('proto_ver_major', 'Solec.Handshake.proto_ver_major', ftypes.UINT8) +table.insert(proto.fields, Solec_Handshake_proto_ver_major) +local Solec_Handshake_proto_ver_minor = ProtoField.new('proto_ver_minor', 'Solec.Handshake.proto_ver_minor', ftypes.UINT8) +table.insert(proto.fields, Solec_Handshake_proto_ver_minor) +local Solec_Pong_timestamp = ProtoField.new('timestamp', 'Solec.Pong.timestamp', ftypes.UINT32) +table.insert(proto.fields, Solec_Pong_timestamp) function proto.dissector(tvb, pinfo, root) pinfo.cols.protocol = 'Solec' @@ -67,7 +73,19 @@ function Solec:_read() self._tree:add(Solec_payload_length, self._io._io.tvb(_offset, self._io:pos() - _offset), self.payload_length) local _offset = self._io:pos() local _on = self.payload_type - if _on == Solec.Type.test then + if _on == Solec.Type.handshake then + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload') + self.payload = Solec.Handshake(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + elseif _on == Solec.Type.ping then + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload') + self.payload = Solec.Ping(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + elseif _on == Solec.Type.pong then + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload') + self.payload = Solec.Pong(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + elseif _on == Solec.Type.test then local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload') self.payload = Solec.Test(self._io, _tree, self, self._root) _tree:set_len(self._io:pos() - _offset) @@ -75,9 +93,11 @@ function Solec:_read() end -Solec.String = class.class(KaitaiStruct) +-- +-- Test payload, used for parsers testing. +Solec.Test = class.class(KaitaiStruct) -function Solec.String:_init(io, tree, parent, root) +function Solec.Test:_init(io, tree, parent, root) KaitaiStruct._init(self, io) self._parent = parent self._root = root or self @@ -85,13 +105,34 @@ function Solec.String:_init(io, tree, parent, root) self:_read() end -function Solec.String:_read() +function Solec.Test:_read() local _offset = self._io:pos() - self.len_payload = self._io:read_u2be() - self._tree:add(Solec_String_len_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.len_payload) + self.num1 = self._io:read_u1() + self._tree:add(Solec_Test_num1, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num1) local _offset = self._io:pos() - self.payload = str_decode.decode(self._io:read_bytes(self.len_payload), "UTF-8") - self._tree:add(Solec_String_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.payload) + self.time1 = self._io:read_u8be() + self._tree:add(Solec_Test_time1, self._io._io.tvb(_offset, self._io:pos() - _offset), self.time1) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str1') + self.str1 = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.num2 = self._io:read_u2be() + self._tree:add(Solec_Test_num2, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num2) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'bin1') + self.bin1 = Solec.Binary(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.num3 = self._io:read_u4be() + self._tree:add(Solec_Test_num3, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num3) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str2') + self.str2 = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.num4 = self._io:read_u8be() + self._tree:add(Solec_Test_num4, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num4) end @@ -115,9 +156,9 @@ function Solec.Binary:_read() end -Solec.Test = class.class(KaitaiStruct) +Solec.String = class.class(KaitaiStruct) -function Solec.Test:_init(io, tree, parent, root) +function Solec.String:_init(io, tree, parent, root) KaitaiStruct._init(self, io) self._parent = parent self._root = root or self @@ -125,34 +166,64 @@ function Solec.Test:_init(io, tree, parent, root) self:_read() end -function Solec.Test:_read() - local _offset = self._io:pos() - self.num1 = self._io:read_u1() - self._tree:add(Solec_Test_num1, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num1) - local _offset = self._io:pos() - self.time1 = self._io:read_u8be() - self._tree:add(Solec_Test_time1, self._io._io.tvb(_offset, self._io:pos() - _offset), self.time1) - local _offset = self._io:pos() - local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str1') - self.str1 = Solec.String(self._io, _tree, self, self._root) - _tree:set_len(self._io:pos() - _offset) +function Solec.String:_read() local _offset = self._io:pos() - self.num2 = self._io:read_u2be() - self._tree:add(Solec_Test_num2, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num2) + self.len_payload = self._io:read_u2be() + self._tree:add(Solec_String_len_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.len_payload) local _offset = self._io:pos() - local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'bin1') - self.bin1 = Solec.Binary(self._io, _tree, self, self._root) - _tree:set_len(self._io:pos() - _offset) + self.payload = str_decode.decode(self._io:read_bytes(self.len_payload), "UTF-8") + self._tree:add(Solec_String_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.payload) +end + + +Solec.Ping = class.class(KaitaiStruct) + +function Solec.Ping:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Ping:_read() +end + + +Solec.Handshake = class.class(KaitaiStruct) + +function Solec.Handshake:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Handshake:_read() local _offset = self._io:pos() - self.num3 = self._io:read_u4be() - self._tree:add(Solec_Test_num3, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num3) + self.proto_ver_major = self._io:read_u1() + self._tree:add(Solec_Handshake_proto_ver_major, self._io._io.tvb(_offset, self._io:pos() - _offset), self.proto_ver_major) local _offset = self._io:pos() - local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str2') - self.str2 = Solec.String(self._io, _tree, self, self._root) - _tree:set_len(self._io:pos() - _offset) + self.proto_ver_minor = self._io:read_u1() + self._tree:add(Solec_Handshake_proto_ver_minor, self._io._io.tvb(_offset, self._io:pos() - _offset), self.proto_ver_minor) +end + + +Solec.Pong = class.class(KaitaiStruct) + +function Solec.Pong:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Pong:_read() local _offset = self._io:pos() - self.num4 = self._io:read_u8be() - self._tree:add(Solec_Test_num4, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num4) + self.timestamp = self._io:read_u8be() + self._tree:add(Solec_Pong_timestamp, self._io._io.tvb(_offset, self._io:pos() - _offset), self.timestamp) end diff --git a/solec.svg b/solec.svg index 30b2ba8..360c759 100644 --- a/solec.svg +++ b/solec.svg @@ -4,274 +4,391 @@ - - - + + + cluster__solec - -Solec + +Solec cluster__binary - -Solec::Binary + +Solec::Binary -cluster__string - -Solec::String +cluster__handshake + +Solec::Handshake +cluster__ping + +Solec::Ping + + +cluster__pong + +Solec::Pong + + +cluster__string + +Solec::String + + cluster__test - -Solec::Test + +Solec::Test solec__seq - - -pos - - -size - - -type - - -id - -0 - -1 - -u1→Type - -payload_type - -1 - -2 - -u2be - -payload_length - -3 - -... - -switch (payload_type) - -payload + + +pos + + +size + + +type + + +id + +0 + +1 + +u1→Type + +payload_type + +1 + +2 + +u2be + +payload_length + +3 + +... + +switch (payload_type) + +payload - + solec__seq:payload_type_type->solec__seq:payload_type - - + + solec__seq_payload_switch - - -case - - -type - -:type_test - -Test + + +case + + +type + +:type_handshake + +Handshake + +:type_ping + +Ping + +:type_pong + +Pong + +:type_test + +Test solec__seq:payload_type->solec__seq_payload_switch - - + + - + + +handshake__seq + + +pos + + +size + + +type + + +id + +0 + +1 + +u1 + +proto_ver_major + +1 + +1 + +u1 + +proto_ver_minor + + + +solec__seq_payload_switch:case0->handshake__seq + + + + +ping__seq + + +pos + + +size + + +type + + +id + + + +solec__seq_payload_switch:case1->ping__seq + + + + + +pong__seq + + +pos + + +size + + +type + + +id + +0 + +8 + +u8be + +timestamp + + + +solec__seq_payload_switch:case2->pong__seq + + + + + test__seq - - -pos - - -size - - -type - - -id - -0 - -1 - -u1 - -num1 - -1 - -8 - -u8be - -time1 - -9 - -... - -String - -str1 - -... - -2 - -u2be - -num2 - -... - -... - -Binary - -bin1 - -... - -4 - -u4be - -num3 - -... - -... - -String - -str2 - -... - -8 - -u8be - -num4 + + +pos + + +size + + +type + + +id + +0 + +1 + +u1 + +num1 + +1 + +8 + +u8be + +time1 + +9 + +... + +String + +str1 + +... + +2 + +u2be + +num2 + +... + +... + +Binary + +bin1 + +... + +4 + +u4be + +num3 + +... + +... + +String + +str2 + +... + +8 + +u8be + +num4 - -solec__seq_payload_switch:case0->test__seq - - + +solec__seq_payload_switch:case3->test__seq + + binary__seq - - -pos - - -size - - -type - - -id - -0 - -2 - -u2be - -len_payload - -2 - -len_payload - - -payload + + +pos + + +size + + +type + + +id + +0 + +2 + +u2be + +len_payload + +2 + +len_payload + + +payload - + binary__seq:len_payload_type->binary__seq:payload_size - - + + - + string__seq - - -pos - - -size - - -type - - -id - -0 - -2 - -u2be - -len_payload - -2 - -len_payload - -str(UTF-8) - -payload + + +pos + + +size + + +type + + +id + +0 + +2 + +u2be + +len_payload + +2 + +len_payload + +str(UTF-8) + +payload - + string__seq:len_payload_type->string__seq:payload_size - - + + - + test__seq:bin1_type->binary__seq - - + + - + test__seq:str1_type->string__seq - - + + - + test__seq:str2_type->string__seq - - + + -- cgit v1.2.3