示例#1
0
文件: vxlan.go 项目: mdlayher/vxlan
// UnmarshalBinary allocates a byte slice and marshals a Frame into binary form.
//
// If a VNI value is invalid, ErrInvalidVNI will be returned.
func (f *Frame) UnmarshalBinary(b []byte) error {
	// Need at least VXLAN frame and empty Ethernet frame
	if len(b) < 18 {
		return io.ErrUnexpectedEOF
	}

	// I flag must be set to 1.
	if (b[0] >> 3) != 1 {
		return ErrInvalidFrame
	}

	f.VNI = VNI(binary.BigEndian.Uint32(b[3:]))

	ef := new(ethernet.Frame)
	if err := ef.UnmarshalFCS(b[8:]); err != nil {
		return err
	}
	f.Ethernet = ef

	return nil
}