Skip to content

Commit

Permalink
sdmcontrolparser: parse ILM entity table
Browse files Browse the repository at this point in the history
  • Loading branch information
shp committed Apr 17, 2023

Verified

This commit was signed with the committer’s verified signature.
1 parent 8073c1f commit b2891e6
Showing 2 changed files with 45 additions and 0 deletions.
4 changes: 4 additions & 0 deletions parsers/samsung/sdmcmd.py
Original file line number Diff line number Diff line change
@@ -70,9 +70,13 @@ class sdm_control_message(IntEnum):
TRACE_ITEM_SELELECT_2_REQUEST = 0x58

ILM_START_REQUEST = 0x70
ILM_START_RESPONSE = 0x71
ILM_STOP_REQUEST = 0x72
ILM_STOP_RESPONSE = 0x73
ILM_ENTITY_TAGLE_GET_REQUEST = 0x74
ILM_ENTITY_TAGLE_GET_RESPONSE = 0x75
ILM_ITEM_SELECT_REQUEST = 0x76
ILM_ITEM_SELECT_RESPONSE = 0x77

TCPIP_DUMP_REQUEST = 0x90
TCPIP_DUMP_RESPONSE = 0x91
41 changes: 41 additions & 0 deletions parsers/samsung/sdmcontrolparser.py
Original file line number Diff line number Diff line change
@@ -16,6 +16,9 @@ def __init__(self, parent, model=None):
self.model = self.parent.model

self.trace_group = {}
self.ilm_group = {}
self.ilm_total_count = 0
self.ilm_cur_count = 0

self.process = {
(sdm_command_group.CMD_CONTROL_MESSAGE << 8) | sdm_control_message.CONTROL_START_RESPONSE: lambda x: self.sdm_control_start_response(x),
@@ -26,6 +29,7 @@ def __init__(self, parent, model=None):
(sdm_command_group.CMD_CONTROL_MESSAGE << 8) | sdm_control_message.HSPA_ITEM_SELECT_RESPONSE: lambda x: self.sdm_control_item_select_response(x, 0x40),
(sdm_command_group.CMD_CONTROL_MESSAGE << 8) | sdm_control_message.CDMA_ITEM_SELECT_RESPONSE: lambda x: self.sdm_control_item_select_response(x, 0x44),
(sdm_command_group.CMD_CONTROL_MESSAGE << 8) | sdm_control_message.TRACE_TABLE_GET_RESPONSE: lambda x: self.sdm_dm_trace_table_get_response(x),
(sdm_command_group.CMD_CONTROL_MESSAGE << 8) | sdm_control_message.ILM_ENTITY_TAGLE_GET_RESPONSE: lambda x: self.sdm_dm_ilm_table_get_response(x),
(sdm_command_group.CMD_CONTROL_MESSAGE << 8) | sdm_control_message.TCPIP_DUMP_RESPONSE: lambda x: self.sdm_control_tcpip_dump_response(x),
}

@@ -121,6 +125,43 @@ def sdm_dm_trace_table_get_response(self, pkt):

return {'stdout': stdout}

def sdm_dm_ilm_table_get_response(self, pkt):
pkt = pkt[15:-1]

item_struct = namedtuple('SdmIlmTableGetResponse', 'is_end unk total_item_count packet_item_count')
subitem_struct = namedtuple('SdmIlmTableIlmItem', 'id unk1 unk2 unk3 text_len')
item = item_struct._make(struct.unpack('<BBBB', pkt[0:4]))
content = pkt[4:]
stdout = ''
if self.ilm_total_count != 0:
if self.ilm_total_count != item.total_item_count:
if self.parent:
self.parent.logger.log(logging.WARNING, "ILM item total count changed: {} -> {}".format(self.ilm_total_count, item.total_item_count))
else:
self.ilm_total_count = item.total_item_count

for i in range(item.packet_item_count):
subitem = content[33*i:33*(i+1)]
item_hdr = subitem_struct._make(struct.unpack('<BLBBB', subitem[0:8]))
if item_hdr.text_len > 25:
item_str = subitem[8:].decode('utf-8')
else:
item_str = subitem[8:8+item_hdr.text_len].decode('utf-8')
self.ilm_group[item_hdr.id] = (item_hdr.unk1, item_hdr.unk2, item_hdr.unk3, item_str)
self.ilm_cur_count += 1

if item.is_end == 1:
if self.ilm_total_count != self.ilm_cur_count:
if self.parent:
self.parent.logger.log(logging.WARNING, "ILM item count mismatch: {} != {}".format(self.ilm_total_count, self.ilm_cur_count))
stdout += 'SDM ILM Table:\n'
for x in self.ilm_group:
stdout += 'Item ID {:#06x}, Args: {:#10x}, {:#04x}, {:#04x}, Text: {}\n'.format(x,
self.ilm_group[x][0], self.ilm_group[x][1], self.ilm_group[x][2],
self.ilm_group[x][3])

return {'stdout': stdout}

def sdm_control_tcpip_dump_response(self, pkt):
pkt = pkt[15:-1]
item_struct = namedtuple('SdmControlTcpipDumpResponse', 'dl_size ul_size')

0 comments on commit b2891e6

Please sign in to comment.