| // Copyright 2021 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 "encoding/binary" |
| |
| // These constants are declared in linux/virtio_net.h. |
| const ( |
| _VIRTIO_NET_HDR_F_NEEDS_CSUM = 1 |
| _VIRTIO_NET_HDR_GSO_NONE = 0 |
| _VIRTIO_NET_HDR_GSO_TCPV4 = 1 |
| _VIRTIO_NET_HDR_GSO_TCPV6 = 4 |
| ) |
| |
| const ( |
| // VirtioNetHeaderSize is the size of VirtioNetHeader in bytes. |
| VirtioNetHeaderSize = 10 |
| ) |
| |
| // Offsets for fields in the virtio net header. |
| const ( |
| flags = 0 |
| gsoType = 1 |
| hdrLen = 2 |
| gsoSize = 4 |
| csumStart = 6 |
| csumOffset = 8 |
| ) |
| |
| // VirtioNetHeaderFields is the Go equivalent of the struct declared in |
| // linux/virtio_net.h. |
| type VirtioNetHeaderFields struct { |
| Flags uint8 |
| GSOType uint8 |
| HdrLen uint16 |
| GSOSize uint16 |
| CSumStart uint16 |
| CSumOffset uint16 |
| } |
| |
| // VirtioNetHeader represents a virtio net header stored in a byte array. |
| type VirtioNetHeader []byte |
| |
| // Flags returns the "flags" field of the virtio net header. |
| func (v VirtioNetHeader) Flags() uint8 { |
| return uint8(v[flags]) |
| } |
| |
| // GSOType returns the "gsoType" field of the virtio net header. |
| func (v VirtioNetHeader) GSOType() uint8 { |
| return uint8(v[gsoType]) |
| } |
| |
| // HdrLen returns the "hdrLen" field of the virtio net header. |
| func (v VirtioNetHeader) HdrLen() uint16 { |
| return binary.BigEndian.Uint16(v[hdrLen:]) |
| } |
| |
| // GSOSize returns the "gsoSize" field of the virtio net header. |
| func (v VirtioNetHeader) GSOSize() uint16 { |
| return binary.BigEndian.Uint16(v[gsoSize:]) |
| } |
| |
| // CSumStart returns the "csumStart" field of the virtio net header. |
| func (v VirtioNetHeader) CSumStart() uint16 { |
| return binary.BigEndian.Uint16(v[csumStart:]) |
| } |
| |
| // CSumOffset returns the "csumOffset" field of the virtio net header. |
| func (v VirtioNetHeader) CSumOffset() uint16 { |
| return binary.BigEndian.Uint16(v[csumOffset:]) |
| } |
| |
| // Encode encodes all the fields of the virtio net header. |
| func (v VirtioNetHeader) Encode(f *VirtioNetHeaderFields) { |
| v[flags] = uint8(f.Flags) |
| v[gsoType] = uint8(f.GSOType) |
| binary.BigEndian.PutUint16(v[hdrLen:], f.HdrLen) |
| binary.BigEndian.PutUint16(v[gsoSize:], f.GSOSize) |
| binary.BigEndian.PutUint16(v[csumStart:], f.CSumStart) |
| binary.BigEndian.PutUint16(v[csumOffset:], f.CSumOffset) |
| } |