1 // Copyright 2021 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 "encoding/binary"
18 19 // These constants are declared in linux/virtio_net.h.
20 const (
21 _VIRTIO_NET_HDR_F_NEEDS_CSUM = 1
22 _VIRTIO_NET_HDR_GSO_NONE = 0
23 _VIRTIO_NET_HDR_GSO_TCPV4 = 1
24 _VIRTIO_NET_HDR_GSO_TCPV6 = 4
25 )
26 27 const (
28 // VirtioNetHeaderSize is the size of VirtioNetHeader in bytes.
29 VirtioNetHeaderSize = 10
30 )
31 32 // Offsets for fields in the virtio net header.
33 const (
34 flags = 0
35 gsoType = 1
36 hdrLen = 2
37 gsoSize = 4
38 csumStart = 6
39 csumOffset = 8
40 )
41 42 // VirtioNetHeaderFields is the Go equivalent of the struct declared in
43 // linux/virtio_net.h.
44 type VirtioNetHeaderFields struct {
45 Flags uint8
46 GSOType uint8
47 HdrLen uint16
48 GSOSize uint16
49 CSumStart uint16
50 CSumOffset uint16
51 }
52 53 // VirtioNetHeader represents a virtio net header stored in a byte array.
54 type VirtioNetHeader []byte
55 56 // Flags returns the "flags" field of the virtio net header.
57 func (v VirtioNetHeader) Flags() uint8 {
58 return uint8(v[flags])
59 }
60 61 // GSOType returns the "gsoType" field of the virtio net header.
62 func (v VirtioNetHeader) GSOType() uint8 {
63 return uint8(v[gsoType])
64 }
65 66 // HdrLen returns the "hdrLen" field of the virtio net header.
67 func (v VirtioNetHeader) HdrLen() uint16 {
68 return binary.BigEndian.Uint16(v[hdrLen:])
69 }
70 71 // GSOSize returns the "gsoSize" field of the virtio net header.
72 func (v VirtioNetHeader) GSOSize() uint16 {
73 return binary.BigEndian.Uint16(v[gsoSize:])
74 }
75 76 // CSumStart returns the "csumStart" field of the virtio net header.
77 func (v VirtioNetHeader) CSumStart() uint16 {
78 return binary.BigEndian.Uint16(v[csumStart:])
79 }
80 81 // CSumOffset returns the "csumOffset" field of the virtio net header.
82 func (v VirtioNetHeader) CSumOffset() uint16 {
83 return binary.BigEndian.Uint16(v[csumOffset:])
84 }
85 86 // Encode encodes all the fields of the virtio net header.
87 func (v VirtioNetHeader) Encode(f *VirtioNetHeaderFields) {
88 v[flags] = uint8(f.Flags)
89 v[gsoType] = uint8(f.GSOType)
90 binary.BigEndian.PutUint16(v[hdrLen:], f.HdrLen)
91 binary.BigEndian.PutUint16(v[gsoSize:], f.GSOSize)
92 binary.BigEndian.PutUint16(v[csumStart:], f.CSumStart)
93 binary.BigEndian.PutUint16(v[csumOffset:], f.CSumOffset)
94 }
95