forked from antrea-io/libOpenflow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp.go
79 lines (61 loc) · 1.6 KB
/
tcp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package protocol
import (
"encoding/binary"
"errors"
)
type TCP struct {
PortSrc uint16
PortDst uint16
SeqNum uint32
AckNum uint32
HdrLen uint8
Code uint8
WinSize uint16
Checksum uint16
UrgFlag uint16
Data []byte
}
func NewTCP() *TCP {
u := new(TCP)
u.Data = make([]byte, 0)
return u
}
func (t *TCP) Len() (n uint16) {
if t.Data != nil {
return uint16(20 + len(t.Data))
}
return uint16(20)
}
func (t *TCP) MarshalBinary() (data []byte, err error) {
data = make([]byte, int(t.Len()))
binary.BigEndian.PutUint16(data[:2], t.PortSrc)
binary.BigEndian.PutUint16(data[2:4], t.PortDst)
binary.BigEndian.PutUint32(data[4:8], t.SeqNum)
binary.BigEndian.PutUint32(data[8:12], t.AckNum)
data[12] = (t.HdrLen << 4) & 0xf0
data[13] = t.Code & 0x3f
binary.BigEndian.PutUint16(data[14:16], t.WinSize)
binary.BigEndian.PutUint16(data[16:18], t.Checksum)
binary.BigEndian.PutUint16(data[18:20], t.UrgFlag)
copy(data[20:], t.Data)
return
}
func (t *TCP) UnmarshalBinary(data []byte) error {
if len(data) < 20 {
return errors.New("The []byte is too short to unmarshal a full ARP message.")
}
t.PortSrc = binary.BigEndian.Uint16(data[:2])
t.PortDst = binary.BigEndian.Uint16(data[2:4])
t.SeqNum = binary.BigEndian.Uint32(data[4:8])
t.AckNum = binary.BigEndian.Uint32(data[8:12])
t.HdrLen = (data[12] >> 4) & 0xf
t.Code = data[13] & 0x3f
t.WinSize = binary.BigEndian.Uint16(data[14:16])
t.Checksum = binary.BigEndian.Uint16(data[16:18])
t.UrgFlag = binary.BigEndian.Uint16(data[18:20])
if len(data) > 20 {
t.Data = make([]byte, (len(data) - 20))
copy(t.Data, data[20:])
}
return nil
}