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

Source Code for Module dpkt.tcp

 1  # $Id: tcp.py 271 2006-01-11 16:03:33Z dugsong $ 
 2   
 3  """Transmission Control Protocol.""" 
 4   
 5  import dpkt 
 6   
 7  # TCP control flags 
 8  TH_FIN          = 0x01          # end of data 
 9  TH_SYN          = 0x02          # synchronize sequence numbers 
10  TH_RST          = 0x04          # reset connection 
11  TH_PUSH         = 0x08          # push 
12  TH_ACK          = 0x10          # acknowledgment number set 
13  TH_URG          = 0x20          # urgent pointer set 
14  TH_ECE          = 0x40          # ECN echo, RFC 3168 
15  TH_CWR          = 0x80          # congestion window reduced 
16   
17  TCP_PORT_MAX    = 65535         # maximum port 
18  TCP_WIN_MAX     = 65535         # maximum (unscaled) window 
19   
20 -class TCP(dpkt.Packet):
21 __hdr__ = ( 22 ('sport', 'H', 0xdead), 23 ('dport', 'H', 0), 24 ('seq', 'I', 0xdeadbeefL), 25 ('ack', 'I', 0), 26 ('off_x2', 'B', ((5 << 4) | 0)), 27 ('flags', 'B', TH_SYN), 28 ('win', 'H', TCP_WIN_MAX), 29 ('sum', 'H', 0), 30 ('urp', 'H', 0) 31 ) 32 opts = '' 33
34 - def _get_off(self): return self.off_x2 >> 4
35 - def _set_off(self, off): self.off_x2 = (off << 4) | (self.off_x2 & 0xf)
36 off = property(_get_off, _set_off) 37
38 - def __len__(self):
39 return self.__hdr_len__ + len(self.opts) + len(self.data)
40
41 - def __str__(self):
42 return self.pack_hdr() + self.opts + str(self.data)
43
44 - def unpack(self, buf):
45 dpkt.Packet.unpack(self, buf) 46 ol = ((self.off_x2 >> 4) << 2) - self.__hdr_len__ 47 self.opts = buf[self.__hdr_len__:self.__hdr_len__ + ol] 48 self.data = buf[self.__hdr_len__ + ol:]
49 50 # Options (opt_type) - http://www.iana.org/assignments/tcp-parameters 51 TCP_OPT_EOL = 0 # end of option list 52 TCP_OPT_NOP = 1 # no operation 53 TCP_OPT_MSS = 2 # maximum segment size 54 TCP_OPT_WSCALE = 3 # window scale factor, RFC 1072 55 TCP_OPT_SACKOK = 4 # SACK permitted, RFC 2018 56 TCP_OPT_SACK = 5 # SACK, RFC 2018 57 TCP_OPT_ECHO = 6 # echo (obsolete), RFC 1072 58 TCP_OPT_ECHOREPLY = 7 # echo reply (obsolete), RFC 1072 59 TCP_OPT_TIMESTAMP = 8 # timestamp, RFC 1323 60 TCP_OPT_POCONN = 9 # partial order conn, RFC 1693 61 TCP_OPT_POSVC = 10 # partial order service, RFC 1693 62 TCP_OPT_CC = 11 # connection count, RFC 1644 63 TCP_OPT_CCNEW = 12 # CC.NEW, RFC 1644 64 TCP_OPT_CCECHO = 13 # CC.ECHO, RFC 1644 65 TCP_OPT_ALTSUM = 14 # alt checksum request, RFC 1146 66 TCP_OPT_ALTSUMDATA = 15 # alt checksum data, RFC 1146 67 TCP_OPT_SKEETER = 16 # Skeeter 68 TCP_OPT_BUBBA = 17 # Bubba 69 TCP_OPT_TRAILSUM = 18 # trailer checksum 70 TCP_OPT_MD5 = 19 # MD5 signature, RFC 2385 71 TCP_OPT_SCPS = 20 # SCPS capabilities 72 TCP_OPT_SNACK = 21 # selective negative acks 73 TCP_OPT_REC = 22 # record boundaries 74 TCP_OPT_CORRUPT = 23 # corruption experienced 75 TCP_OPT_SNAP = 24 # SNAP 76 TCP_OPT_TCPCOMP = 26 # TCP compression filter 77 TCP_OPT_MAX = 27 78
79 -def parse_opts(buf):
80 """Parse TCP option buffer into a list of (option, data) tuples.""" 81 opts = [] 82 while buf: 83 o = ord(buf[0]) 84 if o > TCP_OPT_NOP: 85 try: 86 l = ord(buf[1]) 87 d, buf = buf[2:l], buf[l:] 88 except ValueError: 89 #print 'bad option', repr(str(buf)) 90 opts.append(None) # XXX 91 break 92 else: 93 d, buf = '', buf[1:] 94 opts.append((o,d)) 95 return opts
96