Package dpkt :: Module h225
[hide private]
[frames] | no frames]

Source Code for Module dpkt.h225

  1  # $Id: h225.py 23 2006-11-08 15:45:33Z dugsong $ 
  2  # -*- coding: utf-8 -*- 
  3  """ITU-T H.225.0 Call Signaling.""" 
  4  from __future__ import print_function 
  5  from __future__ import absolute_import 
  6   
  7  import struct 
  8   
  9  from . import dpkt 
 10  from . import tpkt 
 11   
 12   
 13  # H225 Call Signaling 
 14  # 
 15  # Call messages and information elements (IEs) are defined by Q.931: 
 16  # http://cvsup.de.openbsd.org/historic/comp/doc/standards/itu/Q/Q.931.ps.gz 
 17  # 
 18  # The User-to-User IEs of H225 are encoded by PER of ASN.1. 
 19   
 20  # Call Establishment Messages 
 21  ALERTING = 1 
 22  CALL_PROCEEDING = 2 
 23  CONNECT = 7 
 24  CONNECT_ACKNOWLEDGE = 15 
 25  PROGRESS = 3 
 26  SETUP = 5 
 27  SETUP_ACKNOWLEDGE = 13 
 28   
 29  # Call Information Phase Messages 
 30  RESUME = 38 
 31  RESUME_ACKNOWLEDGE = 46 
 32  RESUME_REJECT = 34 
 33  SUSPEND = 37 
 34  SUSPEND_ACKNOWLEDGE = 45 
 35  SUSPEND_REJECT = 33 
 36  USER_INFORMATION = 32 
 37   
 38  # Call Clearing Messages 
 39  DISCONNECT = 69 
 40  RELEASE = 77 
 41  RELEASE_COMPLETE = 90 
 42  RESTART = 70 
 43  RESTART_ACKNOWLEDGE = 78 
 44   
 45  # Miscellaneous Messages 
 46  SEGMENT = 96 
 47  CONGESTION_CONTROL = 121 
 48  INFORMATION = 123 
 49  NOTIFY = 110 
 50  STATUS = 125 
 51  STATUS_ENQUIRY = 117 
 52   
 53  # Type 1 Single Octet Information Element IDs 
 54  RESERVED = 128 
 55  SHIFT = 144 
 56  CONGESTION_LEVEL = 176 
 57  REPEAT_INDICATOR = 208 
 58   
 59  # Type 2 Single Octet Information Element IDs 
 60  MORE_DATA = 160 
 61  SENDING_COMPLETE = 161 
 62   
 63  # Variable Length Information Element IDs 
 64  SEGMENTED_MESSAGE = 0 
 65  BEARER_CAPABILITY = 4 
 66  CAUSE = 8 
 67  CALL_IDENTITY = 16 
 68  CALL_STATE = 20 
 69  CHANNEL_IDENTIFICATION = 24 
 70  PROGRESS_INDICATOR = 30 
 71  NETWORK_SPECIFIC_FACILITIES = 32 
 72  NOTIFICATION_INDICATOR = 39 
 73  DISPLAY = 40 
 74  DATE_TIME = 41 
 75  KEYPAD_FACILITY = 44 
 76  SIGNAL = 52 
 77  INFORMATION_RATE = 64 
 78  END_TO_END_TRANSIT_DELAY = 66 
 79  TRANSIT_DELAY_SELECTION_AND_INDICATION = 67 
 80  PACKET_LAYER_BINARY_PARAMETERS = 68 
 81  PACKET_LAYER_WINDOW_SIZE = 69 
 82  PACKET_SIZE = 70 
 83  CLOSED_USER_GROUP = 71 
 84  REVERSE_CHARGE_INDICATION = 74 
 85  CALLING_PARTY_NUMBER = 108 
 86  CALLING_PARTY_SUBADDRESS = 109 
 87  CALLED_PARTY_NUMBER = 112 
 88  CALLED_PARTY_SUBADDRESS = 113 
 89  REDIRECTING_NUMBER = 116 
 90  TRANSIT_NETWORK_SELECTION = 120 
 91  RESTART_INDICATOR = 121 
 92  LOW_LAYER_COMPATIBILITY = 124 
 93  HIGH_LAYER_COMPATIBILITY = 125 
 94  USER_TO_USER = 126 
 95  ESCAPE_FOR_EXTENSION = 127 
 96   
 97   
