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 }