void UnknownCommand::Response::add_data(IpmiMessage& msg) { auto data = msg.get_data(); data[OFFSET_CC] = uint8_t(m_cc); msg.add_len(get_len()); }
void SourceSelector::Response::add_data(IpmiMessage& msg) { auto data = msg.get_data(); data[OFFSET_CC] = uint8_t(m_cc); data[OFFSET_REVISTION] = m_param_revision; data[OFFSET_SOURCE] = m_source; msg.add_len(get_len()); }
void UnknownCommand::pack(IpmiMessage& msg){ log_debug(LOGUSR, "Packing unknown message."); m_response.set_cc(CompletionCode::CC_INVALID_CMD); msg.set_to_response(); m_response.set_len(CMD_RESPONSE_DATA_LENGHT); m_response.add_data(msg); }
void SetAuthorizationCertificate::pack(IpmiMessage& msg){ log_debug(LOGUSR, "Packing Set Authorization Certificate message."); if(CompletionCode::CC_OK != m_response.get_cc()) { return; } msg.set_cc(CompletionCode::CC_OK); msg.set_to_response(); Certificate& cert = CertificateManager::get_instance()-> get_certificate((m_request.get_certificate_type())); cert.add_chunk(m_request.get_certificate_length(), m_request.get_current_chunk_number(), m_request.get_certificate_data()); m_response.set_len(CMD_RESPONSE_DATA_LENGHT); m_response.add_data(msg); }
void SourceSelector::pack(IpmiMessage& msg){ m_response.set_cc(CompletionCode::CC_OK); try { auto source = network_utils::get_source(network_utils::get_network_interface()); m_response.set_source(static_cast<std::uint8_t>(source)); } catch (const std::runtime_error& e) { m_response.set_cc(CompletionCode::CC_CANNOT_RETURN_REQ_DATA); log_debug(LOGUSR, "Cannot read interface source!" << e.what()); } m_response.set_len(CMD_RESPONSE_DATA_LENGHT); m_response.add_data(msg); msg.set_to_response(); }
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 SetAuthorizationCertificate::Response::add_data(IpmiMessage& msg) { auto data = msg.get_data(); data[0] = uint8_t(this->get_cc()); msg.add_len(get_len()); }
void InvalidSelector::pack(IpmiMessage& msg) { m_response.set_len(1); m_response.set_cc(CompletionCode::CC_PARAMETER_NOT_SUPPORTED); m_response.add_data(msg); msg.set_to_response(); }
void InvalidSelector::unpack(IpmiMessage& msg) { msg.set_to_request(); }
void InvalidSelector::Response::add_data(IpmiMessage& msg) { auto data = msg.get_data(); data[OFFSET_CC] = uint8_t(m_cc); msg.add_len(get_len()); }
void SourceSelector::unpack(IpmiMessage& msg) { msg.set_to_request(); }