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

Source Code for Module dpkt.ip

  1  # $Id: ip.py 87 2013-03-05 19:41:04Z andrewflnr@gmail.com $ 
  2  # -*- coding: utf-8 -*- 
  3  """Internet Protocol.""" 
  4  from __future__ import print_function 
  5  from __future__ import absolute_import 
  6   
  7  from . import dpkt 
  8  from .decorators import deprecated 
  9  from .compat import iteritems 
10 11 -class IP(dpkt.Packet):
12 """Internet Protocol. 13 14 TODO: Longer class information.... 15 16 Attributes: 17 __hdr__: Header fields of IP. 18 TODO. 19 """ 20 21 __hdr__ = ( 22 ('_v_hl', 'B', (4 << 4) | (20 >> 2)), 23 ('tos', 'B', 0), 24 ('len', 'H', 20), 25 ('id', 'H', 0), 26 ('off', 'H', 0), 27 ('ttl', 'B', 64), 28 ('p', 'B', 0), 29 ('sum', 'H', 0), 30 ('src', '4s', b'\x00' * 4), 31 ('dst', '4s', b'\x00' * 4) 32 ) 33 _protosw = {} 34 opts = b'' 35
36 - def __init__(self, *args, **kwargs):
37 super(IP, self).__init__(*args, **kwargs) 38 39 # If IP packet is not initialized by string and the len field has 40 # been rewritten. 41 if not args and 'len' not in kwargs: 42 self.len = self.__len__()
43 44 @property
45 - def v(self):
46 return self._v_hl >> 4
47 48 @v.setter
49 - def v(self, v):
50 self._v_hl = (v << 4) | (self._v_hl & 0xf)
51 52 @property
53 - def hl(self):
54 return self._v_hl & 0xf
55 56 @hl.setter
57 - def hl(self, hl):
58 self._v_hl = (self._v_hl & 0xf0) | hl
59 60 @property
61 - def rf(self):
62 return (self.off >> 15) & 0x1
63 64 @rf.setter
65 - def rf(self, rf):
66 self.off = (self.off & ~IP_RF) | (rf << 15)
67 68 @property
69 - def df(self):
70 return (self.off >> 14) & 0x1
71 72 @df.setter
73 - def df(self, df):
74 self.off = (self.off & ~IP_DF) | (df << 14)
75 76 @property
77 - def mf(self):
78 return (self.off >> 13) & 0x1
79 80 @mf.setter
81 - def mf(self, mf):
82 self.off = (self.off & ~IP_MF) | (mf << 13)
83 84 @property
85 - def offset(self):
86 return (self.off & IP_OFFMASK) << 3
87 88 @offset.setter
89 - def offset(self, offset):
90 self.off = (self.off & ~IP_OFFMASK) | (offset >> 3)
91
92 - def __len__(self):
93 return self.__hdr_len__ + len(self.opts) + len(self.data)
94
95 - def __bytes__(self):
96 self.len = self.__len__() 97 if self.sum == 0: 98 self.sum = dpkt.in_cksum(self.pack_hdr() + bytes(self.opts)) 99 if (self.p == 6 or self.p == 17) and (self.off & (IP_MF | IP_OFFMASK)) == 0 and \ 100 isinstance(self.data, dpkt.Packet) and self.data.sum == 0: 101 # Set zeroed TCP and UDP checksums for non-fragments. 102 p = bytes(self.data) 103 s = dpkt.struct.pack('>4s4sxBH', self.src, self.dst, 104 self.p, len(p)) 105 s = dpkt.in_cksum_add(0, s) 106 s = dpkt.in_cksum_add(s, p) 107 self.data.sum = dpkt.in_cksum_done(s) 108 if self.p == 17 and self.data.sum == 0: 109 self.data.sum = 0xffff # RFC 768 110 # XXX - skip transports which don't need the pseudoheader 111 return self.pack_hdr() + bytes(self.opts) + bytes(self.data)
112
113 - def unpack(self, buf):
114 dpkt.Packet.unpack(self, buf) 115 ol = ((self._v_hl & 0xf) << 2) - self.__hdr_len__ 116 if ol < 0: 117 raise dpkt.UnpackError('invalid header length') 118 self.opts = buf[self.__hdr_len__:self.__hdr_len__ + ol] 119 if self.len: 120 buf = buf[self.__hdr_len__ + ol:self.len] 121 else: # very likely due to TCP segmentation offload 122 buf = buf[self.__hdr_len__ + ol:] 123 try: 124 self.data = self._protosw[self.p](buf) if self.offset == 0 else buf 125 setattr(self, self.data.__class__.__name__.lower(), self.data) 126 except (KeyError, dpkt.UnpackError): 127 self.data = buf
128 129 @classmethod
130 - def set_proto(cls, p, pktclass):
131 cls._protosw[p] = pktclass
132 133 @classmethod
134 - def get_proto(cls, p):
135 return cls._protosw[p]
136 137 # IP Headers 138 IP_ADDR_LEN = 0x04 139 IP_ADDR_BITS = 0x20 140 141 IP_HDR_LEN = 0x14 142 IP_OPT_LEN = 0x02 143 IP_OPT_LEN_MAX = 0x28 144 IP_HDR_LEN_MAX = IP_HDR_LEN + IP_OPT_LEN_MAX 145 146 IP_LEN_MAX = 0xffff 147 IP_LEN_MIN = IP_HDR_LEN 148 149 # Reserved Addresses 150 IP_ADDR_ANY = "\x00\x00\x00\x00" # 0.0.0.0 151 IP_ADDR_BROADCAST = "\xff\xff\xff\xff" # 255.255.255.255 152 IP_ADDR_LOOPBACK = "\x7f\x00\x00\x01" # 127.0.0.1 153 IP_ADDR_MCAST_ALL = "\xe0\x00\x00\x01" # 224.0.0.1 154 IP_ADDR_MCAST_LOCAL = "\xe0\x00\x00\xff" # 224.0.0.255 155 156 # Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474") 157 IP_TOS_DEFAULT = 0x00 # default 158 IP_TOS_LOWDELAY = 0x10 # low delay 159 IP_TOS_THROUGHPUT = 0x08 # high throughput 160 IP_TOS_RELIABILITY = 0x04 # high reliability 161 IP_TOS_LOWCOST = 0x02 # low monetary cost - XXX 162 IP_TOS_ECT = 0x02 # ECN-capable transport 163 IP_TOS_CE = 0x01 # congestion experienced 164 165 # IP precedence (high 3 bits of ip_tos), hopefully unused 166 IP_TOS_PREC_ROUTINE = 0x00 167 IP_TOS_PREC_PRIORITY = 0x20 168 IP_TOS_PREC_IMMEDIATE = 0x40 169 IP_TOS_PREC_FLASH = 0x60 170 IP_TOS_PREC_FLASHOVERRIDE = 0x80 171 IP_TOS_PREC_CRITIC_ECP = 0xa0 172 IP_TOS_PREC_INTERNETCONTROL = 0xc0 173 IP_TOS_PREC_NETCONTROL = 0xe0 174 175 # Fragmentation flags (ip_off) 176 IP_RF = 0x8000 # reserved 177 IP_DF = 0x4000 # don't fragment 178 IP_MF = 0x2000 # more fragments (not last frag) 179 IP_OFFMASK = 0x1fff # mask for fragment offset 180 181 # Time-to-live (ip_ttl), seconds 182 IP_TTL_DEFAULT = 64 # default ttl, RFC 1122, RFC 1340 183 IP_TTL_MAX = 255 # maximum ttl 184 185 # Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers 186 IP_PROTO_IP = 0 # dummy for IP 187 IP_PROTO_HOPOPTS = IP_PROTO_IP # IPv6 hop-by-hop options 188 IP_PROTO_ICMP = 1 # ICMP 189 IP_PROTO_IGMP = 2 # IGMP 190 IP_PROTO_GGP = 3 # gateway-gateway protocol 191 IP_PROTO_IPIP = 4 # IP in IP 192 IP_PROTO_ST = 5 # ST datagram mode 193 IP_PROTO_TCP = 6 # TCP 194 IP_PROTO_CBT = 7 # CBT 195 IP_PROTO_EGP = 8 # exterior gateway protocol 196 IP_PROTO_IGP = 9 # interior gateway protocol 197 IP_PROTO_BBNRCC = 10 # BBN RCC monitoring 198 IP_PROTO_NVP = 11 # Network Voice Protocol 199 IP_PROTO_PUP = 12 # PARC universal packet 200 IP_PROTO_ARGUS = 13 # ARGUS 201 IP_PROTO_EMCON = 14 # EMCON 202 IP_PROTO_XNET = 15 # Cross Net Debugger 203 IP_PROTO_CHAOS = 16 # Chaos 204 IP_PROTO_UDP = 17 # UDP 205 IP_PROTO_MUX = 18 # multiplexing 206 IP_PROTO_DCNMEAS = 19 # DCN measurement 207 IP_PROTO_HMP = 20 # Host Monitoring Protocol 208 IP_PROTO_PRM = 21 # Packet Radio Measurement 209 IP_PROTO_IDP = 22 # Xerox NS IDP 210 IP_PROTO_TRUNK1 = 23 # Trunk-1 211 IP_PROTO_TRUNK2 = 24 # Trunk-2 212 IP_PROTO_LEAF1 = 25 # Leaf-1 213 IP_PROTO_LEAF2 = 26 # Leaf-2 214 IP_PROTO_RDP = 27 # "Reliable Datagram" proto 215 IP_PROTO_IRTP = 28 # Inet Reliable Transaction 216 IP_PROTO_TP = 29 # ISO TP class 4 217 IP_PROTO_NETBLT = 30 # Bulk Data Transfer 218 IP_PROTO_MFPNSP = 31 # MFE Network Services 219 IP_PROTO_MERITINP = 32 # Merit Internodal Protocol 220 IP_PROTO_SEP = 33 # Sequential Exchange proto 221 IP_PROTO_3PC = 34 # Third Party Connect proto 222 IP_PROTO_IDPR = 35 # Interdomain Policy Route 223 IP_PROTO_XTP = 36 # Xpress Transfer Protocol 224 IP_PROTO_DDP = 37 # Datagram Delivery Proto 225 IP_PROTO_CMTP = 38 # IDPR Ctrl Message Trans 226 IP_PROTO_TPPP = 39 # TP++ Transport Protocol 227 IP_PROTO_IL = 40 # IL Transport Protocol 228 IP_PROTO_IP6 = 41 # IPv6 229 IP_PROTO_SDRP = 42 # Source Demand Routing 230 IP_PROTO_ROUTING = 43 # IPv6 routing header 231 IP_PROTO_FRAGMENT = 44 # IPv6 fragmentation header 232 IP_PROTO_RSVP = 46 # Reservation protocol 233 IP_PROTO_GRE = 47 # General Routing Encap 234 IP_PROTO_MHRP = 48 # Mobile Host Routing 235 IP_PROTO_ENA = 49 # ENA 236 IP_PROTO_ESP = 50 # Encap Security Payload 237 IP_PROTO_AH = 51 # Authentication Header 238 IP_PROTO_INLSP = 52 # Integated Net Layer Sec 239 IP_PROTO_SWIPE = 53 # SWIPE 240 IP_PROTO_NARP = 54 # NBMA Address Resolution 241 IP_PROTO_MOBILE = 55 # Mobile IP, RFC 2004 242 IP_PROTO_TLSP = 56 # Transport Layer Security 243 IP_PROTO_SKIP = 57 # SKIP 244 IP_PROTO_ICMP6 = 58 # ICMP for IPv6 245 IP_PROTO_NONE = 59 # IPv6 no next header 246 IP_PROTO_DSTOPTS = 60 # IPv6 destination options 247 IP_PROTO_ANYHOST = 61 # any host internal proto 248 IP_PROTO_CFTP = 62 # CFTP 249 IP_PROTO_ANYNET = 63 # any local network 250 IP_PROTO_EXPAK = 64 # SATNET and Backroom EXPAK 251 IP_PROTO_KRYPTOLAN = 65 # Kryptolan 252 IP_PROTO_RVD = 66 # MIT Remote Virtual Disk 253 IP_PROTO_IPPC = 67 # Inet Pluribus Packet Core 254 IP_PROTO_DISTFS = 68 # any distributed fs 255 IP_PROTO_SATMON = 69 # SATNET Monitoring 256 IP_PROTO_VISA = 70 # VISA Protocol 257 IP_PROTO_IPCV = 71 # Inet Packet Core Utility 258 IP_PROTO_CPNX = 72 # Comp Proto Net Executive 259 IP_PROTO_CPHB = 73 # Comp Protocol Heart Beat 260 IP_PROTO_WSN = 74 # Wang Span Network 261 IP_PROTO_PVP = 75 # Packet Video Protocol 262 IP_PROTO_BRSATMON = 76 # Backroom SATNET Monitor 263 IP_PROTO_SUNND = 77 # SUN ND Protocol 264 IP_PROTO_WBMON = 78 # WIDEBAND Monitoring 265 IP_PROTO_WBEXPAK = 79 # WIDEBAND EXPAK 266 IP_PROTO_EON = 80 # ISO CNLP 267 IP_PROTO_VMTP = 81 # Versatile Msg Transport 268 IP_PROTO_SVMTP = 82 # Secure VMTP 269 IP_PROTO_VINES = 83 # VINES 270 IP_PROTO_TTP = 84 # TTP 271 IP_PROTO_NSFIGP = 85 # NSFNET-IGP 272 IP_PROTO_DGP = 86 # Dissimilar Gateway Proto 273 IP_PROTO_TCF = 87 # TCF 274 IP_PROTO_EIGRP = 88 # EIGRP 275 IP_PROTO_OSPF = 89 # Open Shortest Path First 276 IP_PROTO_SPRITERPC = 90 # Sprite RPC Protocol 277 IP_PROTO_LARP = 91 # Locus Address Resolution 278 IP_PROTO_MTP = 92 # Multicast Transport Proto 279 IP_PROTO_AX25 = 93 # AX.25 Frames 280 IP_PROTO_IPIPENCAP = 94 # yet-another IP encap 281 IP_PROTO_MICP = 95 # Mobile Internet Ctrl 282 IP_PROTO_SCCSP = 96 # Semaphore Comm Sec Proto 283 IP_PROTO_ETHERIP = 97 # Ethernet in IPv4 284 IP_PROTO_ENCAP = 98 # encapsulation header 285 IP_PROTO_ANYENC = 99 # private encryption scheme 286 IP_PROTO_GMTP = 100 # GMTP 287 IP_PROTO_IFMP = 101 # Ipsilon Flow Mgmt Proto 288 IP_PROTO_PNNI = 102 # PNNI over IP 289 IP_PROTO_PIM = 103 # Protocol Indep Multicast 290 IP_PROTO_ARIS = 104 # ARIS 291 IP_PROTO_SCPS = 105 # SCPS 292 IP_PROTO_QNX = 106 # QNX 293 IP_PROTO_AN = 107 # Active Networks 294 IP_PROTO_IPCOMP = 108 # IP Payload Compression 295 IP_PROTO_SNP = 109 # Sitara Networks Protocol 296 IP_PROTO_COMPAQPEER = 110 # Compaq Peer Protocol 297 IP_PROTO_IPXIP = 111 # IPX in IP 298 IP_PROTO_VRRP = 112 # Virtual Router Redundancy 299 IP_PROTO_PGM = 113 # PGM Reliable Transport 300 IP_PROTO_ANY0HOP = 114 # 0-hop protocol 301 IP_PROTO_L2TP = 115 # Layer 2 Tunneling Proto 302 IP_PROTO_DDX = 116 # D-II Data Exchange (DDX) 303 IP_PROTO_IATP = 117 # Interactive Agent Xfer 304 IP_PROTO_STP = 118 # Schedule Transfer Proto 305 IP_PROTO_SRP = 119 # SpectraLink Radio Proto 306 IP_PROTO_UTI = 120 # UTI 307 IP_PROTO_SMP = 121 # Simple Message Protocol 308 IP_PROTO_SM = 122 # SM 309 IP_PROTO_PTP = 123 # Performance Transparency 310 IP_PROTO_ISIS = 124 # ISIS over IPv4 311 IP_PROTO_FIRE = 125 # FIRE 312 IP_PROTO_CRTP = 126 # Combat Radio Transport 313 IP_PROTO_CRUDP = 127 # Combat Radio UDP 314 IP_PROTO_SSCOPMCE = 128 # SSCOPMCE 315 IP_PROTO_IPLT = 129 # IPLT 316 IP_PROTO_SPS = 130 # Secure Packet Shield 317 IP_PROTO_PIPE = 131 # Private IP Encap in IP 318 IP_PROTO_SCTP = 132 # Stream Ctrl Transmission 319 IP_PROTO_FC = 133 # Fibre Channel 320 IP_PROTO_RSVPIGN = 134 # RSVP-E2E-IGNORE 321 IP_PROTO_RAW = 255 # Raw IP packets 322 IP_PROTO_RESERVED = IP_PROTO_RAW # Reserved 323 IP_PROTO_MAX = 255
324 325 # XXX - auto-load IP dispatch table from IP_PROTO_* definitions 326 327 328 -def __load_protos():
329 g = globals() 330 for k, v in iteritems(g): 331 if k.startswith('IP_PROTO_'): 332 name = k[9:].lower() 333 try: 334 mod = __import__(name, g, level=1) 335 IP.set_proto(v, getattr(mod, name.upper())) 336 except (ImportError, AttributeError): 337 continue
338
339 340 -def _mod_init():
341 """Post-initialization called when all dpkt modules are fully loaded""" 342 if not IP._protosw: 343 __load_protos()
344
345 346 -def test_ip():
347 from . import udp 348 349 s = b'E\x00\x00"\x00\x00\x00\x00@\x11r\xc0\x01\x02\x03\x04\x01\x02\x03\x04\x00o\x00\xde\x00\x0e\xbf5foobar' 350 ip = IP(id=0, src=b'\x01\x02\x03\x04', dst=b'\x01\x02\x03\x04', p=17) 351 u = udp.UDP(sport=111, dport=222) 352 u.data = b'foobar' 353 u.ulen += len(u.data) 354 ip.data = u 355 ip.len += len(u) 356 assert (bytes(ip) == s) 357 assert (ip.v == 4) 358 assert (ip.hl == 5) 359 360 ip = IP(s) 361 assert (bytes(ip) == s) 362 assert (ip.udp.sport == 111) 363 assert (ip.udp.data == b'foobar')
364
365 366 -def test_hl(): # Todo chack this test method
367 s = b'BB\x03\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xec\xbc\xa5\x00\x00\x00\x03\x80\x00\x00\xd0\x01\xf2\xac\xa5"0\x01\x00\x14\x00\x02\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00' 368 try: 369 IP(s) 370 except dpkt.UnpackError: 371 pass 372
373 374 -def test_opt():
375 s = b'\x4f\x00\x00\x3c\xae\x08\x00\x00\x40\x06\x18\x10\xc0\xa8\x0a\x26\xc0\xa8\x0a\x01\x07\x27\x08\x01\x02\x03\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 376 ip = IP(s) 377 ip.sum = 0 378 assert (bytes(ip) == s)
379
380 381 -def test_zerolen():
382 from . import tcp 383 d = b'X' * 2048 384 s = b'E\x00\x00\x004\xce@\x00\x80\x06\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\xccN\x0c8`\xff\xc6N_\x8a\x12\x98P\x18@):\xa3\x00\x00' + d 385 ip = IP(s) 386 assert (isinstance(ip.data, tcp.TCP)) 387 assert (ip.tcp.data == d)
388
389 390 -def test_constuctor():
391 ip1 = IP(data = b"Hello world!") 392 ip2 = IP(data = b"Hello world!", len = 0) 393 ip3 = IP(bytes(ip1)) 394 ip4 = IP(bytes(ip2)) 395 assert (bytes(ip1) == bytes(ip3)) 396 assert (bytes(ip1) == b'E\x00\x00 \x00\x00\x00\x00@\x00z\xdf\x00\x00\x00\x00\x00\x00\x00\x00Hello world!') 397 assert (bytes(ip2) == bytes(ip4)) 398 assert (bytes(ip2) == b'E\x00\x00 \x00\x00\x00\x00@\x00z\xdf\x00\x00\x00\x00\x00\x00\x00\x00Hello world!')
399
400 -def test_frag():
401 from . import ethernet 402 s = b"\x00\x23\x20\xd4\x2a\x8c\x00\x23\x20\xd4\x2a\x8c\x08\x00\x45\x00\x00\x54\x00\x00\x40\x00\x40\x01\x25\x8d\x0a\x00\x00\x8f\x0a\x00\x00\x8e\x08\x00\x2e\xa0\x01\xff\x23\x73\x20\x48\x4a\x4d\x00\x00\x00\x00\x78\x85\x02\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37" 403 ip = ethernet.Ethernet(s).ip 404 assert (ip.rf == 0) 405 assert (ip.df == 1) 406 assert (ip.mf == 0) 407 assert (ip.offset == 0) 408 409 # test setters of fragmentation related attributes. 410 ip.rf = 1 411 ip.df = 0 412 ip.mf = 1 413 ip.offset = 1480 414 assert (ip.rf == 1) 415 assert (ip.df == 0) 416 assert (ip.mf == 1) 417 assert (ip.offset == 1480)
418 419 420 if __name__ == '__main__': 421 test_ip() 422 test_hl() 423 test_opt() 424 test_zerolen() 425 test_constuctor() 426 test_frag() 427 print('Tests Successful...') 428