1- # High Level Analyzer
2- # For more information and documentation, please go to https://support.saleae.com/extensions/high-level-analyzer-extensions
3-
41from saleae .analyzers import HighLevelAnalyzer , AnalyzerFrame , StringSetting , NumberSetting , ChoicesSetting
52
6- class Packet :
7- is_continuation_header : bool
8- header_idx : int
9- start_time : float
10- end_time : float
11- length_lsb : int
12- length_msb : int
13- length : int
14- channel : int
15- sequence_number : int
16- data : bytearray
17-
18- def __init__ (self , start_time ) -> None :
19- self .is_continuation_header = False
20- self .length = 0xFFFF
21- self .header_idx = 0
22- self .sequence_number = 0xFF
23- self .channel = 0xFF
24- self .start_time = start_time
25- self .data = bytearray ()
3+ from common import Packet , SHTPParser
264
275class SHTPHla (HighLevelAnalyzer ):
286 result_types = {
@@ -31,83 +9,10 @@ class SHTPHla(HighLevelAnalyzer):
319 }
3210 }
3311
34- def fill_header (self , d ):
35- if self .packet .header_idx == 0 :
36- self .packet .length_lsb = d [0 ]
37- elif self .packet .header_idx == 1 :
38- self .packet .length_msb = d [0 ]
39- length = self .packet .length_lsb | (self .packet .length_msb << 8 )
40- length = length & 0x7FFF
41-
42- print ("len: " , length )
43- print ("lsb: " , self .packet .length_lsb )
44- print ("msb: " , self .packet .length_msb )
45-
46-
47- self .packet .length = length
48- elif self .packet .header_idx == 2 :
49- self .packet .channel = d [0 ]
50- elif self .packet .header_idx == 3 :
51- self .packet .sequence_number = d [0 ]
52-
53- self .packet .header_idx += 1
5412
5513 def __init__ (self ):
56- self .packet = None
57-
58- pass
14+ self .shtp_parser = SHTPParser ()
5915
6016 def decode (self , frame : AnalyzerFrame ):
61- type = frame .type
62-
63- if type == 'start' and self .packet is None :
64- self .packet = Packet (frame .start_time )
65- elif type == 'start' :
66- self .packet .is_continuation_header = True
67- self .packet .header_idx = 0
68- elif (type == 'stop' or type == 'data' ) and self .packet is not None :
69- if self .packet .length - 4 == len (self .packet .data ):
70- self .packet .end_time = frame .end_time
71-
72- f = AnalyzerFrame (
73- 'packet' ,
74- self .packet .start_time ,
75- self .packet .end_time ,
76- {
77- 'contents' : self .packet .data ,
78- 'channel' : self .packet .channel ,
79- 'sequence' : self .packet .sequence_number ,
80- 'length' : self .packet .length
81- },
82- )
83-
84- self .packet = None
85-
86- return f
87- elif type != 'data' :
88- print ("not enough length" )
89-
90-
91- if self .packet is not None :
92- if type == 'data' :
93- if self .packet .is_continuation_header :
94- print ('skipping header' )
95- self .packet .header_idx += 1
96-
97- if self .packet .header_idx >= 4 :
98- print ("current len:" , len (self .packet .data ))
99- self .packet .is_continuation_header = False
100- else :
101- d = frame .data ['data' ]
102-
103- if self .packet .header_idx < 4 :
104- self .fill_header (d )
105- else :
106- # print(d)
107- self .packet .data .extend (d )
108-
109- print (len (self .packet .data ), d )
110-
111-
112-
17+ return self .shtp_parser .decode (frame )
11318
0 commit comments