xref: /openbmc/openpower-vpd-parser/vpd-manager/include/keyword_vpd_parser.hpp (revision fa5e4d325ef9cea3c841fe89d202c340f92bd8c6)
1 *fa5e4d32SSunny Srivastava #pragma once
2 *fa5e4d32SSunny Srivastava 
3 *fa5e4d32SSunny Srivastava #include "parser_interface.hpp"
4 *fa5e4d32SSunny Srivastava #include "types.hpp"
5 *fa5e4d32SSunny Srivastava 
6 *fa5e4d32SSunny Srivastava namespace vpd
7 *fa5e4d32SSunny Srivastava {
8 *fa5e4d32SSunny Srivastava 
9 *fa5e4d32SSunny Srivastava /**
10 *fa5e4d32SSunny Srivastava  * @brief Concrete class to implement Keyword VPD parsing
11 *fa5e4d32SSunny Srivastava  *
12 *fa5e4d32SSunny Srivastava  * The class inherits ParserInterface class and overrides the parser
13 *fa5e4d32SSunny Srivastava  * functionality to implement parsing logic for Keyword VPD format.
14 *fa5e4d32SSunny Srivastava  */
15 *fa5e4d32SSunny Srivastava class KeywordVpdParser : public ParserInterface
16 *fa5e4d32SSunny Srivastava {
17 *fa5e4d32SSunny Srivastava   public:
18 *fa5e4d32SSunny Srivastava     KeywordVpdParser() = delete;
19 *fa5e4d32SSunny Srivastava     KeywordVpdParser(const KeywordVpdParser&) = delete;
20 *fa5e4d32SSunny Srivastava     KeywordVpdParser(KeywordVpdParser&&) = delete;
21 *fa5e4d32SSunny Srivastava     ~KeywordVpdParser() = default;
22 *fa5e4d32SSunny Srivastava 
23 *fa5e4d32SSunny Srivastava     /**
24 *fa5e4d32SSunny Srivastava      * @brief Constructor
25 *fa5e4d32SSunny Srivastava      *
26 *fa5e4d32SSunny Srivastava      * @param kwVpdVector - move it to object's m_keywordVpdVector
27 *fa5e4d32SSunny Srivastava      */
KeywordVpdParser(const types::BinaryVector & kwVpdVector)28 *fa5e4d32SSunny Srivastava     KeywordVpdParser(const types::BinaryVector& kwVpdVector) :
29 *fa5e4d32SSunny Srivastava         m_keywordVpdVector(kwVpdVector),
30 *fa5e4d32SSunny Srivastava         m_vpdIterator(m_keywordVpdVector.begin())
31 *fa5e4d32SSunny Srivastava     {}
32 *fa5e4d32SSunny Srivastava 
33 *fa5e4d32SSunny Srivastava     /**
34 *fa5e4d32SSunny Srivastava      * @brief A wrapper function to parse the keyword VPD binary data.
35 *fa5e4d32SSunny Srivastava      *
36 *fa5e4d32SSunny Srivastava      * It validates certain tags and checksum data, calls helper function
37 *fa5e4d32SSunny Srivastava      * to parse and emplace the data as keyword-value pairs in KeywordVpdMap.
38 *fa5e4d32SSunny Srivastava      *
39 *fa5e4d32SSunny Srivastava      * @throw DataException - VPD is not valid
40 *fa5e4d32SSunny Srivastava      * @return map of keyword:value
41 *fa5e4d32SSunny Srivastava      */
42 *fa5e4d32SSunny Srivastava     types::VPDMapVariant parse();
43 *fa5e4d32SSunny Srivastava 
44 *fa5e4d32SSunny Srivastava   private:
45 *fa5e4d32SSunny Srivastava     /**
46 *fa5e4d32SSunny Srivastava      * @brief Parse the VPD data and emplace them as pair into the Map.
47 *fa5e4d32SSunny Srivastava      *
48 *fa5e4d32SSunny Srivastava      * @throw DataException - VPD data size is 0, check VPD
49 *fa5e4d32SSunny Srivastava      * @return map of keyword:value
50 *fa5e4d32SSunny Srivastava      */
51 *fa5e4d32SSunny Srivastava     types::KeywordVpdMap populateVpdMap();
52 *fa5e4d32SSunny Srivastava 
53 *fa5e4d32SSunny Srivastava     /**
54 *fa5e4d32SSunny Srivastava      * @brief Validate checksum.
55 *fa5e4d32SSunny Srivastava      *
56 *fa5e4d32SSunny Srivastava      * Finding the 2's complement of sum of all the
57 *fa5e4d32SSunny Srivastava      * keywords,values and large resource identifier string.
58 *fa5e4d32SSunny Srivastava      *
59 *fa5e4d32SSunny Srivastava      * @param[in] i_checkSumStart - VPD iterator pointing at checksum start
60 *fa5e4d32SSunny Srivastava      * value
61 *fa5e4d32SSunny Srivastava      * @param[in] i_checkSumEnd - VPD iterator pointing at checksum end value
62 *fa5e4d32SSunny Srivastava      * @throw DataException - checksum invalid, check VPD
63 *fa5e4d32SSunny Srivastava      */
64 *fa5e4d32SSunny Srivastava     void validateChecksum(types::BinaryVector::const_iterator i_checkSumStart,
65 *fa5e4d32SSunny Srivastava                           types::BinaryVector::const_iterator i_checkSumEnd);
66 *fa5e4d32SSunny Srivastava 
67 *fa5e4d32SSunny Srivastava     /**
68 *fa5e4d32SSunny Srivastava      * @brief It reads 2 bytes from current VPD pointer
69 *fa5e4d32SSunny Srivastava      *
70 *fa5e4d32SSunny Srivastava      * @return 2 bytes of VPD data
71 *fa5e4d32SSunny Srivastava      */
getKwDataSize()72 *fa5e4d32SSunny Srivastava     inline size_t getKwDataSize()
73 *fa5e4d32SSunny Srivastava     {
74 *fa5e4d32SSunny Srivastava         return (*(m_vpdIterator + 1) << 8 | *m_vpdIterator);
75 *fa5e4d32SSunny Srivastava     }
76 *fa5e4d32SSunny Srivastava 
77 *fa5e4d32SSunny Srivastava     /**
78 *fa5e4d32SSunny Srivastava      * @brief Check for given number of bytes validity
79 *fa5e4d32SSunny Srivastava      *
80 *fa5e4d32SSunny Srivastava      * Check if number of elements from (begining of the vector) to (iterator +
81 *fa5e4d32SSunny Srivastava      * numberOfBytes) is lesser than or equal to the total no.of elements in
82 *fa5e4d32SSunny Srivastava      * the vector. This check is performed before advancement of the iterator.
83 *fa5e4d32SSunny Srivastava      *
84 *fa5e4d32SSunny Srivastava      * @param[in] numberOfBytes - no.of positions the iterator is going to be
85 *fa5e4d32SSunny Srivastava      * iterated
86 *fa5e4d32SSunny Srivastava      *
87 *fa5e4d32SSunny Srivastava      * @throw DataException - Truncated VPD data, check VPD.
88 *fa5e4d32SSunny Srivastava      */
89 *fa5e4d32SSunny Srivastava     void checkNextBytesValidity(uint8_t numberOfBytes);
90 *fa5e4d32SSunny Srivastava 
91 *fa5e4d32SSunny Srivastava     /*Vector of keyword VPD data*/
92 *fa5e4d32SSunny Srivastava     const types::BinaryVector& m_keywordVpdVector;
93 *fa5e4d32SSunny Srivastava 
94 *fa5e4d32SSunny Srivastava     /*Iterator to VPD data*/
95 *fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator m_vpdIterator;
96 *fa5e4d32SSunny Srivastava };
97 *fa5e4d32SSunny Srivastava } // namespace vpd
98