123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- -- Define the protocol
- IPCC_PROTOCOL = Proto("IPCC", "IPCC")
- -- Define protocol fields
- local f_sof1 = ProtoField.uint8("IPCC_PROTOCOL.sof1", "SOF1", base.HEX)
- local f_ipcc_ctrl = ProtoField.uint8("IPCC_PROTOCOL.ipcc_ctrl", "IPCC Ctrl", base.HEX)
- local f_timestamp = ProtoField.uint32("IPCC_PROTOCOL.timestamp", "Timestamp", base.HEX)
- local f_seq_no = ProtoField.uint16("IPCC_PROTOCOL.seq_no", "Sequence No", base.HEX)
- local f_qos = ProtoField.uint8("IPCC_PROTOCOL.qos", "QoS", base.HEX)
- local f_sa_id = ProtoField.uint16("IPCC_PROTOCOL.sa_id", "SA Id", base.HEX)
- local f_da_id = ProtoField.uint16("IPCC_PROTOCOL.da_id", "DA Id", base.HEX)
- local f_ipcc_id = ProtoField.uint8("IPCC_PROTOCOL.ipcc_id", "IPCC Id", base.HEX)
- local f_ipcc_len = ProtoField.uint16("IPCC_PROTOCOL.ipcc_len", "IPCC Len", base.HEX)
- local f_ipcc_data = ProtoField.uint8("IPCC_PROTOCOL.ipcc_data", "IPCC Data", base.HEX)
- local f_keys = ProtoField.uint8("IPCC_PROTOCOL.keys", "Keys", base.HEX)
- local f_sec_cfg = ProtoField.uint16("IPCC_PROTOCOL.sec_cfg", "Security Config", base.HEX)
- local f_mac_cfg = ProtoField.uint16("IPCC_PROTOCOL.mac_cfg", "MAC Config", base.HEX)
- local f_crc_32 = ProtoField.uint32("IPCC_PROTOCOL.crc_32", "CRC 32", base.HEX)
- local f_cmac_hmac = ProtoField.uint8("IPCC_PROTOCOL.cmac_hmac", "CMAC/HMAC", base.HEX)
- local disp = ProtoField.uint8("IPCC_PROTOCOL.disp", "disp", base.HEX)
- -- Add the fields to the protocol
- IPCC_PROTOCOL.fields = {
- f_sof1, f_ipcc_ctrl, f_timestamp, f_seq_no, f_qos, f_sa_id, f_da_id,
- f_ipcc_id, f_ipcc_len, f_ipcc_data, f_keys, f_sec_cfg, f_mac_cfg,
- f_crc_32, f_cmac_hmac
- }
- --------------------------------------------------------------------------------------------------------------------------------------------
- -- Dissector function for Telemetry (OBC to GS)
- function IPCC_TM_dissector(buffer, pinfo, tree)
- --pinfo.cols.protocol = "IPCC"
- --local tcp_flags = buffer(13, 1):uint()
- --if bit.band(tcp_flags, 0x10) == 0x10 then -- ACK flag (0x10)
- --Handle ACK packets or empty packets
- -- local subtree = tree:add(IPCC_PROTOCOL, buffer(), "IPCC")
- --subtree:add(disp, buffer())
- --else
- local subtree = tree:add(IPCC_PROTOCOL, buffer(), "IPCC")
- local add=0
- local magic=0
- local info_display
- -- Add the fields to the protocol subtree
- subtree:add(f_sof1, buffer(add, 1):le_uint())
- add=add+1
- subtree:add(f_ipcc_ctrl, buffer(add, 1):le_uint())
- add=add+1
- subtree:add(f_timestamp, buffer(add, 4):le_uint())
- add=add+4
- subtree:add(f_seq_no, buffer(add, 2):le_uint())
- add=add+2
- subtree:add(f_qos, buffer(add, 1):le_uint())
- add=add+1
- -- logic for SA_ID-----
- magic =buffer(add,1):le_uint()
- if bit.band(magic, 0x80) == 0 then
- subtree:add(f_sa_id, buffer(add, 1):le_uint()) -- SA Id in HEX
- add=add+1
- else
- magic=buffer(add, 2):le_uint()
- local dummy=magic & 0x8000 --to check 7th byte is 1
- if dummy == 0 then
- magic = magic & 0xff7f -- if 15th bit is 0 set 7th bit 0
- else
- magic = magic & 0x7fff -- if 15 bit is 1 set 15th bit to 0
- end
- subtree:add(f_sa_id, magic) -- SAT Id in HEX
- add=add+2
- end
- -- logic for DA_ID---
- magic =buffer(add,1):le_uint()
- if bit.band(magic, 0x80) == 0 then
- subtree:add(f_da_id, buffer(add, 1):le_uint()) -- DA Id in HEX
- add=add+1
- else
- magic=buffer(add, 2):le_uint()
- local dummy=magic & 0x8000 --to check 7th byte is 1
- if dummy == 0 then
- magic = magic & 0xff7f -- if 15th bit is 0 set 7th bit 0
- else
- magic = magic & 0x7fff -- if 15 bit is 1 set 15th bit to 0
- end
- subtree:add(f_da_id, magic) -- SAT Id in HEX
- add=add+2
- end
-
- subtree:add(f_ipcc_id, buffer(add, 1):le_uint())
- info_display= {buffer(add, 1):le_uint(),buffer(3, 4):le_uint() ,buffer(6, 2):le_uint()}
- add=add+1
- magic=buffer(add, 2):le_uint()
- subtree:add(f_ipcc_len, buffer(add, 2):le_uint())
- add=add+2
- local subtree2 = subtree:add(IPCC_PROTOCOL, buffer(), "IPCC_DATA")
- subtree2:add(f_ipcc_data, buffer(add,1)) -- Rest of the data
- add=add+magic
- subtree:add(f_keys, buffer(buffer:len() - 10, 1)) -- Keys
- subtree:add(f_sec_cfg, buffer(buffer:len() - 9, 1)) -- Security Config
- subtree:add(f_mac_cfg, buffer(buffer:len() - 8, 1)) -- MAC Config
- subtree:add(f_crc_32, buffer(buffer:len() - 4, 4)) -- CRC 32
- subtree:add(f_cmac_hmac, buffer(buffer:len() - 1, 1)) -- CMAC/HMAC
- pinfo.cols.info ="IPSS_ID=" ..info_display[1] .." TS=" ..info_display[2].." SEQ_NO="..info_display[3] -- for info display in wireshark
- end
- --end
- --------------------------------------------------------------------------------------------------------------------------------------------
- -- Register the dissector function to the protocol
- function IPCC_PROTOCOL.dissector(buffer, pinfo, tree)
- -- Set protocol column name in Wireshark
- pinfo.cols.protocol = "IPCC"
- -- Call the Telemetry dissector for the current packet
- IPCC_TM_dissector(buffer, pinfo, tree)
- end
- --------------------------------------------------------------------------------------------------------------------------------------------
- -- Register the dissector for TCP port 8774
- local tcp_port = 8774
- local tcp_table = DissectorTable.get("tcp.port")
- -- Add our custom dissector to the TCP table for the specified port
- tcp_table:add(tcp_port, IPCC_PROTOCOL)
|