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   
  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
23 - def _get_v(self): return self.v_hl >> 4
24 - def _set_v(self, v): self.v_hl = (v << 4) | (self.v_hl & 0xf)
25 v = property(_get_v, _set_v) 26
27 - def _get_hl(self): return self.v_hl & 0xf
28 - def _set_hl(self, hl): self.v_hl = (self.v_hl & 0xf0) | hl
29 hl = property(_get_hl, _set_hl) 30
31 - def __len__(self):
32 return self.__hdr_len__ + len(self.opts) + len(self.data)
33
34 - def __str__(self):
35 if self.sum == 0: 36 self.sum = dpkt.in_cksum(self.pack_hdr() + self.opts) 37 if (self.p == 6 or self.p == 17) and \ 38 (self.off & (IP_MF|IP_OFFMASK)) == 0 and \ 39 isinstance(self.data, dpkt.Packet) and self.data.sum == 0: 40 # Set zeroed TCP and UDP checksums for non-fragments. 41 p = str(self.data) 42 s = dpkt.struct.pack('>4s4sxBH', self.src, self.dst, 43 self.p, len(p)) 44 s = dpkt.in_cksum_add(0, s) 45 s = dpkt.in_cksum_add(s, p) 46 self.data.sum = dpkt.in_cksum_done(s) 47 if self.p == 17 and self.data.sum == 0: 48 self.data.sum = 0xffff # RFC 768 49 # XXX - skip transports which don't need the pseudoheader 50 return self.pack_hdr() + self.opts + str(self.data)
51
52 - def unpack(self, buf):
53 dpkt.Packet.unpack(self, buf) 54 ol = ((self.v_hl & 0xf) << 2) - self.__hdr_len__ 55 if ol < 0: 56 raise dpkt.UnpackError, 'invalid header length' 57 self.opts = buf[self.__hdr_len__:self.__hdr_len__ + ol] 58 if self.len: 59 buf = buf[self.__hdr_len__ + ol:self.len] 60 else: # very likely due to TCP segmentation offload 61 buf = buf[self.__hdr_len__ + ol:] 62 try: 63 self.data = self._protosw[self.p](buf) 64 setattr(self, self.data.__class__.__name__.lower(), self.data) 65 except (KeyError, dpkt.UnpackError): 66 self.data = buf
67
68 - def set_proto(cls, p, pktclass):
69 cls._protosw[p] = pktclass
70 set_proto = classmethod(set_proto) 71
72 - def get_proto(cls, p):
73 return cls._protosw[p]
74 get_proto = classmethod(get_proto)
75 76 # Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474") 77 IP_TOS_DEFAULT = 0x00 # default 78 IP_TOS_LOWDELAY = 0x10 # low delay 79 IP_TOS_THROUGHPUT = 0x08 # high throughput 80 IP_TOS_RELIABILITY = 0x04 # high reliability 81 IP_TOS_LOWCOST = 0x02 # low monetary cost - XXX 82 IP_TOS_ECT = 0x02 # ECN-capable transport 83 IP_TOS_CE = 0x01 # congestion experienced 84 85 # IP precedence (high 3 bits of ip_tos), hopefully unused 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 # Fragmentation flags (ip_off) 96 IP_RF = 0x8000 # reserved 97 IP_DF = 0x4000 # don't fragment 98 IP_MF = 0x2000 # more fragments (not last frag) 99 IP_OFFMASK = 0x1fff # mask for fragment offset 100 101 # Time-to-live (ip_ttl), seconds 102 IP_TTL_DEFAULT = 64 # default ttl, RFC 1122, RFC 1340 103 IP_TTL_MAX = 255 # maximum ttl 104 105 # Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers 106 IP_PROTO_IP = 0 # dummy for IP 107 IP_PROTO_HOPOPTS = IP_PROTO_IP # IPv6 hop-by-hop options 108 IP_PROTO_ICMP = 1 # ICMP 109 IP_PROTO_IGMP = 2 # IGMP 110 IP_PROTO_GGP = 3 # gateway-gateway protocol 111 IP_PROTO_IPIP = 4 # IP in IP 112 IP_PROTO_ST = 5 # ST datagram mode 113 IP_PROTO_TCP = 6 # TCP 114 IP_PROTO_CBT = 7 # CBT 115 IP_PROTO_EGP = 8 # exterior gateway protocol 116 IP_PROTO_IGP = 9 # interior gateway protocol 117 IP_PROTO_BBNRCC = 10 # BBN RCC monitoring 118 IP_PROTO_NVP = 11 # Network Voice Protocol 119 IP_PROTO_PUP = 12 # PARC universal packet 120 IP_PROTO_ARGUS = 13 # ARGUS 121 IP_PROTO_EMCON = 14 # EMCON 122 IP_PROTO_XNET = 15 # Cross Net Debugger 123 IP_PROTO_CHAOS = 16 # Chaos 124 IP_PROTO_UDP = 17 # UDP 125 IP_PROTO_MUX = 18 # multiplexing 126 IP_PROTO_DCNMEAS = 19 # DCN measurement 127 IP_PROTO_HMP = 20 # Host Monitoring Protocol 128 IP_PROTO_PRM = 21 # Packet Radio Measurement 129 IP_PROTO_IDP = 22 # Xerox NS IDP 130 IP_PROTO_TRUNK1 = 23 # Trunk-1 131 IP_PROTO_TRUNK2 = 24 # Trunk-2 132 IP_PROTO_LEAF1 = 25 # Leaf-1 133 IP_PROTO_LEAF2 = 26 # Leaf-2 134 IP_PROTO_RDP = 27 # "Reliable Datagram" proto 135 IP_PROTO_IRTP = 28 # Inet Reliable Transaction 136 IP_PROTO_TP = 29 # ISO TP class 4 137 IP_PROTO_NETBLT = 30 # Bulk Data Transfer 138 IP_PROTO_MFPNSP = 31 # MFE Network Services 139 IP_PROTO_MERITINP = 32 # Merit Internodal Protocol 140 IP_PROTO_SEP = 33 # Sequential Exchange proto 141 IP_PROTO_3PC = 34 # Third Party Connect proto 142 IP_PROTO_IDPR = 35 # Interdomain Policy Route 143 IP_PROTO_XTP = 36 # Xpress Transfer Protocol 144 IP_PROTO_DDP = 37 # Datagram Delivery Proto 145 IP_PROTO_CMTP = 38 # IDPR Ctrl Message Trans 146 IP_PROTO_TPPP = 39 # TP++ Transport Protocol 147 IP_PROTO_IL = 40 # IL Transport Protocol 148 IP_PROTO_IP6 = 41 # IPv6 149 IP_PROTO_SDRP = 42 # Source Demand Routing 150 IP_PROTO_ROUTING = 43 # IPv6 routing header 151 IP_PROTO_FRAGMENT = 44 # IPv6 fragmentation header 152 IP_PROTO_RSVP = 46 # Reservation protocol 153 IP_PROTO_GRE = 47 # General Routing Encap 154 IP_PROTO_MHRP = 48 # Mobile Host Routing 155 IP_PROTO_ENA = 49 # ENA 156 IP_PROTO_ESP = 50 # Encap Security Payload 157 IP_PROTO_AH = 51 # Authentication Header 158 IP_PROTO_INLSP = 52 # Integated Net Layer Sec 159 IP_PROTO_SWIPE = 53 # SWIPE 160 IP_PROTO_NARP = 54 # NBMA Address Resolution 161 IP_PROTO_MOBILE = 55 # Mobile IP, RFC 2004 162 IP_PROTO_TLSP = 56 # Transport Layer Security 163 IP_PROTO_SKIP = 57 # SKIP 164 IP_PROTO_ICMP6 = 58 # ICMP for IPv6 165 IP_PROTO_NONE = 59 # IPv6 no next header 166 IP_PROTO_DSTOPTS = 60 # IPv6 destination options 167 IP_PROTO_ANYHOST = 61 # any host internal proto 168 IP_PROTO_CFTP = 62 # CFTP 169 IP_PROTO_ANYNET = 63 # any local network 170 IP_PROTO_EXPAK = 64 # SATNET and Backroom EXPAK 171 IP_PROTO_KRYPTOLAN = 65 # Kryptolan 172 IP_PROTO_RVD = 66 # MIT Remote Virtual Disk 173 IP_PROTO_IPPC = 67 # Inet Pluribus Packet Core 174 IP_PROTO_DISTFS = 68 # any distributed fs 175 IP_PROTO_SATMON = 69 # SATNET Monitoring 176 IP_PROTO_VISA = 70 # VISA Protocol 177 IP_PROTO_IPCV = 71 # Inet Packet Core Utility 178 IP_PROTO_CPNX = 72 # Comp Proto Net Executive 179 IP_PROTO_CPHB = 73 # Comp Protocol Heart Beat 180 IP_PROTO_WSN = 74 # Wang Span Network 181 IP_PROTO_PVP = 75 # Packet Video Protocol 182 IP_PROTO_BRSATMON = 76 # Backroom SATNET Monitor 183 IP_PROTO_SUNND = 77 # SUN ND Protocol 184 IP_PROTO_WBMON = 78 # WIDEBAND Monitoring 185 IP_PROTO_WBEXPAK = 79 # WIDEBAND EXPAK 186 IP_PROTO_EON = 80 # ISO CNLP 187 IP_PROTO_VMTP = 81 # Versatile Msg Transport 188 IP_PROTO_SVMTP = 82 # Secure VMTP 189 IP_PROTO_VINES = 83 # VINES 190 IP_PROTO_TTP = 84 # TTP 191 IP_PROTO_NSFIGP = 85 # NSFNET-IGP 192 IP_PROTO_DGP = 86 # Dissimilar Gateway Proto 193 IP_PROTO_TCF = 87 # TCF 194 IP_PROTO_EIGRP = 88 # EIGRP 195 IP_PROTO_OSPF = 89 # Open Shortest Path First 196 IP_PROTO_SPRITERPC = 90 # Sprite RPC Protocol 197 IP_PROTO_LARP = 91 # Locus Address Resolution 198 IP_PROTO_MTP = 92 # Multicast Transport Proto 199 IP_PROTO_AX25 = 93 # AX.25 Frames 200 IP_PROTO_IPIPENCAP = 94 # yet-another IP encap 201 IP_PROTO_MICP = 95 # Mobile Internet Ctrl 202 IP_PROTO_SCCSP = 96 # Semaphore Comm Sec Proto 203 IP_PROTO_ETHERIP = 97 # Ethernet in IPv4 204 IP_PROTO_ENCAP = 98 # encapsulation header 205 IP_PROTO_ANYENC = 99 # private encryption scheme 206 IP_PROTO_GMTP = 100 # GMTP 207 IP_PROTO_IFMP = 101 # Ipsilon Flow Mgmt Proto 208 IP_PROTO_PNNI = 102 # PNNI over IP 209 IP_PROTO_PIM = 103 # Protocol Indep Multicast 210 IP_PROTO_ARIS = 104 # ARIS 211 IP_PROTO_SCPS = 105 # SCPS 212 IP_PROTO_QNX = 106 # QNX 213 IP_PROTO_AN = 107 # Active Networks 214 IP_PROTO_IPCOMP = 108 # IP Payload Compression 215 IP_PROTO_SNP = 109 # Sitara Networks Protocol 216 IP_PROTO_COMPAQPEER = 110 # Compaq Peer Protocol 217 IP_PROTO_IPXIP = 111 # IPX in IP 218 IP_PROTO_VRRP = 112 # Virtual Router Redundancy 219 IP_PROTO_PGM = 113 # PGM Reliable Transport 220 IP_PROTO_ANY0HOP = 114 # 0-hop protocol 221 IP_PROTO_L2TP = 115 # Layer 2 Tunneling Proto 222 IP_PROTO_DDX = 116 # D-II Data Exchange (DDX) 223 IP_PROTO_IATP = 117 # Interactive Agent Xfer 224 IP_PROTO_STP = 118 # Schedule Transfer Proto 225 IP_PROTO_SRP = 119 # SpectraLink Radio Proto 226 IP_PROTO_UTI = 120 # UTI 227 IP_PROTO_SMP = 121 # Simple Message Protocol 228 IP_PROTO_SM = 122 # SM 229 IP_PROTO_PTP = 123 # Performance Transparency 230 IP_PROTO_ISIS = 124 # ISIS over IPv4 231 IP_PROTO_FIRE = 125 # FIRE 232 IP_PROTO_CRTP = 126 # Combat Radio Transport 233 IP_PROTO_CRUDP = 127 # Combat Radio UDP 234 IP_PROTO_SSCOPMCE = 128 # SSCOPMCE 235 IP_PROTO_IPLT = 129 # IPLT 236 IP_PROTO_SPS = 130 # Secure Packet Shield 237 IP_PROTO_PIPE = 131 # Private IP Encap in IP 238 IP_PROTO_SCTP = 132 # Stream Ctrl Transmission 239 IP_PROTO_FC = 133 # Fibre Channel 240 IP_PROTO_RSVPIGN = 134 # RSVP-E2E-IGNORE 241 IP_PROTO_RAW = 255 # Raw IP packets 242 IP_PROTO_RESERVED = IP_PROTO_RAW # Reserved 243 IP_PROTO_MAX = 255 244 245 # XXX - auto-load IP dispatch table from IP_PROTO_* definitions
246 -def __load_protos():
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
263 - class IPTestCase(unittest.TestCase):
264 - def test_IP(self):
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
280 - def test_hl(self):
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
287 - def test_opt(self):
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
293 - def test_zerolen(self):
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