github.com/contiv/libOpenflow@v0.0.0-20210609050114-d967b14cc688/protocol/udp.go (about)

     1  package protocol
     2  
     3  import (
     4  	"encoding/binary"
     5  	"errors"
     6  )
     7  
     8  type UDP struct {
     9  	PortSrc  uint16
    10  	PortDst  uint16
    11  	Length   uint16
    12  	Checksum uint16
    13  	Data     []byte
    14  }
    15  
    16  func NewUDP() *UDP {
    17  	u := new(UDP)
    18  	u.Data = make([]byte, 0)
    19  	return u
    20  }
    21  
    22  func (u *UDP) Len() (n uint16) {
    23  	if u.Data != nil {
    24  		return uint16(8 + len(u.Data))
    25  	}
    26  	return uint16(8)
    27  }
    28  
    29  func (u *UDP) MarshalBinary() (data []byte, err error) {
    30  	data = make([]byte, int(u.Len()))
    31  	binary.BigEndian.PutUint16(data[:2], u.PortSrc)
    32  	binary.BigEndian.PutUint16(data[2:4], u.PortDst)
    33  	binary.BigEndian.PutUint16(data[4:6], u.Length)
    34  	binary.BigEndian.PutUint16(data[6:8], u.Checksum)
    35  	copy(data[8:], u.Data)
    36  	return
    37  }
    38  
    39  func (u *UDP) UnmarshalBinary(data []byte) error {
    40  	if len(data) < 8 {
    41  		return errors.New("The []byte is too short to unmarshal a full ARP message.")
    42  	}
    43  	u.PortSrc = binary.BigEndian.Uint16(data[:2])
    44  	u.PortDst = binary.BigEndian.Uint16(data[2:4])
    45  	u.Length = binary.BigEndian.Uint16(data[4:6])
    46  	u.Checksum = binary.BigEndian.Uint16(data[6:8])
    47  	u.Data = append(u.Data, data[8:]...)
    48  
    49  	return nil
    50  }