|
@@ -0,0 +1,466 @@
|
|
|
+
|
|
|
+TC_TM_PROTOCOL = Proto("tm_tc", "TM_TC")
|
|
|
+
|
|
|
+local f_sof1 = ProtoField.uint8("TC_TM_PROTOCOL.sof1", "SOF1", base.HEX)
|
|
|
+local f_sof2 = ProtoField.uint8("TC_TM_PROTOCOL.sof2", "SOF2", base.HEX)
|
|
|
+local f_tm_ctrl = ProtoField.uint8("TC_TM_PROTOCOL.tm_ctrl", "TM Ctrl", base.HEX)
|
|
|
+local f_GS_Id = ProtoField.uint8("TC_TM_PROTOCOL.GS_Id", "GS Id", base.HEX)
|
|
|
+local f_timestamp = ProtoField.uint32("TC_TM_PROTOCOL.timestamp", "Timestamp", base.DEC)
|
|
|
+local f_sequence_no = ProtoField.uint16("TC_TM_PROTOCOL.sequence_no", "Sequence No", base.DEC)
|
|
|
+local f_sat_id = ProtoField.uint16("TC_TM_PROTOCOL.sat_id", "SAT Id", base.DEC)
|
|
|
+local f_qos = ProtoField.uint8("TC_TM_PROTOCOL.qos", "QoS", base.DEC)
|
|
|
+local f_sa_id = ProtoField.uint16("TC_TM_PROTOCOL.sa_id", "SA Id", base.DEC)
|
|
|
+local f_da_id = ProtoField.uint16("TC_TM_PROTOCOL.da_id", "DA Id", base.DEC)
|
|
|
+local f_rm_id = ProtoField.uint8("TC_TM_PROTOCOL.rm_id", "RM Id", base.DEC)
|
|
|
+local f_tm_id = ProtoField.uint16("TC_TM_PROTOCOL.tm_id", "TM Id", base.DEC)
|
|
|
+local f_co_id = ProtoField.uint16("TC_TM_PROTOCOL.co_id", "Co Id", base.DEC)
|
|
|
+local f_tm_len = ProtoField.uint16("TC_TM_PROTOCOL.tm_len", "TM Len", base.DEC)
|
|
|
+local f_tm_data = ProtoField.uint8("TC_TM_PROTOCOL.tm_data", "TM Data", base.DEC)
|
|
|
+local f_ext_header_len = ProtoField.uint8("TC_TM_PROTOCOL.ext_header_len", "Ext Header Len", base.DEC)
|
|
|
+local f_ext_header_data = ProtoField.uint8("TC_TM_PROTOCOL.ext_header_data", "Ext Header Data", base.DEC)
|
|
|
+local f_crc = ProtoField.uint8("TC_TM_PROTOCOL.crc", "CRC", base.DEC)
|
|
|
+local f_c_mac = ProtoField.uint8("TC_TM_PROTOCOL.c_mac", "C MAC", base.DEC)
|
|
|
+local f_eof1 = ProtoField.uint8("TC_TM_PROTOCOL.eof1", "EOF1", base.HEX)
|
|
|
+local f_tc_id = ProtoField.uint16("TC_TM_PROTOCOL.tc_id", "TC Id", base.DEC)
|
|
|
+local f_tc_len = ProtoField.uint16("TC_TM_PROTOCOL.tc_len", "TC Len", base.DEC)
|
|
|
+local f_tc_data = ProtoField.uint32("TC_TM_PROTOCOL.tc_data", "TC Data", base.DEC)
|
|
|
+
|
|
|
+
|
|
|
+TC_TM_PROTOCOL.fields = {
|
|
|
+ f_sof1, f_sof2, f_tm_ctrl,f_GS_Id, f_timestamp, f_sequence_no, f_sat_id,
|
|
|
+ f_qos, f_sa_id, f_da_id, f_rm_id, f_tm_id, f_co_id, f_tm_len, f_tm_data,
|
|
|
+ f_ext_header_len, f_ext_header_data, f_crc, f_c_mac, f_eof1,f_tc_id ,f_tc_len ,f_tc_data
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function TC_dissector(buffer, pinfo, tree)
|
|
|
+
|
|
|
+ local subtree = tree:add(TC_TM_PROTOCOL, buffer(), "TELECOMMAND")
|
|
|
+
|
|
|
+
|
|
|
+ subtree:add(f_sof1 , buffer(4, 1))
|
|
|
+ subtree:add(f_sof2, buffer(5, 1))
|
|
|
+
|
|
|
+
|
|
|
+ local offset = 6
|
|
|
+ local tc_ctrl = buffer(offset, 1):le_uint()
|
|
|
+ subtree:add(f_tm_ctrl , tc_ctrl)
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 4 then
|
|
|
+ local timestamp = buffer(offset, 4):le_uint()
|
|
|
+ subtree:add(f_timestamp, timestamp)
|
|
|
+ offset = offset + 4
|
|
|
+ else
|
|
|
+ subtree:add(f_timestamp, "Invalid data (timestamp)")
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 2 then
|
|
|
+ local sequence = buffer(offset, 2):le_uint()
|
|
|
+ subtree:add(f_sequence_no, sequence)
|
|
|
+ offset = offset + 2
|
|
|
+ else
|
|
|
+ subtree:add(f_sequence_no, "Invalid data (sequence number)")
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ local sat_id = buffer(offset, 1):uint()
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(sat_id, 0x80) == 0x80 then
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ local second = buffer(offset, 2):le_uint()
|
|
|
+
|
|
|
+ if bit.band(second, 0x8000) == 0x0000 then
|
|
|
+ sat_id = buffer(offset, 2):le_uint()
|
|
|
+ sat_id = bit.band(sat_id, 0xFF7F)
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+ else
|
|
|
+ sat_id = buffer(offset, 2):le_uint()
|
|
|
+ sat_id = bit.band(sat_id, 0x7FFF)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ subtree:add(f_sat_id, sat_id)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ local gs_id = buffer(offset, 1):uint()
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(gs_id, 0x80) == 0x80 then
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ local second = buffer(offset, 2):le_uint()
|
|
|
+
|
|
|
+ if bit.band(second, 0x8000) == 0x0000 then
|
|
|
+ gs_id = buffer(offset, 2):le_uint()
|
|
|
+ gs_id = bit.band(gs_id, 0xFF7F)
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+ else
|
|
|
+ gs_id = buffer(offset, 2):le_uint()
|
|
|
+ gs_id = bit.band(gs_id, 0x7FFF)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ subtree:add(f_GS_Id, gs_id)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ subtree:add(f_qos, buffer(offset, 1))
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ local sa_id = buffer(offset, 1):uint()
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(sa_id, 0x80) == 0x80 then
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ local second = buffer(offset, 2):le_uint()
|
|
|
+
|
|
|
+ if bit.band(second, 0x8000) == 0x0000 then
|
|
|
+ sa_id = buffer(offset, 2):le_uint()
|
|
|
+ sa_id = bit.band(sa_id, 0xFF7F)
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+ else
|
|
|
+ sa_id = buffer(offset, 2):le_uint()
|
|
|
+ sa_id = bit.band(sa_id, 0x7FFF)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ subtree:add(f_sa_id, sa_id)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+
|
|
|
+ local da_id = buffer(offset, 1):le_uint()
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(da_id, 0x80) == 0x80 then
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+
|
|
|
+ local second = buffer(offset, 2):le_uint()
|
|
|
+
|
|
|
+ if bit.band(second, 0x8000) == 0x0000 then
|
|
|
+ da_id = buffer(offset, 2):le_uint()
|
|
|
+ da_id = bit.band(da_id, 0xFF7F)
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+ else
|
|
|
+ da_id = buffer(offset, 2):le_uint()
|
|
|
+ da_id = bit.band(da_id, 0x7FFF)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ subtree:add(f_da_id, da_id)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ subtree:add(f_rm_id, buffer(offset, 1))
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ local info_display
|
|
|
+ if buffer:len() >= offset + 2 then
|
|
|
+ local tc_id = buffer(offset, 1):le_uint()
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(tc_id, 0x80) == 0x80 then
|
|
|
+ if buffer:len() >= offset + 2 then
|
|
|
+
|
|
|
+
|
|
|
+ local second = buffer(offset, 2):le_uint()
|
|
|
+
|
|
|
+ if bit.band(second, 0x8000) == 0x0000 then
|
|
|
+ tc_id = buffer(offset, 2):le_uint()
|
|
|
+ tc_id = bit.band(tc_id, 0xFF7F)
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+ else
|
|
|
+ tc_id = buffer(offset, 2):le_uint()
|
|
|
+ tc_id = bit.band(tc_id, 0x7FFF)
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ subtree:add(f_tc_id, tc_id)
|
|
|
+ info_display= {buffer(11, 2):le_uint(),buffer(7, 4):le_uint() ,tc_id}
|
|
|
+
|
|
|
+
|
|
|
+ offset = offset + 1
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ local tc_len = 0
|
|
|
+ if buffer:len() >= offset + 2 then
|
|
|
+ tc_len = buffer(offset, 2):le_uint()
|
|
|
+ subtree:add(f_tc_len, tc_len)
|
|
|
+ offset = offset + 2
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ local subtree2 = subtree:add(TC_TM_PROTOCOL, buffer(), "TC_DATA")
|
|
|
+ if buffer:len() >= offset + tc_len then
|
|
|
+ if tc_len == 0 then
|
|
|
+ subtree2:add("TC DATA : NIL")
|
|
|
+ else
|
|
|
+ for i=1,tc_len do
|
|
|
+ subtree2:add(f_tc_data, buffer(offset, 1))
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(tc_ctrl, 0x80) == 0x80 and buffer:len() >= offset + 1 then
|
|
|
+ subtree:add(f_ext_header_len, buffer(offset, 1))
|
|
|
+ local ext_header_len = buffer(offset, 1):uint()
|
|
|
+ offset = offset + 1
|
|
|
+
|
|
|
+ if buffer:len() >= offset + ext_header_len then
|
|
|
+ for i=1,ext_header_len do
|
|
|
+ subtree:add(f_ext_header_data, buffer(offset, 1))
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ subtree:add(f_crc, buffer(offset, 1))
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if bit.band(tc_ctrl, 0x10) == 0x10 and buffer:len() >= offset + 32 then
|
|
|
+ for i=1,32 do
|
|
|
+ subtree:add(f_c_mac, buffer(offset, 1))
|
|
|
+ offset = offset + 1
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ if buffer:len() >= offset + 1 then
|
|
|
+ subtree:add(f_eof1, buffer(offset, 1))
|
|
|
+ end
|
|
|
+
|
|
|
+ pinfo.cols.info ="seq_no=" ..info_display[1] .." TS=" ..info_display[2].." TC_ID="..info_display[3]
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+function TM_dissector(buffer, pinfo, tree)
|
|
|
+
|
|
|
+ local subtree = tree:add(TC_TM_PROTOCOL, buffer(), "TELEMETRIC")
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ subtree:add(f_sof1, buffer(4, 1):uint())
|
|
|
+ subtree:add(f_sof2, buffer(5, 1):uint())
|
|
|
+ subtree:add(f_tm_ctrl, buffer(6, 1):le_uint())
|
|
|
+ subtree:add(f_timestamp, buffer(7, 4):le_uint())
|
|
|
+
|
|
|
+ subtree:add(f_sequence_no, buffer(11, 2):le_uint())
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ local magic = buffer(13, 1):le_uint()
|
|
|
+
|
|
|
+ local add=13
|
|
|
+ if bit.band(magic, 0x80) == 0 then
|
|
|
+ subtree:add(f_sat_id, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+ else
|
|
|
+
|
|
|
+ magic=buffer(add, 2):le_uint()
|
|
|
+ local dummy=magic & 0x8000
|
|
|
+ if dummy == 0 then
|
|
|
+ magic = magic & 0xff7f
|
|
|
+ else
|
|
|
+ magic = magic & 0x7fff
|
|
|
+ end
|
|
|
+ subtree:add(f_sat_id, magic)
|
|
|
+ add=add+2
|
|
|
+
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ subtree:add(f_qos, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+
|
|
|
+
|
|
|
+ magic = buffer(add, 1):le_uint()
|
|
|
+ if bit.band(magic, 0x80) == 0 then
|
|
|
+ subtree:add(f_sa_id, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+ else
|
|
|
+ magic=buffer(add, 2):le_uint()
|
|
|
+ local dummy=magic & 0x8000
|
|
|
+ if dummy == 0 then
|
|
|
+ magic = magic & 0xff7f
|
|
|
+ else
|
|
|
+ magic = magic & 0x7fff
|
|
|
+ end
|
|
|
+ subtree:add(f_sa_id,magic)
|
|
|
+ add=add+2
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ magic = buffer(add, 1):uint()
|
|
|
+ if bit.band(magic, 0x80) == 0 then
|
|
|
+ subtree:add(f_da_id, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+ else
|
|
|
+ magic=buffer(add, 2):le_uint()
|
|
|
+ local dummy=magic & 0x8000
|
|
|
+ if dummy == 0 then
|
|
|
+ magic = magic & 0xff7f
|
|
|
+ else
|
|
|
+ magic = magic & 0x7fff
|
|
|
+ end
|
|
|
+ subtree:add(f_da_id, magic)
|
|
|
+ add=add+2
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ subtree:add(f_rm_id, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+
|
|
|
+
|
|
|
+ local info_display
|
|
|
+ magic = buffer(add, 1):uint()
|
|
|
+ if bit.band(magic, 0x80) == 0 then
|
|
|
+ subtree:add(f_tm_id, buffer(add, 1):le_uint())
|
|
|
+ info_display= {buffer(11, 2):le_uint(),buffer(7, 4):le_uint() ,buffer(add, 1):le_uint()}
|
|
|
+ add=add+1
|
|
|
+ else
|
|
|
+ magic=buffer(add, 2):le_uint()
|
|
|
+ local dummy=magic & 0x8000
|
|
|
+ if dummy == 0 then
|
|
|
+ magic = magic & 0xff7f
|
|
|
+ else
|
|
|
+ magic = magic & 0x7fff
|
|
|
+ end
|
|
|
+ subtree:add(f_tm_id, magic)
|
|
|
+ info_display= {buffer(11, 2):le_uint(),buffer(7, 4):le_uint() ,magic}
|
|
|
+ add=add+2
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ subtree:add(f_co_id, buffer(add, 2):le_uint())
|
|
|
+ add=add+2
|
|
|
+
|
|
|
+ magic = buffer(add, 2):le_uint()
|
|
|
+ subtree:add(f_tm_len, buffer(add, 2):le_uint())
|
|
|
+ add=add+2
|
|
|
+
|
|
|
+
|
|
|
+ local subtree2 = subtree:add(TC_TM_PROTOCOL, buffer(), "TM_DATA")
|
|
|
+ for i=0,magic-1 do
|
|
|
+ subtree2:add(f_tm_data, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ magic = buffer(6, 1):le_uint()
|
|
|
+ if bit.band(magic, 0x80) == 0x80 then
|
|
|
+ magic= buffer(add, 1):uint()
|
|
|
+ subtree:add(f_ext_header_len, buffer(add, 1):uint())
|
|
|
+ add=add+1
|
|
|
+
|
|
|
+
|
|
|
+ for i=0,magic-1 do
|
|
|
+ subtree:add(f_ext_header_data, buffer(add, 1):uint())
|
|
|
+ add=add+1
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ subtree:add(f_crc, buffer(add, 1):le_uint())
|
|
|
+ add=add+1
|
|
|
+
|
|
|
+
|
|
|
+ magic = buffer(6, 1):le_uint()
|
|
|
+ if bit.band(magic, 0x10) == 0x10 then
|
|
|
+ for i=1,32 do
|
|
|
+ subtree:add(f_c_mac, buffer(add, 1):uint())
|
|
|
+ add=add+1
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ subtree:add(f_eof1, buffer(add, 1):uint())
|
|
|
+
|
|
|
+
|
|
|
+ pinfo.cols.info ="seq_no=" ..info_display[1] .." TS=" ..info_display[2].." TM_ID="..info_display[3]
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function TC_TM_PROTOCOL.dissector(buffer, pinfo, tree)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ pinfo.cols.protocol = "TM_TC"
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ local direction = buffer(6, 1):uint()
|
|
|
+
|
|
|
+ if direction & 0x40 == 0x40 then
|
|
|
+ pinfo.cols.protocol = "TELEMETRY"
|
|
|
+ TM_dissector(buffer, pinfo, tree)
|
|
|
+
|
|
|
+ else
|
|
|
+ pinfo.cols.protocol = "TELECOMMAND"
|
|
|
+ TC_dissector(buffer, pinfo, tree)
|
|
|
+
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+local udp_port = 6779
|
|
|
+local udp_table = DissectorTable.get("udp.port")
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+udp_table:add(udp_port, TC_TM_PROTOCOL)
|