1
2
3 """Transmission Control Protocol."""
4
5 import dpkt
6
7
8 TH_FIN = 0x01
9 TH_SYN = 0x02
10 TH_RST = 0x04
11 TH_PUSH = 0x08
12 TH_ACK = 0x10
13 TH_URG = 0x20
14 TH_ECE = 0x40
15 TH_CWR = 0x80
16
17 TCP_PORT_MAX = 65535
18 TCP_WIN_MAX = 65535
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
40
43
49
50
51 TCP_OPT_EOL = 0
52 TCP_OPT_NOP = 1
53 TCP_OPT_MSS = 2
54 TCP_OPT_WSCALE = 3
55 TCP_OPT_SACKOK = 4
56 TCP_OPT_SACK = 5
57 TCP_OPT_ECHO = 6
58 TCP_OPT_ECHOREPLY = 7
59 TCP_OPT_TIMESTAMP = 8
60 TCP_OPT_POCONN = 9
61 TCP_OPT_POSVC = 10
62 TCP_OPT_CC = 11
63 TCP_OPT_CCNEW = 12
64 TCP_OPT_CCECHO = 13
65 TCP_OPT_ALTSUM = 14
66 TCP_OPT_ALTSUMDATA = 15
67 TCP_OPT_SKEETER = 16
68 TCP_OPT_BUBBA = 17
69 TCP_OPT_TRAILSUM = 18
70 TCP_OPT_MD5 = 19
71 TCP_OPT_SCPS = 20
72 TCP_OPT_SNACK = 21
73 TCP_OPT_REC = 22
74 TCP_OPT_CORRUPT = 23
75 TCP_OPT_SNAP = 24
76 TCP_OPT_TCPCOMP = 26
77 TCP_OPT_MAX = 27
78
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
90 opts.append(None)
91 break
92 else:
93 d, buf = '', buf[1:]
94 opts.append((o,d))
95 return opts
96