1
2
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
37 super(IP, self).__init__(*args, **kwargs)
38
39
40
41 if not args and 'len' not in kwargs:
42 self.len = self.__len__()
43
44 @property
46 return self._v_hl >> 4
47
48 @v.setter
51
52 @property
54 return self._v_hl & 0xf
55
56 @hl.setter
59
60 @property
62 return (self.off >> 15) & 0x1
63
64 @rf.setter
67
68 @property
70 return (self.off >> 14) & 0x1
71
72 @df.setter
75
76 @property
78 return (self.off >> 13) & 0x1
79
80 @mf.setter
83
84 @property
87
88 @offset.setter
91
94
112
128
129 @classmethod
132
133 @classmethod
136
137
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
150 IP_ADDR_ANY = "\x00\x00\x00\x00"
151 IP_ADDR_BROADCAST = "\xff\xff\xff\xff"
152 IP_ADDR_LOOPBACK = "\x7f\x00\x00\x01"
153 IP_ADDR_MCAST_ALL = "\xe0\x00\x00\x01"
154 IP_ADDR_MCAST_LOCAL = "\xe0\x00\x00\xff"
155
156
157 IP_TOS_DEFAULT = 0x00
158 IP_TOS_LOWDELAY = 0x10
159 IP_TOS_THROUGHPUT = 0x08
160 IP_TOS_RELIABILITY = 0x04
161 IP_TOS_LOWCOST = 0x02
162 IP_TOS_ECT = 0x02
163 IP_TOS_CE = 0x01
164
165
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
176 IP_RF = 0x8000
177 IP_DF = 0x4000
178 IP_MF = 0x2000
179 IP_OFFMASK = 0x1fff
180
181
182 IP_TTL_DEFAULT = 64
183 IP_TTL_MAX = 255
184
185
186 IP_PROTO_IP = 0
187 IP_PROTO_HOPOPTS = IP_PROTO_IP
188 IP_PROTO_ICMP = 1
189 IP_PROTO_IGMP = 2
190 IP_PROTO_GGP = 3
191 IP_PROTO_IPIP = 4
192 IP_PROTO_ST = 5
193 IP_PROTO_TCP = 6
194 IP_PROTO_CBT = 7
195 IP_PROTO_EGP = 8
196 IP_PROTO_IGP = 9
197 IP_PROTO_BBNRCC = 10
198 IP_PROTO_NVP = 11
199 IP_PROTO_PUP = 12
200 IP_PROTO_ARGUS = 13
201 IP_PROTO_EMCON = 14
202 IP_PROTO_XNET = 15
203 IP_PROTO_CHAOS = 16
204 IP_PROTO_UDP = 17
205 IP_PROTO_MUX = 18
206 IP_PROTO_DCNMEAS = 19
207 IP_PROTO_HMP = 20
208 IP_PROTO_PRM = 21
209 IP_PROTO_IDP = 22
210 IP_PROTO_TRUNK1 = 23
211 IP_PROTO_TRUNK2 = 24
212 IP_PROTO_LEAF1 = 25
213 IP_PROTO_LEAF2 = 26
214 IP_PROTO_RDP = 27
215 IP_PROTO_IRTP = 28
216 IP_PROTO_TP = 29
217 IP_PROTO_NETBLT = 30
218 IP_PROTO_MFPNSP = 31
219 IP_PROTO_MERITINP = 32
220 IP_PROTO_SEP = 33
221 IP_PROTO_3PC = 34
222 IP_PROTO_IDPR = 35
223 IP_PROTO_XTP = 36
224 IP_PROTO_DDP = 37
225 IP_PROTO_CMTP = 38
226 IP_PROTO_TPPP = 39
227 IP_PROTO_IL = 40
228 IP_PROTO_IP6 = 41
229 IP_PROTO_SDRP = 42
230 IP_PROTO_ROUTING = 43
231 IP_PROTO_FRAGMENT = 44
232 IP_PROTO_RSVP = 46
233 IP_PROTO_GRE = 47
234 IP_PROTO_MHRP = 48
235 IP_PROTO_ENA = 49
236 IP_PROTO_ESP = 50
237 IP_PROTO_AH = 51
238 IP_PROTO_INLSP = 52
239 IP_PROTO_SWIPE = 53
240 IP_PROTO_NARP = 54
241 IP_PROTO_MOBILE = 55
242 IP_PROTO_TLSP = 56
243 IP_PROTO_SKIP = 57
244 IP_PROTO_ICMP6 = 58
245 IP_PROTO_NONE = 59
246 IP_PROTO_DSTOPTS = 60
247 IP_PROTO_ANYHOST = 61
248 IP_PROTO_CFTP = 62
249 IP_PROTO_ANYNET = 63
250 IP_PROTO_EXPAK = 64
251 IP_PROTO_KRYPTOLAN = 65
252 IP_PROTO_RVD = 66
253 IP_PROTO_IPPC = 67
254 IP_PROTO_DISTFS = 68
255 IP_PROTO_SATMON = 69
256 IP_PROTO_VISA = 70
257 IP_PROTO_IPCV = 71
258 IP_PROTO_CPNX = 72
259 IP_PROTO_CPHB = 73
260 IP_PROTO_WSN = 74
261 IP_PROTO_PVP = 75
262 IP_PROTO_BRSATMON = 76
263 IP_PROTO_SUNND = 77
264 IP_PROTO_WBMON = 78
265 IP_PROTO_WBEXPAK = 79
266 IP_PROTO_EON = 80
267 IP_PROTO_VMTP = 81
268 IP_PROTO_SVMTP = 82
269 IP_PROTO_VINES = 83
270 IP_PROTO_TTP = 84
271 IP_PROTO_NSFIGP = 85
272 IP_PROTO_DGP = 86
273 IP_PROTO_TCF = 87
274 IP_PROTO_EIGRP = 88
275 IP_PROTO_OSPF = 89
276 IP_PROTO_SPRITERPC = 90
277 IP_PROTO_LARP = 91
278 IP_PROTO_MTP = 92
279 IP_PROTO_AX25 = 93
280 IP_PROTO_IPIPENCAP = 94
281 IP_PROTO_MICP = 95
282 IP_PROTO_SCCSP = 96
283 IP_PROTO_ETHERIP = 97
284 IP_PROTO_ENCAP = 98
285 IP_PROTO_ANYENC = 99
286 IP_PROTO_GMTP = 100
287 IP_PROTO_IFMP = 101
288 IP_PROTO_PNNI = 102
289 IP_PROTO_PIM = 103
290 IP_PROTO_ARIS = 104
291 IP_PROTO_SCPS = 105
292 IP_PROTO_QNX = 106
293 IP_PROTO_AN = 107
294 IP_PROTO_IPCOMP = 108
295 IP_PROTO_SNP = 109
296 IP_PROTO_COMPAQPEER = 110
297 IP_PROTO_IPXIP = 111
298 IP_PROTO_VRRP = 112
299 IP_PROTO_PGM = 113
300 IP_PROTO_ANY0HOP = 114
301 IP_PROTO_L2TP = 115
302 IP_PROTO_DDX = 116
303 IP_PROTO_IATP = 117
304 IP_PROTO_STP = 118
305 IP_PROTO_SRP = 119
306 IP_PROTO_UTI = 120
307 IP_PROTO_SMP = 121
308 IP_PROTO_SM = 122
309 IP_PROTO_PTP = 123
310 IP_PROTO_ISIS = 124
311 IP_PROTO_FIRE = 125
312 IP_PROTO_CRTP = 126
313 IP_PROTO_CRUDP = 127
314 IP_PROTO_SSCOPMCE = 128
315 IP_PROTO_IPLT = 129
316 IP_PROTO_SPS = 130
317 IP_PROTO_PIPE = 131
318 IP_PROTO_SCTP = 132
319 IP_PROTO_FC = 133
320 IP_PROTO_RSVPIGN = 134
321 IP_PROTO_RAW = 255
322 IP_PROTO_RESERVED = IP_PROTO_RAW
323 IP_PROTO_MAX = 255
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
341 """Post-initialization called when all dpkt modules are fully loaded"""
342 if not IP._protosw:
343 __load_protos()
344
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
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
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
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
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
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
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