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   
  3  """ITU-T H.225.0 Call Signaling.""" 
  4   
  5  import dpkt, tpkt 
  6  import struct 
  7   
  8  # H225 Call Signaling 
  9  #  
 10  # Call messages and information elements (IEs) are defined by Q.931: 
 11  # http://cvsup.de.openbsd.org/historic/comp/doc/standards/itu/Q/Q.931.ps.gz 
 12  # 
 13  # The User-to-User IEs of H225 are encoded by PER of ASN.1. 
 14   
 15  # Call Establishment Messages 
 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  # Call Information Phase Messages 
 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  # Call Clearing Messages 
 34  DISCONNECT                              = 69 
 35  RELEASE                                 = 77 
 36  RELEASE_COMPLETE                        = 90 
 37  RESTART                                 = 70 
 38  RESTART_ACKNOWLEDGE                     = 78 
 39   
 40  # Miscellaneous Messages 
 41  SEGMENT                                 = 96 
 42  CONGESTION_CONTROL                      = 121 
 43  INFORMATION                             = 123 
 44  NOTIFY                                  = 110 
 45  STATUS                                  = 125 
 46  STATUS_ENQUIRY                          = 117 
 47   
 48  # Type 1 Single Octet Information Element IDs 
 49  RESERVED                                = 128 
 50  SHIFT                                   = 144 
 51  CONGESTION_LEVEL                        = 176 
 52  REPEAT_INDICATOR                        = 208 
 53   
 54  # Type 2 Single Octet Information Element IDs 
 55  MORE_DATA                               = 160 
 56  SENDING_COMPLETE                        = 161 
 57   
 58  # Variable Length Information Element IDs  
 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
98 - def unpack(self, buf):
99 # TPKT header 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 # Q.931 payload 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 # Information Elements 119 l = [] 120 while buf: 121 ie = self.IE(buf) 122 l.append(ie) 123 buf = buf[len(ie):] 124 self.data = l
125
126 - def __len__(self):
127 return self.tpkt.__hdr_len__ + \ 128 self.__hdr_len__ + \ 129 sum(map(len, self.data))
130
131 - def __str__(self):
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
143 - def unpack(self, buf):
144 dpkt.Packet.unpack(self, buf) 145 buf = buf[self.__hdr_len__:] 146 147 # single-byte IE 148 if self.type & 0x80: 149 self.len = 0 150 self.data = None 151 # multi-byte IE 152 else: 153 # special PER-encoded UUIE 154 if self.type == USER_TO_USER: 155 self.len = struct.unpack('>H', buf[:2])[0] 156 buf = buf[2:] 157 # normal TLV-like IE 158 else: 159 self.len = struct.unpack('B', buf[:1])[0] 160 buf = buf[1:] 161 self.data = buf[:self.len]
162
163 - def __len__(self):
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
175 - def __str__(self):
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
191 - class H225TestCase(unittest.TestCase):
192 - def testPack(self):
193 h = H225(self.s) 194 self.failUnless(self.s == str(h))
195
196 - def testUnpack(self):
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