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

Source Code for Module dpkt.tcp

 1  # $Id: tcp.py 42 2007-08-02 22:38:47Z jon.oberheide $ 
 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 if ol < 0: 48 raise dpkt.UnpackError, 'invalid header length' 49 self.opts = buf[self.__hdr_len__:self.__hdr_len__ + ol] 50 self.data = buf[self.__hdr_len__ + ol:]
51 52 # Options (opt_type) - http://www.iana.org/assignments/tcp-parameters 53 TCP_OPT_EOL = 0 # end of option list 54 TCP_OPT_NOP = 1 # no operation 55 TCP_OPT_MSS = 2 # maximum segment size 56 TCP_OPT_WSCALE = 3 # window scale factor, RFC 1072 57 TCP_OPT_SACKOK = 4 # SACK permitted, RFC 2018 58 TCP_OPT_SACK = 5 # SACK, RFC 2018 59 TCP_OPT_ECHO = 6 # echo (obsolete), RFC 1072 60 TCP_OPT_ECHOREPLY = 7 # echo reply (obsolete), RFC 1072 61 TCP_OPT_TIMESTAMP = 8 # timestamp, RFC 1323 62 TCP_OPT_POCONN = 9 # partial order conn, RFC 1693 63 TCP_OPT_POSVC = 10 # partial order service, RFC 1693 64 TCP_OPT_CC = 11 # connection count, RFC 1644 65 TCP_OPT_CCNEW = 12 # CC.NEW, RFC 1644 66 TCP_OPT_CCECHO = 13 # CC.ECHO, RFC 1644 67 TCP_OPT_ALTSUM = 14 # alt checksum request, RFC 1146 68 TCP_OPT_ALTSUMDATA = 15 # alt checksum data, RFC 1146 69 TCP_OPT_SKEETER = 16 # Skeeter 70 TCP_OPT_BUBBA = 17 # Bubba 71 TCP_OPT_TRAILSUM = 18 # trailer checksum 72 TCP_OPT_MD5 = 19 # MD5 signature, RFC 2385 73 TCP_OPT_SCPS = 20 # SCPS capabilities 74 TCP_OPT_SNACK = 21 # selective negative acks 75 TCP_OPT_REC = 22 # record boundaries 76 TCP_OPT_CORRUPT = 23 # corruption experienced 77 TCP_OPT_SNAP = 24 # SNAP 78 TCP_OPT_TCPCOMP = 26 # TCP compression filter 79 TCP_OPT_MAX = 27 80
81 -def parse_opts(buf):
82 """Parse TCP option buffer into a list of (option, data) tuples.""" 83 opts = [] 84 while buf: 85 o = ord(buf[0]) 86 if o > TCP_OPT_NOP: 87 try: 88 l = ord(buf[1]) 89 d, buf = buf[2:l], buf[l:] 90 except ValueError: 91 #print 'bad option', repr(str(buf)) 92 opts.append(None) # XXX 93 break 94 else: 95 d, buf = '', buf[1:] 96 opts.append((o,d)) 97 return opts
98