1 #pragma once
2 
3 #include "pel_common.hpp"
4 #include "pel_section.hpp"
5 #include "stream.hpp"
6 
7 #include <array>
8 
9 namespace attn
10 {
11 namespace pel
12 {
13 
14 constexpr uint8_t extendedUserHeaderVersion = 0x01;
15 constexpr size_t firmwareVersionSize = 16;
16 
17 /**
18  * @class ExtendedUserHeader
19  *
20  * This represents the Extended User Header section in a PEL
21  *
22  * |----------+---------------------------+-------+-------+-------------------|
23  * | length   | byte0                     | byte1 | byte2 | byte3             |
24  * |----------+---------------------------+-------+-------+-------------------|
25  * | 8        | Section Header                                                |
26  * |----------+---------------------------------------------------------------|
27  * | 20       | Machine Type/Model/Serial                                     |
28  * |----------+---------------------------------------------------------------|
29  * | 16       | FW Released Version                                           |
30  * |----------+---------------------------------------------------------------|
31  * | 16       | FW Sub-system driver ver.                                     |
32  * |----------+---------------------------+-------+-------+-------------------|
33  * | 4        | Reserved                  | rsvd  | rsvd  | Symptom ID length |
34  * |----------+---------------------------+-------+-------+-------------------|
35  * | 8        | Event Common Reference Time                                   |
36  * |----------+---------------------------------------------------------------|
37  * | 4        | Reserved                                                      |
38  * |----------+---------------------------------------------------------------|
39  * | variable | Symptom ID                                                    |
40  * |----------+---------------------------------------------------------------|
41  *
42  */
43 class ExtendedUserHeader : public Section
44 {
45   public:
46     ExtendedUserHeader() = delete;
47     ~ExtendedUserHeader() = default;
48     ExtendedUserHeader(const ExtendedUserHeader&) = default;
49     ExtendedUserHeader& operator=(const ExtendedUserHeader&) = default;
50     ExtendedUserHeader(ExtendedUserHeader&&) = default;
51     ExtendedUserHeader& operator=(ExtendedUserHeader&&) = default;
52 
53     /**
54      * @brief Constructor
55      *
56      * Fills in this class's data fields from raw data.
57      *
58      * @param[in] pel - the PEL data stream
59      */
60     explicit ExtendedUserHeader(Stream& pel);
61 
62     /**
63      * @brief Flatten the section into the stream
64      *
65      * @param[in] stream - The stream to write to
66      */
67     void flatten(Stream& stream) const override;
68 
69     /**
70      * @brief Fills in the object from the stream data
71      *
72      * @param[in] stream - The stream to read from
73      */
74     void unflatten(Stream& stream);
75 
76     /**
77      * @brief Returns the size of this section when flattened into a PEL
78      *
79      * @return size_t - the size of the section
80      */
flattenedSize()81     size_t flattenedSize()
82     {
83         return Section::flattenedSize() + mtmsSize + _serverFWVersion.size() +
84                _subsystemFWVersion.size() + sizeof(_reserved4B) +
85                sizeof(_refTime) + sizeof(_reserved1B1) + sizeof(_reserved1B2) +
86                sizeof(_reserved1B3) + sizeof(_symptomIdSize) + _symptomIdSize;
87     }
88 
89     /**
90      * @brief Set the symptom id field in extended user header
91      *
92      * @param[in] symptomId - The symptom ID to set
93      */
94     void setSymptomId(const std::string& symptomId);
95 
96   private:
97     /**
98      * @brief The structure that holds the machine TM and SN fields.
99      */
100     uint8_t _mtms[mtmsSize];
101 
102     /**
103      * @brief The server firmware version
104      *
105      * NULL terminated.
106      *
107      * The release version of the full firmware image.
108      */
109     std::array<uint8_t, firmwareVersionSize> _serverFWVersion;
110 
111     /**
112      * @brief The subsystem firmware version
113      *
114      * NULL terminated.
115      *
116      * On PELs created on the BMC, this will be the BMC code version.
117      */
118     std::array<uint8_t, firmwareVersionSize> _subsystemFWVersion;
119 
120     /**
121      * @brief Reserved
122      */
123     uint32_t _reserved4B = 0;
124 
125     /**
126      * @brief Event Common Reference Time
127      *
128      * This is not used by PELs created on the BMC.
129      */
130     uint64_t _refTime;
131 
132     /**
133      * @brief Reserved
134      */
135     uint8_t _reserved1B1 = 0;
136 
137     /**
138      * @brief Reserved
139      */
140     uint8_t _reserved1B2 = 0;
141 
142     /**
143      * @brief Reserved
144      */
145     uint8_t _reserved1B3 = 0;
146 
147     /**
148      * @brief The size of the symptom ID field
149      */
150     uint8_t _symptomIdSize;
151 
152     /**
153      * @brief The symptom ID field
154      *
155      * Describes a unique event signature for the log.
156      * Required for serviceable events, otherwise optional.
157      * When present, must start with the first 8 characters
158      * of the ASCII string field from the SRC.
159      *
160      * NULL terminated.
161      */
162     std::vector<uint8_t> _symptomId;
163 };
164 
165 } // namespace pel
166 } // namespace attn
167