summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2024-03-10 10:25:04 +0100
committerHarald Welte <laforge@osmocom.org>2024-03-10 10:25:32 +0100
commitec466b0efa90d2740ab09bdbd3668923066ee9e2 (patch)
treecc568463ce60ae6790404c7b77d7b1dac444c2bb
parent4431c23d408c017e55e2db923825da7a8369a2dd (diff)
T.62: Add dissection of parameters; make tree hierarchical
-rw-r--r--t62.lua61
1 files changed, 50 insertions, 11 deletions
diff --git a/t62.lua b/t62.lua
index c594a21..2126631 100644
--- a/t62.lua
+++ b/t62.lua
@@ -74,7 +74,9 @@ local session_pi_pgi_names = {
[0xe7] = "Private use 7",
[0xe8] = "Non-standardixed capabilities",
}
-local hf_session_pi_pgi = ProtoField.uint8("t64.session.pi", "Parameter (Group) Identifier", base.HEX, session_pi_pgi_names)
+local hf_session_pi_pgi = ProtoField.uint8("t62.session.pi", "Session Parameter (Group) Identifier", base.HEX, session_pi_pgi_names)
+local hf_session_pli = ProtoField.uint8("t62.session.pli", "Session Parameter (Group) Length Identifier", base.DEC)
+local hf_session_pdata = ProtoField.bytes("t62.session.pdata", "Session Parameter Data")
local doc_cri_names_long = {
-- Table 5/T.62: CRI for document command identifiers
@@ -114,6 +116,7 @@ local doc_cri_names = {
[0x3e] = "RDCLP",
[0x00] = "RDGR",
}
+local hf_session_param = ProtoField.none("t62.session.param", "Document Parameter")
local hf_document_cri = ProtoField.uint8("t62.document.cri", "Command/Response Identifier", base.HEX, doc_cri_names)
local hf_document_li = ProtoField.uint8("t62.document.li", "Length Identifier", base.DEC)
@@ -160,7 +163,10 @@ local doc_pi_pgi_names = {
[0xe7] = "Private use 7",
[0xe8] = "Non-standardized capabilities",
}
-local hf_doc_pi_pgi = ProtoField.uint8("t64.document.pi", "Parameter (Group) Identifier", base.HEX, doc_pi_pgi_names)
+local hf_doc_param = ProtoField.none("t62.document.param", "Document Parameter")
+local hf_doc_pi_pgi = ProtoField.uint8("t62.document.pi", "Document Parameter (Group) Identifier", base.HEX, doc_pi_pgi_names)
+local hf_doc_pli = ProtoField.uint8("t62.document.pli", "Document Parameter (Group) Length Identifier", base.DEC)
+local hf_doc_pdata = ProtoField.bytes("t62.document.pdata", "Document Parameter Data")
-- 5.7.2.10 Reason (session or document)
local reason_names = {
@@ -193,34 +199,63 @@ local teletex_page_format_names = {
}
t62_protocol.fields = {
- hf_session_cri, hf_session_li, hf_session_pi_pgi,
- hf_document_cri, hf_document_li, hf_doc_pi_pgi,
+ hf_session_cri, hf_session_li,
+ hf_session_param, hf_session_pi_pgi, hf_session_pli, hf_session_pdata,
+ hf_document_cri, hf_document_li,
+ hf_doc_param, hf_doc_pi_pgi, hf_doc_pli, hf_doc_pdata,
hf_document_data,
}
+function decode_one_session_pi_pgi(buffer, offset, pinfo, tree)
+ local pi = buffer(offset, 1):uint()
+ local p_li = buffer(offset+1, 1):uint()
+ local subtree = tree:add(hf_session_param, buffer(offset, 2+p_li))
+ subtree:append_text(" " .. session_pi_pgi_names[pi])
+ subtree:add(hf_session_pi_pgi, buffer(offset, 1))
+ subtree:add(hf_session_pli, buffer(offset+1, 1))
+ subtree:add(hf_session_pdata, buffer(offset+2, p_li))
+ return 2 + p_li
+end
+
+function decode_one_doc_pi_pgi(buffer, offset, pinfo, tree)
+ local pi = buffer(offset, 1):uint()
+ local p_li = buffer(offset+1, 1):uint()
+ local subtree = tree:add(hf_doc_param, buffer(offset, 2+p_li))
+ subtree:append_text(" " .. doc_pi_pgi_names[pi])
+ subtree:add(hf_doc_pi_pgi, buffer(offset, 1))
+ subtree:add(hf_doc_pli, buffer(offset+1, 1))
+ subtree:add(hf_doc_pdata, buffer(offset+2, p_li))
+ return 2 + p_li
+end
+
function decode_t62_document(buffer, pinfo, tree)
local d_cri = buffer(0, 1):uint()
local d_li = buffer(1, 1):uint()
+ local subtree = tree:add(t62_protocol, buffer(), "T.62 Document")
pinfo.cols.info:append(" " .. doc_cri_names[d_cri])
- tree:append_text(" " .. doc_cri_names[d_cri] .. "(" .. doc_cri_names_long[d_cri] .. ")")
- tree:add(hf_document_cri, buffer(0, 1))
- tree:add(hf_document_li, buffer(1, 1))
+ subtree:append_text(" " .. doc_cri_names[d_cri] .. " (" .. doc_cri_names_long[d_cri] .. ")")
+ subtree:add(hf_document_cri, buffer(0, 1))
+ subtree:add(hf_document_li, buffer(1, 1))
+ -- document parameters
if (d_li > 0) then
- -- FIXME: document parameters
+ local offset = 2
+ while (offset <= buffer:len() and offset - 2 < d_li) do
+ offset = offset + decode_one_doc_pi_pgi(buffer, offset, pinfo, subtree)
+ end
end
-- user data only exists in CDUI
if (d_cri == 0x01) then
- tree:add(hf_document_data, buffer(2))
+ subtree:add(hf_document_data, buffer(2))
end
end
function t62_protocol.dissector(buffer, pinfo, tree)
pinfo.cols.protocol = t62_protocol.name
- local subtree = tree:add(t62_protocol, buffer(), "T.62")
+ local subtree = tree:add(t62_protocol, buffer(), "T.62 Session")
local offset = 0
local s_cri = buffer(0, 1):uint()
@@ -232,7 +267,11 @@ function t62_protocol.dissector(buffer, pinfo, tree)
subtree:add(hf_session_li, buffer(1, 1))
if (s_li > 0) then
- -- FIXME: session parameters
+ -- session parameters
+ local offset = 2
+ while (offset <= buffer:len() and offset - 2 < s_li) do
+ offset = offset + decode_one_session_pi_pgi(buffer, offset, pinfo, subtree)
+ end
end
-- document layer data only exists in CSUI / RSUI