コード例 #1
0
        /// <summary>
        /// Convert the IPMI request meeting into a byte stream for transmission
        /// to the BMC over Serial.
        /// [Byte 0]    [Byte 1]    [Byte 2]    [Byte 3]
        /// [StrChar]   [rsAddr]    [netFn]     [chksum]
        /// [Byte 4]    [Byte 5]    [Byte 6]    [Byte 7]    [Byte 8]    [Byte 9]
        /// [rqAddr]    [rqSeq]     [cmd]       [payload]   [cksum]     [stop]
        /// </summary>
        /// <param name="IpmiRqSeq">Sequence id for message.</param>
        /// <returns>byte array representing the Serial data to send.</returns>
        internal byte[] GetBytes(IpmiTransport transport, byte IpmiRqSeq)
        {
            // payload lenght
            int dataLength = GetPayloadLenght();

            // payload bytes
            byte[] payload = GetPayload(dataLength);

            // response message lenght
            int messageLength = dataLength;

            if (transport == IpmiTransport.Serial)
            {
                // Add 9 bytes for 7 byte header and start + stop byte
                // 09 bytes =   byte[1] start, byte[2] rsAdd, byte[3] netFnAndrqLun, byte[4] checksum1
                //              byte[5] rqAddr, byte[6] rqSeqAndrsLun, byte[7] command, byte[x] payload
                //              byte[8] checksum, byte[09] stop.
                messageLength += 9;
            }

            byte[] messagedata = new byte[messageLength];

            if (transport == IpmiTransport.Serial)
            {
                // Step 1. Add Message Header.
                #region Message header

                messagedata[1] = 0x20;                                 // rsAddr
                messagedata[2] = (byte)((byte)this.IpmiFunction << 2); // netFN
                messagedata[3] = 0x00;                                 // checksum zero'd for now.  Set after data.
                messagedata[4] = 0x81;                                 // for serial can be 0x8F;
                messagedata[5] = (byte)((byte)IpmiRqSeq << 2);         // rqSeq/rqLun
                messagedata[6] = (byte)this.IpmiCommand;               // cmd

                #endregion

                // Step 2. Add payload Data.
                // Add ipmi message data
                // dataIndex + 7 offsets encapsulated ipmi message header & start charactor
                Buffer.BlockCopy(payload, 0, messagedata, 7, payload.Length);

                // Step 3. Add Message Checksum
                #region Message checksum

                // Set checksum 1: Byte 0 = Start Char, Byte 1 = rsAdd,
                // Byte 2 = netFn, Byte 3 = Checksum
                messagedata[3] = IpmiSharedFunc.TwoComplementChecksum(1, 3, messagedata);

                // Ipmi message encapsulation format checksum 2
                // checksum 2 begins after checksum 1.
                // checksum 2 calculated from rqAddr to end of data lenght.
                messagedata[(7 + dataLength)] = IpmiSharedFunc.TwoComplementChecksum(4, (7 + dataLength), messagedata);

                #endregion
            }

            return(messagedata);
        }