98 -class H225(dpkt.Packet):
99 """ITU-T H.225.0 Call Signaling. 100 101 TODO: Longer class information.... 102 103 Attributes: 104 __hdr__: Header fields of H225. 105 TODO. 106 """ 107 108 __hdr__ = ( 109 ('proto', 'B', 8), 110 ('ref_len', 'B', 2) 111 ) 112
113 - def unpack(self, buf):
114 # TPKT header 115 self.tpkt = tpkt.TPKT(buf) 116 if self.tpkt.v != 3: 117 raise dpkt.UnpackError('invalid TPKT version') 118 if self.tpkt.rsvd != 0: 119 raise dpkt.UnpackError('invalid TPKT reserved value') 120 n = self.tpkt.len - self.tpkt.__hdr_len__ 121 if n > len(self.tpkt.data): 122 raise dpkt.UnpackError('invalid TPKT length') 123 buf = self.tpkt.data 124 125 # Q.931 payload 126 dpkt.Packet.unpack(self, buf) 127 buf = buf[self.__hdr_len__:] 128 self.ref_val = buf[:self.ref_len] 129 buf = buf[self.ref_len:] 130 self.type = struct.unpack('B', buf[:1])[0] 131 buf = buf[1:] 132 133 # Information Elements 134 l = [] 135 while buf: 136 ie = self.IE(buf) 137 l.append(ie) 138 buf = buf[len(ie):] 139 self.data = l
140
141 - def __len__(self):
142 return self.tpkt.__hdr_len__ + self.__hdr_len__ + sum(map(len, self.data))
143
144 - def __bytes__(self):
145 return self.tpkt.pack_hdr() + self.pack_hdr() + self.ref_val + \ 146 struct.pack('B', self.type) + b''.join(map(bytes, self.data))
147
148 - class IE(dpkt.Packet):
149 __hdr__ = ( 150 ('type', 'B', 0), 151 ) 152
153 - def unpack(self, buf):
154 dpkt.Packet.unpack(self, buf) 155 buf = buf[self.__hdr_len__:] 156 157 # single-byte IE 158 if self.type & 0x80: 159 self.len = 0 160 self.data = None 161 # multi-byte IE 162 else: 163 # special PER-encoded UUIE 164 if self.type == USER_TO_USER: 165 self.len = struct.unpack('>H', buf[:2])[0] 166 buf = buf[2:] 167 # normal TLV-like IE 168 else: 169 self.len = struct.unpack('B', buf[:1])[0] 170 buf = buf[1:] 171 self.data = buf[:self.len]
172
173 - def __len__(self):
174 if self.type & 0x80: 175 n = 0 176 else: 177 if self.type == USER_TO_USER: 178 n = 2 179 else: 180 n = 1 181 return self.__hdr_len__ + self.len + n
182
183 - def __bytes__(self):
184 if self.type & 0x80: 185 length_str = None 186 else: 187 if self.type == USER_TO_USER: 188 length_str = struct.pack('>H', self.len) 189 else: 190 length_str = struct.pack('B', self.len) 191 return struct.pack('B', self.type) + length_str + self.data
192 193 194 __s = b'\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' 195 196
197 -def test_pack():
198 h = H225(__s) 199 assert (__s == bytes(h))
200 201
202 -def test_unpack():
203 h = H225(__s) 204 assert (h.tpkt.v == 3) 205 assert (h.tpkt.rsvd == 0) 206 assert (h.tpkt.len == 1041) 207 assert (h.proto == 8) 208 assert (h.type == SETUP) 209 assert (len(h.data) == 3) 210 211 ie = h.data[0] 212 assert (ie.type == BEARER_CAPABILITY) 213 assert (ie.len == 3) 214 ie = h.data[1] 215 assert (ie.type == DISPLAY) 216 assert (ie.len == 14) 217 ie = h.data[2] 218 assert (ie.type == USER_TO_USER) 219 assert (ie.len == 1008)
220 221 222 if __name__ == '__main__': 223 test_pack() 224 test_unpack() 225 print('Tests Successful...') 226