| /* |
| * Copyright 2023 Google LLC |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #include "pldm-oem-google.h" |
| |
| #include <phosphor-logging/log.hpp> |
| |
| #include <cstddef> |
| |
| uint16_t platform_oem_google_decode_event_message_req( |
| const uint8_t* event_data, size_t event_data_length, |
| size_t* oem_event_data_offset, size_t* oem_event_data_len) |
| { |
| if (!event_data) |
| { |
| phosphor::logging::log<phosphor::logging::level::ERR>( |
| "Invalid OEM event_data"); |
| return PLDM_EVENT_OEM_GOOGLE_ID_UNDEFINED; |
| } |
| |
| if (event_data_length < sizeof(pldm_event_oem_google_event_hdr)) |
| { |
| phosphor::logging::log<phosphor::logging::level::ERR>( |
| "Invalid OEM event_data_length"); |
| return PLDM_EVENT_OEM_GOOGLE_ID_UNDEFINED; |
| } |
| |
| const auto* eventHdr = |
| reinterpret_cast<const struct pldm_event_oem_google_event_hdr*>( |
| event_data); |
| if (!isGoogleIANA(eventHdr->IANA)) |
| { |
| phosphor::logging::log<phosphor::logging::level::ERR>( |
| "Invalid OEM GoogleIANA"); |
| return PLDM_EVENT_OEM_GOOGLE_ID_UNDEFINED; |
| } |
| |
| if (oem_event_data_offset) |
| { |
| *oem_event_data_offset = sizeof(struct pldm_event_oem_google_event_hdr); |
| } |
| |
| if (oem_event_data_len) |
| { |
| *oem_event_data_len = event_data_length - |
| sizeof(struct pldm_event_oem_google_event_hdr); |
| } |
| |
| return eventHdr->googleOEMEventID; |
| } |
| |
| const struct pldm_event_oem_google_soc_reset_me* |
| pldm_event_oem_google_soc_reset_me_msg(const uint8_t* oem_event_data, |
| size_t oem_event_data_len) |
| { |
| if (oem_event_data == nullptr || |
| oem_event_data_len < sizeof(struct pldm_event_oem_google_soc_reset_me)) |
| { |
| return nullptr; |
| } |
| |
| const auto* socResetMeMsg = |
| reinterpret_cast<const struct pldm_event_oem_google_soc_reset_me*>( |
| oem_event_data); |
| |
| if (oem_event_data_len < |
| (socResetMeMsg->descLen + |
| sizeof(struct pldm_event_oem_google_soc_reset_me))) |
| { |
| return nullptr; |
| } |
| return socResetMeMsg; |
| } |