virtionet.go raw

   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