summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/header/interfaces.go
blob: 3a41adfc4f3f405a6f2254b62f44b82abd099f60 (plain)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2018 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package header

import (
	"gvisor.dev/gvisor/pkg/tcpip"
)

const (
	// MaxIPPacketSize is the maximum supported IP packet size, excluding
	// jumbograms. The maximum IPv4 packet size is 64k-1 (total size must fit
	// in 16 bits). For IPv6, the payload max size (excluding jumbograms) is
	// 64k-1 (also needs to fit in 16 bits). So we use 64k - 1 + 2 * m, where
	// m is the minimum IPv6 header size; we leave room for some potential
	// IP options.
	MaxIPPacketSize = 0xffff + 2*IPv6MinimumSize
)

// Transport offers generic methods to query and/or update the fields of the
// header of a transport protocol buffer.
type Transport interface {
	// SourcePort returns the value of the "source port" field.
	SourcePort() uint16

	// Destination returns the value of the "destination port" field.
	DestinationPort() uint16

	// Checksum returns the value of the "checksum" field.
	Checksum() uint16

	// SetSourcePort sets the value of the "source port" field.
	SetSourcePort(uint16)

	// SetDestinationPort sets the value of the "destination port" field.
	SetDestinationPort(uint16)

	// SetChecksum sets the value of the "checksum" field.
	SetChecksum(uint16)

	// Payload returns the data carried in the transport buffer.
	Payload() []byte
}

// ChecksummableTransport is a Transport that supports checksumming.
type ChecksummableTransport interface {
	Transport

	// SetSourcePortWithChecksumUpdate sets the source port and updates
	// the checksum.
	//
	// The receiver's checksum must be a fully calculated checksum.
	SetSourcePortWithChecksumUpdate(port uint16)

	// SetDestinationPortWithChecksumUpdate sets the destination port and updates
	// the checksum.
	//
	// The receiver's checksum must be a fully calculated checksum.
	SetDestinationPortWithChecksumUpdate(port uint16)

	// UpdateChecksumPseudoHeaderAddress updates the checksum to reflect an
	// updated address in the pseudo header.
	//
	// If fullChecksum is true, the receiver's checksum field is assumed to hold a
	// fully calculated checksum. Otherwise, it is assumed to hold a partially
	// calculated checksum which only reflects the pseudo header.
	UpdateChecksumPseudoHeaderAddress(old, new tcpip.Address, fullChecksum bool)
}

// Network offers generic methods to query and/or update the fields of the
// header of a network protocol buffer.
type Network interface {
	// SourceAddress returns the value of the "source address" field.
	SourceAddress() tcpip.Address

	// DestinationAddress returns the value of the "destination address"
	// field.
	DestinationAddress() tcpip.Address

	// Checksum returns the value of the "checksum" field.
	Checksum() uint16

	// SetSourceAddress sets the value of the "source address" field.
	SetSourceAddress(tcpip.Address)

	// SetDestinationAddress sets the value of the "destination address"
	// field.
	SetDestinationAddress(tcpip.Address)

	// SetChecksum sets the value of the "checksum" field.
	SetChecksum(uint16)

	// TransportProtocol returns the number of the transport protocol
	// stored in the payload.
	TransportProtocol() tcpip.TransportProtocolNumber

	// Payload returns a byte slice containing the payload of the network
	// packet.
	Payload() []byte

	// TOS returns the values of the "type of service" and "flow label" fields.
	TOS() (uint8, uint32)

	// SetTOS sets the values of the "type of service" and "flow label" fields.
	SetTOS(t uint8, l uint32)
}

// ChecksummableNetwork is a Network that supports checksumming.
type ChecksummableNetwork interface {
	Network

	// SetSourceAddressAndChecksum sets the source address and updates the
	// checksum to reflect the new address.
	SetSourceAddressWithChecksumUpdate(tcpip.Address)

	// SetDestinationAddressAndChecksum sets the destination address and
	// updates the checksum to reflect the new address.
	SetDestinationAddressWithChecksumUpdate(tcpip.Address)
}