void SetAuthorizationCertificate::unpack(IpmiMessage& msg){ log_debug(LOGUSR, "Unpacking Set Authorization Certificate message."); msg.set_to_request(); // verify if the request is long enough if (CMD_REQUEST_HEADER_LENGTH + CMD_REQUEST_MIN_CHUNK_LENGTH > (msg.get_len() - IPMB_FRAME_HDR_WITH_DATA_CHCKSUM_LEN)) { log_error(GET_LOGGER("ipmb"), "Invalid request length."); m_response.set_cc(CompletionCode::CC_REQ_DATA_LENGTH_INVALID); return; } auto data = msg.get_data(); if (data) { log_debug(GET_LOGGER("ipmb"), "Validating length."); // verify if request's length is compliant with declared if ((CMD_REQUEST_HEADER_LENGTH + data[OFFSET_CHUNK_LEN]) < (msg.get_len() - IPMB_FRAME_HDR_WITH_DATA_CHCKSUM_LEN)) { log_error(GET_LOGGER("ipmb"), "Request is too long: " << unsigned(msg.get_len())); m_response.set_cc(CompletionCode::CC_REQ_DATA_FIELD_LENGTH_EXC); return; } if ((CMD_REQUEST_HEADER_LENGTH + data[OFFSET_CHUNK_LEN]) > (msg.get_len() - IPMB_FRAME_HDR_WITH_DATA_CHCKSUM_LEN)) { log_error(GET_LOGGER("ipmb"), "Request is too short: " << unsigned(msg.get_len())); m_response.set_cc(CompletionCode::CC_REQ_DATA_FIELD_LENGTH_EXC); return; } m_request.set_certificate_type(Certificate::Type(data[OFFSET_TYPE])); m_request.set_certificate_length(uint16_t((data[OFFSET_CERT_LEN]) | data[OFFSET_CERT_LEN+1] << 8)); m_request.set_current_chunk_number(data[OFFSET_CHUNK_NO]); m_request.set_current_chunk_length(data[OFFSET_CHUNK_LEN]); std::copy_n(data+OFFSET_CERT, m_request.get_current_chunk_length(), std::back_inserter(m_request.get_certificate_data())); } }
void UnknownCommand::unpack(IpmiMessage& msg){ log_debug(LOGUSR, "Unpacking unknown message."); msg.set_to_request(); }
void InvalidSelector::unpack(IpmiMessage& msg) { msg.set_to_request(); }
void SourceSelector::unpack(IpmiMessage& msg) { msg.set_to_request(); }