1*e12b181bSSunnySrivastava1984 #pragma once 2*e12b181bSSunnySrivastava1984 3*e12b181bSSunnySrivastava1984 #include "parser_interface.hpp" 4*e12b181bSSunnySrivastava1984 #include "types.hpp" 5*e12b181bSSunnySrivastava1984 6*e12b181bSSunnySrivastava1984 namespace vpd 7*e12b181bSSunnySrivastava1984 { 8*e12b181bSSunnySrivastava1984 namespace keyword 9*e12b181bSSunnySrivastava1984 { 10*e12b181bSSunnySrivastava1984 namespace parser 11*e12b181bSSunnySrivastava1984 { 12*e12b181bSSunnySrivastava1984 13*e12b181bSSunnySrivastava1984 using ParserInterface = openpower::vpd::parser::interface::ParserInterface; 14*e12b181bSSunnySrivastava1984 using kwdVpdMap = openpower::vpd::inventory::KeywordVpdMap; 15*e12b181bSSunnySrivastava1984 using store = openpower::vpd::Store; 16*e12b181bSSunnySrivastava1984 17*e12b181bSSunnySrivastava1984 /** 18*e12b181bSSunnySrivastava1984 * @class KeywordVpdParser 19*e12b181bSSunnySrivastava1984 * @brief Implements parser for Keyword VPD 20*e12b181bSSunnySrivastava1984 * 21*e12b181bSSunnySrivastava1984 * KeywordVpdParser object must be constructed by passing in 22*e12b181bSSunnySrivastava1984 * Keyword VPD in binary format. To parse the VPD, call the 23*e12b181bSSunnySrivastava1984 * kwVpdParser() method. The kwVpdParser() method returns 24*e12b181bSSunnySrivastava1984 * a map of keyword-value pairs. 25*e12b181bSSunnySrivastava1984 * 26*e12b181bSSunnySrivastava1984 * Following is the algorithm used to parse Keyword VPD data: 27*e12b181bSSunnySrivastava1984 * 1) Validate if the first byte is 'largeResourceIdentifierString'. 28*e12b181bSSunnySrivastava1984 * 2) Validate the byte after the description is 'vendor defined large resource 29*e12b181bSSunnySrivastava1984 * type tag'. 30*e12b181bSSunnySrivastava1984 * 3) For each keyword-value pairs : 31*e12b181bSSunnySrivastava1984 * 3.1) Parse the 2 byte length keyword and emplace it in the map as 'key'. 32*e12b181bSSunnySrivastava1984 * 3.2) Parse over the value bytes corresponding to the keyword and 33*e12b181bSSunnySrivastava1984 * emplace it in the map as 'value' for the key inserted in 3.1. 34*e12b181bSSunnySrivastava1984 * 4) Validate the byte before checksum byte is 'small resource type end tag'. 35*e12b181bSSunnySrivastava1984 * 5) Validate the checksum. 36*e12b181bSSunnySrivastava1984 * 6) Validate the 'small resource type last end tag'. 37*e12b181bSSunnySrivastava1984 * 7) Return the keyword-value map. 38*e12b181bSSunnySrivastava1984 */ 39*e12b181bSSunnySrivastava1984 class KeywordVpdParser : public ParserInterface 40*e12b181bSSunnySrivastava1984 { 41*e12b181bSSunnySrivastava1984 public: 42*e12b181bSSunnySrivastava1984 KeywordVpdParser() = delete; 43*e12b181bSSunnySrivastava1984 KeywordVpdParser(const KeywordVpdParser&) = delete; 44*e12b181bSSunnySrivastava1984 KeywordVpdParser(KeywordVpdParser&&) = delete; 45*e12b181bSSunnySrivastava1984 ~KeywordVpdParser() = default; 46*e12b181bSSunnySrivastava1984 47*e12b181bSSunnySrivastava1984 /** 48*e12b181bSSunnySrivastava1984 * @brief Constructor 49*e12b181bSSunnySrivastava1984 * 50*e12b181bSSunnySrivastava1984 * Move kwVpdVector to parser object's kwVpdVector 51*e12b181bSSunnySrivastava1984 */ 52*e12b181bSSunnySrivastava1984 KeywordVpdParser(openpower::vpd::Binary&& kwVpdVector) : 53*e12b181bSSunnySrivastava1984 keywordVpdVector(std::move(kwVpdVector)) 54*e12b181bSSunnySrivastava1984 { 55*e12b181bSSunnySrivastava1984 } 56*e12b181bSSunnySrivastava1984 57*e12b181bSSunnySrivastava1984 /** 58*e12b181bSSunnySrivastava1984 * @brief Parse the keyword VPD binary data. 59*e12b181bSSunnySrivastava1984 * Calls the sub functions to emplace the 60*e12b181bSSunnySrivastava1984 * keyword-value pairs in map and to validate 61*e12b181bSSunnySrivastava1984 * certain tags and checksum data. 62*e12b181bSSunnySrivastava1984 * 63*e12b181bSSunnySrivastava1984 * @return map of keyword:value 64*e12b181bSSunnySrivastava1984 */ 65*e12b181bSSunnySrivastava1984 std::variant<kwdVpdMap, store> parse(); 66*e12b181bSSunnySrivastava1984 67*e12b181bSSunnySrivastava1984 /** 68*e12b181bSSunnySrivastava1984 * @brief An api to return interface name with respect to 69*e12b181bSSunnySrivastava1984 * the parser selected. 70*e12b181bSSunnySrivastava1984 * 71*e12b181bSSunnySrivastava1984 * @return - Interface name for that vpd type. 72*e12b181bSSunnySrivastava1984 */ 73*e12b181bSSunnySrivastava1984 std::string getInterfaceName() const; 74*e12b181bSSunnySrivastava1984 75*e12b181bSSunnySrivastava1984 private: 76*e12b181bSSunnySrivastava1984 openpower::vpd::Binary::iterator 77*e12b181bSSunnySrivastava1984 checkSumStart; //!< Pointer to the start byte from where 78*e12b181bSSunnySrivastava1984 //!< the checksum need to be calculated 79*e12b181bSSunnySrivastava1984 openpower::vpd::Binary::iterator 80*e12b181bSSunnySrivastava1984 checkSumEnd; //!< Pointer to the end byte until which the 81*e12b181bSSunnySrivastava1984 //!< checksum need to be calculated 82*e12b181bSSunnySrivastava1984 openpower::vpd::Binary::iterator 83*e12b181bSSunnySrivastava1984 kwVpdIterator; //!< Iterator to parse the vector 84*e12b181bSSunnySrivastava1984 openpower::vpd::Binary 85*e12b181bSSunnySrivastava1984 keywordVpdVector; //!< Vector which stores keyword VPD data 86*e12b181bSSunnySrivastava1984 87*e12b181bSSunnySrivastava1984 /** 88*e12b181bSSunnySrivastava1984 * @brief Validate the large resource identifier string 89*e12b181bSSunnySrivastava1984 */ 90*e12b181bSSunnySrivastava1984 void validateLargeResourceIdentifierString(); 91*e12b181bSSunnySrivastava1984 92*e12b181bSSunnySrivastava1984 /** 93*e12b181bSSunnySrivastava1984 * @brief Validate the type of keyword VPD 94*e12b181bSSunnySrivastava1984 * 95*e12b181bSSunnySrivastava1984 * @return integer representing the type of kw VPD. 96*e12b181bSSunnySrivastava1984 */ 97*e12b181bSSunnySrivastava1984 int validateTheTypeOfKwVpd(); 98*e12b181bSSunnySrivastava1984 99*e12b181bSSunnySrivastava1984 /** 100*e12b181bSSunnySrivastava1984 * @brief Parsing keyword-value pairs and emplace into Map. 101*e12b181bSSunnySrivastava1984 * 102*e12b181bSSunnySrivastava1984 * @return map of keyword:value 103*e12b181bSSunnySrivastava1984 */ 104*e12b181bSSunnySrivastava1984 openpower::vpd::inventory::KeywordVpdMap kwValParser(); 105*e12b181bSSunnySrivastava1984 106*e12b181bSSunnySrivastava1984 /** 107*e12b181bSSunnySrivastava1984 * @brief Validate small resource type end tag 108*e12b181bSSunnySrivastava1984 */ 109*e12b181bSSunnySrivastava1984 void validateSmallResourceTypeEnd(); 110*e12b181bSSunnySrivastava1984 111*e12b181bSSunnySrivastava1984 /** 112*e12b181bSSunnySrivastava1984 * @brief Validate checksum. 113*e12b181bSSunnySrivastava1984 * 114*e12b181bSSunnySrivastava1984 * Finding the 2's complement of sum of all the 115*e12b181bSSunnySrivastava1984 * keywords,values and large resource identifier string. 116*e12b181bSSunnySrivastava1984 */ 117*e12b181bSSunnySrivastava1984 void validateChecksum(); 118*e12b181bSSunnySrivastava1984 119*e12b181bSSunnySrivastava1984 /** 120*e12b181bSSunnySrivastava1984 * @brief Validate small resource type last end tag 121*e12b181bSSunnySrivastava1984 */ 122*e12b181bSSunnySrivastava1984 void validateSmallResourceTypeLastEnd(); 123*e12b181bSSunnySrivastava1984 124*e12b181bSSunnySrivastava1984 /** 125*e12b181bSSunnySrivastava1984 * @brief Get the size of the keyword 126*e12b181bSSunnySrivastava1984 * 127*e12b181bSSunnySrivastava1984 * @return one byte length size data 128*e12b181bSSunnySrivastava1984 */ 129*e12b181bSSunnySrivastava1984 size_t getKwDataSize(); 130*e12b181bSSunnySrivastava1984 131*e12b181bSSunnySrivastava1984 /** 132*e12b181bSSunnySrivastava1984 * @brief Check for iterator Out of Bound exception 133*e12b181bSSunnySrivastava1984 * 134*e12b181bSSunnySrivastava1984 * Check if no.of elements from (begining of the vector) to (iterator + 135*e12b181bSSunnySrivastava1984 * incVar) is lesser than or equal to the total no.of elements in the 136*e12b181bSSunnySrivastava1984 * vector. This check is performed before the advancement of the iterator. 137*e12b181bSSunnySrivastava1984 * 138*e12b181bSSunnySrivastava1984 * @param[incVar] - no.of positions the iterator is going to be iterated 139*e12b181bSSunnySrivastava1984 */ 140*e12b181bSSunnySrivastava1984 void itrOutOfBoundCheck(uint8_t incVar); 141*e12b181bSSunnySrivastava1984 }; 142*e12b181bSSunnySrivastava1984 } // namespace parser 143*e12b181bSSunnySrivastava1984 } // namespace keyword 144*e12b181bSSunnySrivastava1984 } // namespace vpd 145