1
2
3 """Internet Protocol."""
4
5 import dpkt
6
7 -class IP(dpkt.Packet):
8 __hdr__ = (
9 ('v_hl', 'B', (4 << 4) | (20 >> 2)),
10 ('tos', 'B', 0),
11 ('len', 'H', 20),
12 ('id', 'H', 0),
13 ('off', 'H', 0),
14 ('ttl', 'B', 64),
15 ('p', 'B', 0),
16 ('sum', 'H', 0),
17 ('src', '4s', '\x00' * 4),
18 ('dst', '4s', '\x00' * 4)
19 )
20 _protosw = {}
21 opts = ''
22
25 v = property(_get_v, _set_v)
26
29 hl = property(_get_hl, _set_hl)
30
33
51
67
70 set_proto = classmethod(set_proto)
71
74 get_proto = classmethod(get_proto)
75
76
77 IP_TOS_DEFAULT = 0x00
78 IP_TOS_LOWDELAY = 0x10
79 IP_TOS_THROUGHPUT = 0x08
80 IP_TOS_RELIABILITY = 0x04
81 IP_TOS_LOWCOST = 0x02
82 IP_TOS_ECT = 0x02
83 IP_TOS_CE = 0x01
84
85
86 IP_TOS_PREC_ROUTINE = 0x00
87 IP_TOS_PREC_PRIORITY = 0x20
88 IP_TOS_PREC_IMMEDIATE = 0x40
89 IP_TOS_PREC_FLASH = 0x60
90 IP_TOS_PREC_FLASHOVERRIDE = 0x80
91 IP_TOS_PREC_CRITIC_ECP = 0xa0
92 IP_TOS_PREC_INTERNETCONTROL = 0xc0
93 IP_TOS_PREC_NETCONTROL = 0xe0
94
95
96 IP_RF = 0x8000
97 IP_DF = 0x4000
98 IP_MF = 0x2000
99 IP_OFFMASK = 0x1fff
100
101
102 IP_TTL_DEFAULT = 64
103 IP_TTL_MAX = 255
104
105
106 IP_PROTO_IP = 0
107 IP_PROTO_HOPOPTS = IP_PROTO_IP
108 IP_PROTO_ICMP = 1
109 IP_PROTO_IGMP = 2
110 IP_PROTO_GGP = 3
111 IP_PROTO_IPIP = 4
112 IP_PROTO_ST = 5
113 IP_PROTO_TCP = 6
114 IP_PROTO_CBT = 7
115 IP_PROTO_EGP = 8
116 IP_PROTO_IGP = 9
117 IP_PROTO_BBNRCC = 10
118 IP_PROTO_NVP = 11
119 IP_PROTO_PUP = 12
120 IP_PROTO_ARGUS = 13
121 IP_PROTO_EMCON = 14
122 IP_PROTO_XNET = 15
123 IP_PROTO_CHAOS = 16
124 IP_PROTO_UDP = 17
125 IP_PROTO_MUX = 18
126 IP_PROTO_DCNMEAS = 19
127 IP_PROTO_HMP = 20
128 IP_PROTO_PRM = 21
129 IP_PROTO_IDP = 22
130 IP_PROTO_TRUNK1 = 23
131 IP_PROTO_TRUNK2 = 24
132 IP_PROTO_LEAF1 = 25
133 IP_PROTO_LEAF2 = 26
134 IP_PROTO_RDP = 27
135 IP_PROTO_IRTP = 28
136 IP_PROTO_TP = 29
137 IP_PROTO_NETBLT = 30
138 IP_PROTO_MFPNSP = 31
139 IP_PROTO_MERITINP = 32
140 IP_PROTO_SEP = 33
141 IP_PROTO_3PC = 34
142 IP_PROTO_IDPR = 35
143 IP_PROTO_XTP = 36
144 IP_PROTO_DDP = 37
145 IP_PROTO_CMTP = 38
146 IP_PROTO_TPPP = 39
147 IP_PROTO_IL = 40
148 IP_PROTO_IP6 = 41
149 IP_PROTO_SDRP = 42
150 IP_PROTO_ROUTING = 43
151 IP_PROTO_FRAGMENT = 44
152 IP_PROTO_RSVP = 46
153 IP_PROTO_GRE = 47
154 IP_PROTO_MHRP = 48
155 IP_PROTO_ENA = 49
156 IP_PROTO_ESP = 50
157 IP_PROTO_AH = 51
158 IP_PROTO_INLSP = 52
159 IP_PROTO_SWIPE = 53
160 IP_PROTO_NARP = 54
161 IP_PROTO_MOBILE = 55
162 IP_PROTO_TLSP = 56
163 IP_PROTO_SKIP = 57
164 IP_PROTO_ICMP6 = 58
165 IP_PROTO_NONE = 59
166 IP_PROTO_DSTOPTS = 60
167 IP_PROTO_ANYHOST = 61
168 IP_PROTO_CFTP = 62
169 IP_PROTO_ANYNET = 63
170 IP_PROTO_EXPAK = 64
171 IP_PROTO_KRYPTOLAN = 65
172 IP_PROTO_RVD = 66
173 IP_PROTO_IPPC = 67
174 IP_PROTO_DISTFS = 68
175 IP_PROTO_SATMON = 69
176 IP_PROTO_VISA = 70
177 IP_PROTO_IPCV = 71
178 IP_PROTO_CPNX = 72
179 IP_PROTO_CPHB = 73
180 IP_PROTO_WSN = 74
181 IP_PROTO_PVP = 75
182 IP_PROTO_BRSATMON = 76
183 IP_PROTO_SUNND = 77
184 IP_PROTO_WBMON = 78
185 IP_PROTO_WBEXPAK = 79
186 IP_PROTO_EON = 80
187 IP_PROTO_VMTP = 81
188 IP_PROTO_SVMTP = 82
189 IP_PROTO_VINES = 83
190 IP_PROTO_TTP = 84
191 IP_PROTO_NSFIGP = 85
192 IP_PROTO_DGP = 86
193 IP_PROTO_TCF = 87
194 IP_PROTO_EIGRP = 88
195 IP_PROTO_OSPF = 89
196 IP_PROTO_SPRITERPC = 90
197 IP_PROTO_LARP = 91
198 IP_PROTO_MTP = 92
199 IP_PROTO_AX25 = 93
200 IP_PROTO_IPIPENCAP = 94
201 IP_PROTO_MICP = 95
202 IP_PROTO_SCCSP = 96
203 IP_PROTO_ETHERIP = 97
204 IP_PROTO_ENCAP = 98
205 IP_PROTO_ANYENC = 99
206 IP_PROTO_GMTP = 100
207 IP_PROTO_IFMP = 101
208 IP_PROTO_PNNI = 102
209 IP_PROTO_PIM = 103
210 IP_PROTO_ARIS = 104
211 IP_PROTO_SCPS = 105
212 IP_PROTO_QNX = 106
213 IP_PROTO_AN = 107
214 IP_PROTO_IPCOMP = 108
215 IP_PROTO_SNP = 109
216 IP_PROTO_COMPAQPEER = 110
217 IP_PROTO_IPXIP = 111
218 IP_PROTO_VRRP = 112
219 IP_PROTO_PGM = 113
220 IP_PROTO_ANY0HOP = 114
221 IP_PROTO_L2TP = 115
222 IP_PROTO_DDX = 116
223 IP_PROTO_IATP = 117
224 IP_PROTO_STP = 118
225 IP_PROTO_SRP = 119
226 IP_PROTO_UTI = 120
227 IP_PROTO_SMP = 121
228 IP_PROTO_SM = 122
229 IP_PROTO_PTP = 123
230 IP_PROTO_ISIS = 124
231 IP_PROTO_FIRE = 125
232 IP_PROTO_CRTP = 126
233 IP_PROTO_CRUDP = 127
234 IP_PROTO_SSCOPMCE = 128
235 IP_PROTO_IPLT = 129
236 IP_PROTO_SPS = 130
237 IP_PROTO_PIPE = 131
238 IP_PROTO_SCTP = 132
239 IP_PROTO_FC = 133
240 IP_PROTO_RSVPIGN = 134
241 IP_PROTO_RAW = 255
242 IP_PROTO_RESERVED = IP_PROTO_RAW
243 IP_PROTO_MAX = 255
244
245
247 g = globals()
248 for k, v in g.iteritems():
249 if k.startswith('IP_PROTO_'):
250 name = k[9:].lower()
251 try:
252 mod = __import__(name, g)
253 except ImportError:
254 continue
255 IP.set_proto(v, getattr(mod, name.upper()))
256
257 if not IP._protosw:
258 __load_protos()
259
260 if __name__ == '__main__':
261 import unittest
262
265 import udp
266 s = 'E\x00\x00"\x00\x00\x00\x00@\x11r\xc0\x01\x02\x03\x04\x01\x02\x03\x04\x00o\x00\xde\x00\x0e\xbf5foobar'
267 ip = IP(id=0, src='\x01\x02\x03\x04', dst='\x01\x02\x03\x04', p=17)
268 u = udp.UDP(sport=111, dport=222)
269 u.data = 'foobar'
270 u.ulen += len(u.data)
271 ip.data = u
272 ip.len += len(u)
273 self.failUnless(str(ip) == s)
274
275 ip = IP(s)
276 self.failUnless(str(ip) == s)
277 self.failUnless(ip.udp.sport == 111)
278 self.failUnless(ip.udp.data == 'foobar')
279
281 s = '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'
282 try:
283 ip = IP(s)
284 except dpkt.UnpackError:
285 pass
286
288 s = '\x4f\x00\x00\x50\xae\x08\x00\x00\x40\x06\x17\xfc\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'
289 ip = IP(s)
290 ip.sum = 0
291 self.failUnless(str(ip) == s)
292
294 import tcp
295 d = 'X' * 2048
296 s = '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
297 ip = IP(s)
298 self.failUnless(isinstance(ip.data, tcp.TCP))
299 self.failUnless(ip.tcp.data == d)
300
301 unittest.main()
302