1 // Copyright 2018 The gVisor Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 15 package header
16 17 import (
18 "gvisor.dev/gvisor/pkg/tcpip"
19 )
20 21 const (
22 // MaxIPPacketSize is the maximum supported IP packet size, excluding
23 // jumbograms. The maximum IPv4 packet size is 64k-1 (total size must fit
24 // in 16 bits). For IPv6, the payload max size (excluding jumbograms) is
25 // 64k-1 (also needs to fit in 16 bits). So we use 64k - 1 + 2 * m, where
26 // m is the minimum IPv6 header size; we leave room for some potential
27 // IP options.
28 MaxIPPacketSize = 0xffff + 2*IPv6MinimumSize
29 )
30 31 // Transport offers generic methods to query and/or update the fields of the
32 // header of a transport protocol buffer.
33 type Transport interface {
34 // SourcePort returns the value of the "source port" field.
35 SourcePort() uint16
36 37 // Destination returns the value of the "destination port" field.
38 DestinationPort() uint16
39 40 // Checksum returns the value of the "checksum" field.
41 Checksum() uint16
42 43 // SetSourcePort sets the value of the "source port" field.
44 SetSourcePort(uint16)
45 46 // SetDestinationPort sets the value of the "destination port" field.
47 SetDestinationPort(uint16)
48 49 // SetChecksum sets the value of the "checksum" field.
50 SetChecksum(uint16)
51 52 // Payload returns the data carried in the transport buffer.
53 Payload() []byte
54 }
55 56 // ChecksummableTransport is a Transport that supports checksumming.
57 type ChecksummableTransport interface {
58 Transport
59 60 // SetSourcePortWithChecksumUpdate sets the source port and updates
61 // the checksum.
62 //
63 // The receiver's checksum must be a fully calculated checksum.
64 SetSourcePortWithChecksumUpdate(port uint16)
65 66 // SetDestinationPortWithChecksumUpdate sets the destination port and updates
67 // the checksum.
68 //
69 // The receiver's checksum must be a fully calculated checksum.
70 SetDestinationPortWithChecksumUpdate(port uint16)
71 72 // UpdateChecksumPseudoHeaderAddress updates the checksum to reflect an
73 // updated address in the pseudo header.
74 //
75 // If fullChecksum is true, the receiver's checksum field is assumed to hold a
76 // fully calculated checksum. Otherwise, it is assumed to hold a partially
77 // calculated checksum which only reflects the pseudo header.
78 UpdateChecksumPseudoHeaderAddress(old, new tcpip.Address, fullChecksum bool)
79 }
80 81 // Network offers generic methods to query and/or update the fields of the
82 // header of a network protocol buffer.
83 type Network interface {
84 // SourceAddress returns the value of the "source address" field.
85 SourceAddress() tcpip.Address
86 87 // DestinationAddress returns the value of the "destination address"
88 // field.
89 DestinationAddress() tcpip.Address
90 91 // Checksum returns the value of the "checksum" field.
92 Checksum() uint16
93 94 // SetSourceAddress sets the value of the "source address" field.
95 SetSourceAddress(tcpip.Address)
96 97 // SetDestinationAddress sets the value of the "destination address"
98 // field.
99 SetDestinationAddress(tcpip.Address)
100 101 // SetChecksum sets the value of the "checksum" field.
102 SetChecksum(uint16)
103 104 // TransportProtocol returns the number of the transport protocol
105 // stored in the payload.
106 TransportProtocol() tcpip.TransportProtocolNumber
107 108 // Payload returns a byte slice containing the payload of the network
109 // packet.
110 Payload() []byte
111 112 // TOS returns the values of the "type of service" and "flow label" fields.
113 TOS() (uint8, uint32)
114 115 // SetTOS sets the values of the "type of service" and "flow label" fields.
116 SetTOS(t uint8, l uint32)
117 }
118 119 // ChecksummableNetwork is a Network that supports checksumming.
120 type ChecksummableNetwork interface {
121 Network
122 123 // SetSourceAddressAndChecksum sets the source address and updates the
124 // checksum to reflect the new address.
125 SetSourceAddressWithChecksumUpdate(tcpip.Address)
126 127 // SetDestinationAddressAndChecksum sets the destination address and
128 // updates the checksum to reflect the new address.
129 SetDestinationAddressWithChecksumUpdate(tcpip.Address)
130 }
131