1
2
3 """ITU-T H.225.0 Call Signaling."""
4
5 import dpkt, tpkt
6 import struct
7
8
9
10
11
12
13
14
15
16 ALERTING = 1
17 CALL_PROCEEDING = 2
18 CONNECT = 7
19 CONNECT_ACKNOWLEDGE = 15
20 PROGRESS = 3
21 SETUP = 5
22 SETUP_ACKNOWLEDGE = 13
23
24
25 RESUME = 38
26 RESUME_ACKNOWLEDGE = 46
27 RESUME_REJECT = 34
28 SUSPEND = 37
29 SUSPEND_ACKNOWLEDGE = 45
30 SUSPEND_REJECT = 33
31 USER_INFORMATION = 32
32
33
34 DISCONNECT = 69
35 RELEASE = 77
36 RELEASE_COMPLETE = 90
37 RESTART = 70
38 RESTART_ACKNOWLEDGE = 78
39
40
41 SEGMENT = 96
42 CONGESTION_CONTROL = 121
43 INFORMATION = 123
44 NOTIFY = 110
45 STATUS = 125
46 STATUS_ENQUIRY = 117
47
48
49 RESERVED = 128
50 SHIFT = 144
51 CONGESTION_LEVEL = 176
52 REPEAT_INDICATOR = 208
53
54
55 MORE_DATA = 160
56 SENDING_COMPLETE = 161
57
58
59 SEGMENTED_MESSAGE = 0
60 BEARER_CAPABILITY = 4
61 CAUSE = 8
62 CALL_IDENTITY = 16
63 CALL_STATE = 20
64 CHANNEL_IDENTIFICATION = 24
65 PROGRESS_INDICATOR = 30
66 NETWORK_SPECIFIC_FACILITIES = 32
67 NOTIFICATION_INDICATOR = 39
68 DISPLAY = 40
69 DATE_TIME = 41
70 KEYPAD_FACILITY = 44
71 SIGNAL = 52
72 INFORMATION_RATE = 64
73 END_TO_END_TRANSIT_DELAY = 66
74 TRANSIT_DELAY_SELECTION_AND_INDICATION = 67
75 PACKET_LAYER_BINARY_PARAMETERS = 68
76 PACKET_LAYER_WINDOW_SIZE = 69
77 PACKET_SIZE = 70
78 CLOSED_USER_GROUP = 71
79 REVERSE_CHARGE_INDICATION = 74
80 CALLING_PARTY_NUMBER = 108
81 CALLING_PARTY_SUBADDRESS = 109
82 CALLED_PARTY_NUMBER = 112
83 CALLED_PARTY_SUBADDRESS = 113
84 REDIRECTING_NUMBER = 116
85 TRANSIT_NETWORK_SELECTION = 120
86 RESTART_INDICATOR = 121
87 LOW_LAYER_COMPATIBILITY = 124
88 HIGH_LAYER_COMPATIBILITY = 125
89 USER_TO_USER = 126
90 ESCAPE_FOR_EXTENSION = 127
91
92 -class H225(dpkt.Packet):
93 __hdr__ = (
94 ('proto', 'B', 8),
95 ('ref_len', 'B', 2)
96 )
97
99
100 self.tpkt = tpkt.TPKT(buf)
101 if self.tpkt.v != 3:
102 raise dpkt.UnpackError('invalid TPKT version')
103 if self.tpkt.rsvd != 0:
104 raise dpkt.UnpackError('invalid TPKT reserved value')
105 n = self.tpkt.len - self.tpkt.__hdr_len__
106 if n > len(self.tpkt.data):
107 raise dpkt.UnpackError('invalid TPKT length')
108 buf = self.tpkt.data
109
110
111 dpkt.Packet.unpack(self, buf)
112 buf = buf[self.__hdr_len__:]
113 self.ref_val = buf[:self.ref_len]
114 buf = buf[self.ref_len:]
115 self.type = struct.unpack('B', buf[:1])[0]
116 buf = buf[1:]
117
118
119 l = []
120 while buf:
121 ie = self.IE(buf)
122 l.append(ie)
123 buf = buf[len(ie):]
124 self.data = l
125
130
132 return self.tpkt.pack_hdr() + \
133 self.pack_hdr() + \
134 self.ref_val + \
135 struct.pack('B', self.type) + \
136 ''.join(map(str, self.data))
137
138 - class IE(dpkt.Packet):
139 __hdr__ = (
140 ('type', 'B', 0),
141 )
142
144 dpkt.Packet.unpack(self, buf)
145 buf = buf[self.__hdr_len__:]
146
147
148 if self.type & 0x80:
149 self.len = 0
150 self.data = None
151
152 else:
153
154 if self.type == USER_TO_USER:
155 self.len = struct.unpack('>H', buf[:2])[0]
156 buf = buf[2:]
157
158 else:
159 self.len = struct.unpack('B', buf[:1])[0]
160 buf = buf[1:]
161 self.data = buf[:self.len]
162
164 if self.type & 0x80:
165 n = 0
166 else:
167 if self.type == USER_TO_USER:
168 n = 2
169 else:
170 n = 1
171 return self.__hdr_len__ + \
172 self.len \
173 + n
174
176 if self.type & 0x80:
177 length_str = None
178 else:
179 if self.type == USER_TO_USER:
180 length_str = struct.pack('>H', self.len)
181 else:
182 length_str = struct.pack('B', self.len)
183 return struct.pack('B', self.type) + \
184 length_str + \
185 self.data
186
187
188 if __name__ == '__main__':
189 import unittest
190
193 h = H225(self.s)
194 self.failUnless(self.s == str(h))
195
197 h = H225(self.s)
198 self.failUnless(h.tpkt.v == 3)
199 self.failUnless(h.tpkt.rsvd == 0)
200 self.failUnless(h.tpkt.len == 1041)
201 self.failUnless(h.proto == 8)
202 self.failUnless(h.type == SETUP)
203 self.failUnless(len(h.data) == 3)
204
205 ie = h.data[0]
206 self.failUnless(ie.type == BEARER_CAPABILITY)
207 self.failUnless(ie.len == 3)
208 ie = h.data[1]
209 self.failUnless(ie.type == DISPLAY)
210 self.failUnless(ie.len == 14)
211 ie = h.data[2]
212 self.failUnless(ie.type == USER_TO_USER)
213 self.failUnless(ie.len == 1008)
214
215 s = '\x03\x00\x04\x11\x08\x02\x54\x2b\x05\x04\x03\x88\x93\xa5\x28\x0e\x4a\x6f\x6e\x20\x4f\x62\x65\x72\x68\x65\x69\x64\x65\x00\x7e\x03\xf0\x05\x20\xb8\x06\x00\x08\x91\x4a\x00\x04\x01\x40\x0c\x00\x4a\x00\x6f\x00\x6e\x00\x20\x00\x4f\x00\x62\x00\x65\x00\x72\x00\x68\x00\x65\x00\x69\x00\x64\x00\x65\x22\xc0\x09\x00\x00\x3d\x06\x65\x6b\x69\x67\x61\x00\x00\x14\x32\x2e\x30\x2e\x32\x20\x28\x4f\x50\x41\x4c\x20\x76\x32\x2e\x32\x2e\x32\x29\x00\x00\x00\x01\x40\x15\x00\x74\x00\x63\x00\x70\x00\x24\x00\x68\x00\x33\x00\x32\x00\x33\x00\x2e\x00\x76\x00\x6f\x00\x78\x00\x67\x00\x72\x00\x61\x00\x74\x00\x69\x00\x61\x00\x2e\x00\x6f\x00\x72\x00\x67\x00\x42\x87\x23\x2c\x06\xb8\x00\x6a\x8b\x1d\x0c\xb7\x06\xdb\x11\x9e\xca\x00\x10\xa4\x89\x6d\x6a\x00\xc5\x1d\x80\x04\x07\x00\x0a\x00\x01\x7a\x75\x30\x11\x00\x5e\x88\x1d\x0c\xb7\x06\xdb\x11\x9e\xca\x00\x10\xa4\x89\x6d\x6a\x82\x2b\x0e\x30\x40\x00\x00\x06\x04\x01\x00\x4c\x10\x09\x00\x00\x3d\x0f\x53\x70\x65\x65\x78\x20\x62\x73\x34\x20\x57\x69\x64\x65\x36\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x26\x00\x00\x64\x0c\x10\x09\x00\x00\x3d\x0f\x53\x70\x65\x65\x78\x20\x62\x73\x34\x20\x57\x69\x64\x65\x36\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x2a\x40\x00\x00\x06\x04\x01\x00\x4c\x10\x09\x00\x00\x3d\x09\x69\x4c\x42\x43\x2d\x31\x33\x6b\x33\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x20\x00\x00\x65\x0c\x10\x09\x00\x00\x3d\x09\x69\x4c\x42\x43\x2d\x31\x33\x6b\x33\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x20\x40\x00\x00\x06\x04\x01\x00\x4e\x0c\x03\x00\x83\x00\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x16\x00\x00\x66\x0e\x0c\x03\x00\x83\x00\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x4b\x40\x00\x00\x06\x04\x01\x00\x4c\x10\xb5\x00\x53\x4c\x2a\x02\x00\x00\x00\x00\x00\x40\x01\x00\x00\x40\x01\x02\x00\x08\x00\x00\x00\x00\x00\x31\x00\x01\x00\x40\x1f\x00\x00\x59\x06\x00\x00\x41\x00\x00\x00\x02\x00\x40\x01\x00\x00\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x41\x00\x00\x67\x0c\x10\xb5\x00\x53\x4c\x2a\x02\x00\x00\x00\x00\x00\x40\x01\x00\x00\x40\x01\x02\x00\x08\x00\x00\x00\x00\x00\x31\x00\x01\x00\x40\x1f\x00\x00\x59\x06\x00\x00\x41\x00\x00\x00\x02\x00\x40\x01\x00\x00\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x32\x40\x00\x00\x06\x04\x01\x00\x4c\x10\x09\x00\x00\x3d\x11\x53\x70\x65\x65\x78\x20\x62\x73\x34\x20\x4e\x61\x72\x72\x6f\x77\x33\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x28\x00\x00\x68\x0c\x10\x09\x00\x00\x3d\x11\x53\x70\x65\x65\x78\x20\x62\x73\x34\x20\x4e\x61\x72\x72\x6f\x77\x33\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x1d\x40\x00\x00\x06\x04\x01\x00\x4c\x60\x1d\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x13\x00\x00\x69\x0c\x60\x1d\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x1d\x40\x00\x00\x06\x04\x01\x00\x4c\x20\x1d\x80\x11\x1c\x00\x01\x00\x98\xa0\x26\x41\x13\x8a\x00\x98\xa0\x26\x41\x13\x8b\x13\x00\x00\x6a\x0c\x20\x1d\x80\x0b\x0d\x00\x01\x00\x98\xa0\x26\x41\x13\x8b\x00\x01\x00\x01\x00\x01\x00\x01\x00\x81\x03\x02\x80\xf8\x02\x70\x01\x06\x00\x08\x81\x75\x00\x0b\x80\x13\x80\x01\xf4\x00\x01\x00\x00\x01\x00\x00\x01\x00\x00\x0c\xc0\x01\x00\x01\x80\x0b\x80\x00\x00\x20\x20\x09\x00\x00\x3d\x0f\x53\x70\x65\x65\x78\x20\x62\x73\x34\x20\x57\x69\x64\x65\x36\x80\x00\x01\x20\x20\x09\x00\x00\x3d\x09\x69\x4c\x42\x43\x2d\x31\x33\x6b\x33\x80\x00\x02\x24\x18\x03\x00\xe6\x00\x80\x00\x03\x20\x20\xb5\x00\x53\x4c\x2a\x02\x00\x00\x00\x00\x00\x40\x01\x00\x00\x40\x01\x02\x00\x08\x00\x00\x00\x00\x00\x31\x00\x01\x00\x40\x1f\x00\x00\x59\x06\x00\x00\x41\x00\x00\x00\x02\x00\x40\x01\x00\x00\x80\x00\x04\x20\x20\x09\x00\x00\x3d\x11\x53\x70\x65\x65\x78\x20\x62\x73\x34\x20\x4e\x61\x72\x72\x6f\x77\x33\x80\x00\x05\x20\xc0\xef\x80\x00\x06\x20\x40\xef\x80\x00\x07\x08\xe0\x03\x51\x00\x80\x01\x00\x80\x00\x08\x08\xd0\x03\x51\x00\x80\x01\x00\x80\x00\x09\x83\x01\x50\x80\x00\x0a\x83\x01\x10\x80\x00\x0b\x83\x01\x40\x00\x80\x01\x03\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x01\x00\x07\x00\x08\x00\x00\x09\x01\x00\x0a\x00\x0b\x07\x01\x00\x32\x80\xa6\xff\x4c\x02\x80\x01\x80'
216
217 unittest.main()
218