/// <summary>
        /// Queries BMC for the currently set boot device.
        /// </summary>
        /// <returns>Flags indicating the boot device.</returns>
        public virtual NextBoot GetNextBoot()
        {
            GetSystemBootOptionsRequest req = new GetSystemBootOptionsRequest(
                (byte)SystemBootOptionsParameter.BootFlags, 0);

            GetSystemBootOptionsResponse response =
                (GetSystemBootOptionsResponse)this.IpmiSendReceive(req, typeof(GetSystemBootOptionsResponse));

            NextBoot nextboot = new NextBoot(response.CompletionCode);

            if (response.CompletionCode == 0x00)
            {
                nextboot.SetParamaters(response.ParameterData);
            }

            return(nextboot);
        }
        /// <summary>
        /// The helper for several boot type setting methods, as they
        /// essentially send the same sequence of messages.
        /// </summary>
        /// <param name="bootType">The desired boot type.</param>
        public virtual NextBoot SetNextBoot(BootType bootType, bool uefi, bool persistent, byte instance, bool requireCommit = false)
        {
            byte completionCode = 0x00;

            SsboSetInProgress req = new SsboSetInProgress(
                false, SboSetInProgress.SetInProgress);

            SetSystemBootOptionsResponse response =
                (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                    req, typeof(SetSystemBootOptionsResponse));

            completionCode = response.CompletionCode;

            SsboBootInfoAcknowledge ack = new SsboBootInfoAcknowledge(
                false,
                SboBootInfoAcknowledgeMask.EnableWriteBiosFlag,
                SboBootInfoAcknowledgeData.None);

            response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                ack, typeof(SetSystemBootOptionsResponse));

            if (completionCode == 0x00)
            {
                completionCode = response.CompletionCode;
            }


            BootFlags bootFlags = BootFlags.BootFlagsValid;

            if (persistent)
            {
                bootFlags = (bootFlags | BootFlags.AllSubsequentBoots);
            }

            if (uefi)
            {
                bootFlags = (bootFlags | BootFlags.EfiBootType);
            }

            SsboBootFlags flags = new SsboBootFlags(
                false, bootFlags, bootType, 0, 0, instance);

            response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                flags, typeof(SetSystemBootOptionsResponse));


            if (completionCode == 0x00)
            {
                completionCode = response.CompletionCode;
            }

            if (requireCommit)
            {
                req = new SsboSetInProgress(false, SboSetInProgress.CommitWrite);

                response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                    req, typeof(SetSystemBootOptionsResponse));

                if (completionCode == 0x00)
                {
                    completionCode = response.CompletionCode;
                }
            }

            req = new SsboSetInProgress(false, SboSetInProgress.SetComplete);

            response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                req, typeof(SetSystemBootOptionsResponse));

            if (completionCode == 0x00)
            {
                completionCode = response.CompletionCode;
            }

            NextBoot nextboot = new NextBoot(completionCode);

            nextboot.BootDevice = bootType;

            return(nextboot);
        }