blob: 01636ee08ff6851862b71416018c155139c43e60 [file] [log] [blame]
Andrew Jeffery9c766792022-08-10 23:12:49 +09301#ifndef PDR_H
2#define PDR_H
3
4#ifdef __cplusplus
5extern "C" {
6#endif
7
8#include <stdbool.h>
9#include <stddef.h>
10#include <stdint.h>
11
12/** @struct pldm_pdr
13 * opaque structure that acts as a handle to a PDR repository
14 */
15typedef struct pldm_pdr pldm_pdr;
16
17/** @struct pldm_pdr_record
18 * opaque structure that acts as a handle to a PDR record
19 */
20typedef struct pldm_pdr_record pldm_pdr_record;
21
22/* ====================== */
23/* Common PDR access APIs */
24/* ====================== */
25
26/** @brief Make a new PDR repository
27 *
28 * @return opaque pointer that acts as a handle to the repository; NULL if no
29 * repository could be created
30 *
31 * @note Caller may make multiple repositories (for its own PDRs, as well as
32 * for PDRs received by other entities) and can associate the returned handle
33 * to a PLDM terminus id.
34 */
Andrew Jeffery319304f2023-04-05 13:53:18 +093035pldm_pdr *pldm_pdr_init(void);
Andrew Jeffery9c766792022-08-10 23:12:49 +093036
37/** @brief Destroy a PDR repository (and free up associated resources)
38 *
39 * @param[in/out] repo - pointer to opaque pointer acting as a PDR repo handle
40 */
41void pldm_pdr_destroy(pldm_pdr *repo);
42
43/** @brief Get number of records in a PDR repository
44 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +093045 * @pre repo must point to a valid object
46 *
Andrew Jeffery9c766792022-08-10 23:12:49 +093047 * @param[in] repo - opaque pointer acting as a PDR repo handle
48 *
49 * @return uint32_t - number of records
50 */
51uint32_t pldm_pdr_get_record_count(const pldm_pdr *repo);
52
53/** @brief Get size of a PDR repository, in bytes
54 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +093055 * @pre repo must point to a valid object
56 *
Andrew Jeffery9c766792022-08-10 23:12:49 +093057 * @param[in] repo - opaque pointer acting as a PDR repo handle
58 *
59 * @return uint32_t - size in bytes
60 */
61uint32_t pldm_pdr_get_repo_size(const pldm_pdr *repo);
62
63/** @brief Add a PDR record to a PDR repository
64 *
65 * @param[in/out] repo - opaque pointer acting as a PDR repo handle
66 * @param[in] data - pointer to a PDR record, pointing to a PDR definition as
67 * per DSP0248. This data is memcpy'd.
68 * @param[in] size - size of input PDR record in bytes
69 * @param[in] record_handle - record handle of input PDR record; if this is set
70 * to 0, then a record handle is computed and assigned to this PDR record
71 * @param[in] is_remote - if true, then the PDR is not from this terminus
72 * @param[in] terminus_handle - terminus handle of the input PDR record
73 *
74 * @return uint32_t - record handle assigned to PDR record
75 */
76uint32_t pldm_pdr_add(pldm_pdr *repo, const uint8_t *data, uint32_t size,
77 uint32_t record_handle, bool is_remote,
78 uint16_t terminus_handle);
79
80/** @brief Get record handle of a PDR record
81 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +093082 * @pre repo must point to a valid object
83 * @pre record must point to a valid object
84 *
Andrew Jeffery9c766792022-08-10 23:12:49 +093085 * @param[in] repo - opaque pointer acting as a PDR repo handle
86 * @param[in] record - opaque pointer acting as a PDR record handle
87 *
88 * @return uint32_t - record handle assigned to PDR record; 0 if record is not
89 * found
90 */
91uint32_t pldm_pdr_get_record_handle(const pldm_pdr *repo,
92 const pldm_pdr_record *record);
93
94/** @brief Find PDR record by record handle
95 *
96 * @param[in] repo - opaque pointer acting as a PDR repo handle
97 * @param[in] record_handle - input record handle
98 * @param[in/out] data - will point to PDR record data (as per DSP0248) on
99 * return
100 * @param[out] size - *size will be size of PDR record
101 * @param[out] next_record_handle - *next_record_handle will be the record
102 * handle of record next to the returned PDR record
103 *
104 * @return opaque pointer acting as PDR record handle, will be NULL if record
105 * was not found
106 */
107const pldm_pdr_record *pldm_pdr_find_record(const pldm_pdr *repo,
108 uint32_t record_handle,
109 uint8_t **data, uint32_t *size,
110 uint32_t *next_record_handle);
111
112/** @brief Get PDR record next to input PDR record
113 *
114 * @param[in] repo - opaque pointer acting as a PDR repo handle
115 * @param[in] curr_record - opaque pointer acting as a PDR record handle
116 * @param[in/out] data - will point to PDR record data (as per DSP0248) on
117 * return
118 * @param[out] size - *size will be size of PDR record
119 * @param[out] next_record_handle - *next_record_handle will be the record
120 * handle of record nect to the returned PDR record
121 *
122 * @return opaque pointer acting as PDR record handle, will be NULL if record
123 * was not found
124 */
125const pldm_pdr_record *
126pldm_pdr_get_next_record(const pldm_pdr *repo,
127 const pldm_pdr_record *curr_record, uint8_t **data,
128 uint32_t *size, uint32_t *next_record_handle);
129
130/** @brief Find (first) PDR record by PDR type
131 *
132 * @param[in] repo - opaque pointer acting as a PDR repo handle
133 * @param[in] pdr_type - PDR type number as per DSP0248
134 * @param[in] curr_record - opaque pointer acting as a PDR record handle; if
135 * not NULL, then search will begin from this record's next record
136 * @param[in/out] data - will point to PDR record data (as per DSP0248) on
137 * return, if input is not NULL
138 * @param[out] size - *size will be size of PDR record, if input is not NULL
139 *
140 * @return opaque pointer acting as PDR record handle, will be NULL if record
141 * was not found
142 */
143const pldm_pdr_record *
144pldm_pdr_find_record_by_type(const pldm_pdr *repo, uint8_t pdr_type,
145 const pldm_pdr_record *curr_record, uint8_t **data,
146 uint32_t *size);
147
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930148/** @brief Determine if a record is a remote record
149 *
150 * @pre record must point to a valid object
151 *
152 * @return true if the record is a remote record, false otherwise.
153 */
Andrew Jeffery9c766792022-08-10 23:12:49 +0930154bool pldm_pdr_record_is_remote(const pldm_pdr_record *record);
155
156/** @brief Remove all PDR records that belong to a remote terminus
157 *
158 * @param[in] repo - opaque pointer acting as a PDR repo handle
159 */
160void pldm_pdr_remove_remote_pdrs(pldm_pdr *repo);
161
162/** @brief Remove all remote PDR's that beling to a specific terminus
163 * handle
164 * @param[in] repo - opaque pointer acting as a PDR repo handle
165 * @param[in] terminus_handle - Terminus Handle of the remove PLDM terminus
166 */
167void pldm_pdr_remove_pdrs_by_terminus_handle(pldm_pdr *repo,
168 uint16_t terminus_handle);
169
170/** @brief Update the validity of TL PDR - the validity is decided based on
171 * whether the valid bit is set or not as per the spec DSP0248
172 *
173 * @param[in] repo - opaque pointer acting as a PDR repo handle
Andrew Jeffery6005f1c2023-04-05 20:02:52 +0930174 * @param[in] terminus_handle - PLDM terminus handle
Andrew Jeffery9c766792022-08-10 23:12:49 +0930175 * @param[in] tid - Terminus ID
Andrew Jeffery2a38ab52023-04-06 15:09:08 +0930176 * @param[in] tl_eid - MCTP endpoint EID
Andrew Jeffery9c766792022-08-10 23:12:49 +0930177 * @param[in] valid - validity bit of TLPDR
178 */
Andrew Jeffery6005f1c2023-04-05 20:02:52 +0930179/* NOLINTNEXTLINE(readability-identifier-naming) */
180void pldm_pdr_update_TL_pdr(const pldm_pdr *repo, uint16_t terminus_handle,
181 uint8_t tid, uint8_t tl_eid, bool valid);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930182
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500183/** @brief Find the last record within the particular range
184 * of record handles
185 *
186 * @param[in] repo - pointer acting as a PDR repo handle
187 * @param[in] first - first record handle value of the records in the range
188 * @param[in] last - last record handle value of the records in the range
189 *
190 * @return pointer to the PDR record,will be NULL if record was not
191 * found
192 */
193pldm_pdr_record *pldm_pdr_find_last_in_range(const pldm_pdr *repo,
194 uint32_t first, uint32_t last);
195
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500196/** @brief find the container ID of the contained entity which is not in the
197 * particular range of record handles given
198 *
199 * @param[in] repo - opaque pointer acting as a PDR repo handle
200 * @param[in] entity_type - entity type
201 * @param[in] entity_instance - instance of the entity
Pavithra Barithaya8cf70452023-06-22 04:36:19 -0500202 * @param[in] child_index - index of the child entity whose container id needs to be found
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500203 * @param[in] range_exclude_start_handle - first record handle in the range of the remote endpoint
Pavithra Barithaya8cf70452023-06-22 04:36:19 -0500204 * which is ignored
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500205 * @param[in] range_exclude_end_handle - last record handle in the range of the remote endpoint
Pavithra Barithaya8cf70452023-06-22 04:36:19 -0500206 * which is ignored
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500207 * @param[out] container_id - container id of the contained entity
208 *
Pavithra Barithaya8cf70452023-06-22 04:36:19 -0500209 * @return container id of the PDR record found on success,-EINVAL when repo is NULL
210 * or -ENOKEY if the container id is not found.
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500211 */
Pavithra Barithaya8cf70452023-06-22 04:36:19 -0500212int pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500213 const pldm_pdr *repo, uint16_t entity_type, uint16_t entity_instance,
Pavithra Barithaya8cf70452023-06-22 04:36:19 -0500214 uint8_t child_index, uint32_t range_exclude_start_handle,
215 uint32_t range_exclude_end_handle, uint16_t *container_id);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -0500216
Andrew Jeffery9c766792022-08-10 23:12:49 +0930217/* ======================= */
218/* FRU Record Set PDR APIs */
219/* ======================= */
220
221/** @brief Add a FRU record set PDR record to a PDR repository
222 *
223 * @param[in/out] repo - opaque pointer acting as a PDR repo handle
224 * @param[in] terminus_handle - PLDM terminus handle of terminus owning the PDR
225 * record
226 * @param[in] fru_rsi - FRU record set identifier
227 * @param[in] entity_type - entity type of FRU
228 * @param[in] entity_instance_num - entity instance number of FRU
229 * @param[in] container_id - container id of FRU
230 * @param[in] bmc_record_handle - handle used to construct the next record
231 *
232 * @return uint32_t - record handle assigned to PDR record
233 */
234uint32_t pldm_pdr_add_fru_record_set(pldm_pdr *repo, uint16_t terminus_handle,
235 uint16_t fru_rsi, uint16_t entity_type,
236 uint16_t entity_instance_num,
237 uint16_t container_id,
238 uint32_t bmc_record_handle);
239
240/** @brief Find a FRU record set PDR by FRU record set identifier
241 *
242 * @param[in] repo - opaque pointer acting as a PDR repo handle
243 * @param[in] fru_rsi - FRU record set identifier
244 * @param[in] terminus_handle - *terminus_handle will be FRU terminus handle of
245 * found PDR, or 0 if not found
246 * @param[in] entity_type - *entity_type will be FRU entity type of found PDR,
247 * or 0 if not found
248 * @param[in] entity_instance_num - *entity_instance_num will be FRU entity
249 * instance number of found PDR, or 0 if not found
250 * @param[in] container_id - *cintainer_id will be FRU container id of found
251 * PDR, or 0 if not found
252 *
Andrew Jefferyaf7a4d82023-06-30 13:46:32 +0930253 * @return An opaque pointer to the PDR record on success, or NULL on failure
Andrew Jeffery9c766792022-08-10 23:12:49 +0930254 */
255const pldm_pdr_record *pldm_pdr_fru_record_set_find_by_rsi(
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930256 const pldm_pdr *repo, uint16_t fru_rsi, uint16_t *terminus_handle,
257 uint16_t *entity_type, uint16_t *entity_instance_num,
258 uint16_t *container_id);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930259
260/* =========================== */
261/* Entity Association PDR APIs */
262/* =========================== */
263
264typedef struct pldm_entity {
265 uint16_t entity_type;
266 uint16_t entity_instance_num;
267 uint16_t entity_container_id;
268} __attribute__((packed)) pldm_entity;
269
270enum entity_association_containment_type {
271 PLDM_ENTITY_ASSOCIAION_PHYSICAL = 0x0,
272 PLDM_ENTITY_ASSOCIAION_LOGICAL = 0x1,
273};
274
275/** @struct pldm_entity_association_tree
276 * opaque structure that represents the entity association hierarchy
277 */
278typedef struct pldm_entity_association_tree pldm_entity_association_tree;
279
280/** @struct pldm_entity_node
281 * opaque structure that represents a node in the entity association hierarchy
282 */
283typedef struct pldm_entity_node pldm_entity_node;
284
285/** @brief Make a new entity association tree
286 *
287 * @return opaque pointer that acts as a handle to the tree; NULL if no
288 * tree could be created
289 */
Andrew Jeffery319304f2023-04-05 13:53:18 +0930290pldm_entity_association_tree *pldm_entity_association_tree_init(void);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930291
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500292/** @brief Add a local entity into the entity association tree
Andrew Jeffery9c766792022-08-10 23:12:49 +0930293 *
294 * @param[in/out] tree - opaque pointer acting as a handle to the tree
295 * @param[in/out] entity - pointer to the entity to be added. Input has the
296 * entity type. On output, instance number and the
297 * container id are populated.
298 * @param[in] entity_instance_number - entity instance number, we can use the
299 * entity instance number of the entity by
300 * default if its value is equal 0xFFFF.
301 * @param[in] parent - pointer to the node that should be the parent of input
302 * entity. If this is NULL, then the entity is the root
303 * @param[in] association_type - relation with the parent : logical or physical
304 *
305 * @return pldm_entity_node* - opaque pointer to added entity
306 */
307pldm_entity_node *pldm_entity_association_tree_add(
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930308 pldm_entity_association_tree *tree, pldm_entity *entity,
309 uint16_t entity_instance_number, pldm_entity_node *parent,
310 uint8_t association_type);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930311
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500312/** @brief Add an entity into the entity association tree based on remote field
313 * set or unset.
314 *
315 * @param[in/out] tree - opaque pointer acting as a handle to the tree
316 * @param[in/out] entity - pointer to the entity to be added. Input has the
317 * entity type. On output, instance number and the
318 * container id are populated.
319 * @param[in] entity_instance_number - entity instance number, we can use the
320 * entity instance number of the entity by
321 * default if its value is equal 0xFFFF.
322 * @param[in] parent - pointer to the node that should be the parent of input
323 * entity. If this is NULL, then the entity is the root
324 * @param[in] association_type - relation with the parent : logical or physical
325 * @param[in] is_remote - used to denote whether we are adding a BMC entity to
326 * the tree or a host entity
327 * @param[in] is_update_contanier_id - Used to determine whether need to update
328 * contanier id.
329 * true: should be changed
330 * false: should not be changed
331 * @param[in] container_id - container id of the entity added.
332 *
333 * @return pldm_entity_node* - opaque pointer to added entity
334 */
335pldm_entity_node *pldm_entity_association_tree_add_entity(
336 pldm_entity_association_tree *tree, pldm_entity *entity,
337 uint16_t entity_instance_number, pldm_entity_node *parent,
338 uint8_t association_type, bool is_remote, bool is_update_container_id,
339 uint16_t container_id);
340
Andrew Jeffery9c766792022-08-10 23:12:49 +0930341/** @brief Visit and note each entity in the entity association tree
342 *
Andrew Jeffery8e9b0de2023-06-30 14:05:04 +0930343 * @pre `*entities == NULL` and `*size == 0` must hold at the time of invocation.
344 *
345 * Callers must inspect the values of `*entities` and `*size` post-invocation to determine if the
346 * invocation was a success or failure.
347 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930348 * @param[in] tree - opaque pointer acting as a handle to the tree
349 * @param[out] entities - pointer to list of pldm_entity's. To be free()'d by
350 * the caller
351 * @param[out] size - number of pldm_entity's
352 */
353void pldm_entity_association_tree_visit(pldm_entity_association_tree *tree,
354 pldm_entity **entities, size_t *size);
355
356/** @brief Extract pldm entity by the pldm_entity_node
357 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930358 * @pre node must point to a valid object
359 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930360 * @param[in] node - opaque pointer to added entity
361 *
362 * @return pldm_entity - pldm entity
363 */
364pldm_entity pldm_entity_extract(pldm_entity_node *node);
365
ArchanaKakani39bd2ea2023-02-02 02:39:18 -0600366/** @brief Extract remote container id from the pldm_entity_node
367 *
Andrew Jeffery15b88182023-06-30 13:29:17 +0930368 * @pre entity must point to a valid object
ArchanaKakani39bd2ea2023-02-02 02:39:18 -0600369 *
Andrew Jeffery15b88182023-06-30 13:29:17 +0930370 * @param[in] entity - pointer to existing entity
371 *
372 * @return The remote container id
ArchanaKakani39bd2ea2023-02-02 02:39:18 -0600373 */
Andrew Jeffery15b88182023-06-30 13:29:17 +0930374uint16_t
375pldm_entity_node_get_remote_container_id(const pldm_entity_node *entity);
ArchanaKakani39bd2ea2023-02-02 02:39:18 -0600376
Andrew Jeffery9c766792022-08-10 23:12:49 +0930377/** @brief Destroy entity association tree
378 *
379 * @param[in] tree - opaque pointer acting as a handle to the tree
380 */
381void pldm_entity_association_tree_destroy(pldm_entity_association_tree *tree);
382
383/** @brief Check if input enity node is a parent
384 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930385 * @pre node must point to a valid object
386 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930387 * @param[in] node - opaque pointer acting as a handle to an entity node
388 *
389 * @return bool true if node is a parent, false otherwise
390 */
391bool pldm_entity_is_node_parent(pldm_entity_node *node);
392
393/** @brief Get parent of entity
394 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930395 * @pre node must point to a valid object
396 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930397 * @param[in] node - opaque pointer acting as a handle to an entity node
398 *
399 * @return pldm_entity - pldm entity
400 */
401pldm_entity pldm_entity_get_parent(pldm_entity_node *node);
402
403/** @brief Check the current pldm entity is exist parent
404 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930405 * @pre node must point to a valid object
406 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930407 * @param[in] node - opaque pointer acting as a handle to an entity node
408 *
409 * @return bool true if exist parent, false otherwise
410 */
411bool pldm_entity_is_exist_parent(pldm_entity_node *node);
412
413/** @brief Convert entity association tree to PDR
414 *
Andrew Jefferyc7883482023-06-30 15:52:04 +0930415 * No conversion takes place if one or both of tree or repo are NULL.
416 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930417 * @param[in] tree - opaque pointer to entity association tree
418 * @param[in] repo - PDR repo where entity association records should be added
419 * @param[in] is_remote - if true, then the PDR is not from this terminus
420 * @param[in] terminus_handle - terminus handle of the terminus
421 */
422void pldm_entity_association_pdr_add(pldm_entity_association_tree *tree,
423 pldm_pdr *repo, bool is_remote,
424 uint16_t terminus_handle);
425/** @brief Add entity association pdr from node
426 *
427 * @param[in] node - opaque pointer acting as a handle to an entity node
428 * @param[in] repo - PDR repo where entity association records should be added
429 * @param[in] is_remote - if true, then the PDR is not from this terminus
430 * @param[in] terminus_handle - terminus handle of the terminus
431 */
432void pldm_entity_association_pdr_add_from_node(
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930433 pldm_entity_node *node, pldm_pdr *repo, pldm_entity **entities,
434 size_t num_entities, bool is_remote, uint16_t terminus_handle);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930435
Pavithra Barithaya25ddbcc2023-05-19 08:28:59 -0500436/** @brief Add entity association pdr record based on record handle
437 * earlier the records where added in a sequential way alone, with
438 * this change the entity association PDR records gets the new record
439 * handle based on the input value given.
440 *
441 * @param[in] node - opaque pointer acting as a handle to an entity node
442 * @param[in] repo - PDR repo where entity association records should be added
443 * @param[in] is_remote - if true, then the PDR is not from this terminus
444 * @param[in] terminus_handle - terminus handle of the terminus
445 * @param[in] record_handle - record handle of the PDR
446 *
447 * @return 0 on succes, -EINVAL if the provided arguments are invalid.
448 */
449int pldm_entity_association_pdr_add_from_node_with_record_handle(
450 pldm_entity_node *node, pldm_pdr *repo, pldm_entity **entities,
451 size_t num_entities, bool is_remote, uint16_t terminus_handle,
452 uint32_t record_handle);
453
Andrew Jeffery9c766792022-08-10 23:12:49 +0930454/** @brief Find entity reference in tree
455 *
456 * @param[in] tree - opaque pointer to entity association tree
457 * @param[in] entity - PLDM entity
458 * @param[in] node - node to the entity
459 */
460void pldm_find_entity_ref_in_tree(pldm_entity_association_tree *tree,
461 pldm_entity entity, pldm_entity_node **node);
462
463/** @brief Get number of children of entity
464 *
465 * @param[in] node - opaque pointer acting as a handle to an entity node
466 * @param[in] association_type - relation type filter : logical or physical
467 *
Andrew Jeffery6e8a2612023-06-30 15:36:48 +0930468 * @return uint8_t number of children. The returned value is zero if node is NULL or
469 * association_type is not one of PLDM_ENTITY_ASSOCIAION_PHYSICAL or
470 * PLDM_ENTITY_ASSOCIAION_LOGICAL.
Andrew Jeffery9c766792022-08-10 23:12:49 +0930471 */
472uint8_t pldm_entity_get_num_children(pldm_entity_node *node,
473 uint8_t association_type);
474
475/** @brief Verify that the current node is a child of the current parent
476 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930477 * @pre parent must point to a valid object
478 * @pre node must point to a valid object
479 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930480 * @param[in] parent - opaque pointer acting as a handle to an entity parent
481 * @param[in] node - pointer to the node of the pldm entity
Andrew Jeffery375d9fc2023-06-30 15:45:54 +0930482 *
483 * @return True if the node is a child of parent, false otherwise, including if one or both of
484 * parent or node are NULL.
Andrew Jeffery9c766792022-08-10 23:12:49 +0930485 */
486bool pldm_is_current_parent_child(pldm_entity_node *parent, pldm_entity *node);
487
488/** @brief Find an entity in the entity association tree
489 *
490 * @param[in] tree - pointer to entity association tree
491 * @param[in/out] entity - entity type and instance id set on input, container
492 * id set on output
Andrew Jeffery9c766792022-08-10 23:12:49 +0930493 * @return pldm_entity_node* pointer to entity if found, NULL otherwise
494 */
495pldm_entity_node *
496pldm_entity_association_tree_find(pldm_entity_association_tree *tree,
497 pldm_entity *entity);
498
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500499/** @brief Find an entity in the entity association tree if remote
500 *
501 * @param[in] tree - pointer to entity association tree
502 * @param[in/out] entity - entity type and instance id set on input, container
503 * id set on output
504 * @param[in] is_remote - variable to denote whether we are finding a host
505 * entity or a BMC entity
506 *
507 * @return pldm_entity_node* pointer to entity if found, NULL otherwise
508 */
509pldm_entity_node *
510pldm_entity_association_tree_find_if_remote(pldm_entity_association_tree *tree,
511 pldm_entity *entity,
512 bool is_remote);
513
Andrew Jeffery9c766792022-08-10 23:12:49 +0930514/** @brief Create a copy of an existing entity association tree
515 *
516 * @param[in] org_tree - pointer to source tree
517 * @param[in/out] new_tree - pointer to destination tree
518 */
519void pldm_entity_association_tree_copy_root(
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930520 pldm_entity_association_tree *org_tree,
521 pldm_entity_association_tree *new_tree);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930522
523/** @brief Destroy all the nodes of the entity association tree
524 *
525 * @param[in] tree - pointer to entity association tree
526 */
527void pldm_entity_association_tree_destroy_root(
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930528 pldm_entity_association_tree *tree);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930529
530/** @brief Check whether the entity association tree is empty
531 *
Andrew Jeffery5565fcd2023-06-30 13:21:32 +0930532 * @pre tree must point to a valid object
533 *
Andrew Jeffery9c766792022-08-10 23:12:49 +0930534 * @param[in] tree - pointer to entity association tree
535 * @return bool, true if tree is empty
536 */
537bool pldm_is_empty_entity_assoc_tree(pldm_entity_association_tree *tree);
538
539/** @brief Extract entities from entity association PDR
540 *
541 * @param[in] pdr - entity association PDR
542 * @param[in] pdr_len - size of entity association PDR in bytes
543 * @param[out] num_entities - number of entities found, including the container
544 * @param[out] entities - extracted entities, container is *entities[0]. Caller
545 * must free *entities
546 */
547void pldm_entity_association_pdr_extract(const uint8_t *pdr, uint16_t pdr_len,
548 size_t *num_entities,
549 pldm_entity **entities);
550
551#ifdef __cplusplus
552}
553#endif
554
555#endif /* PDR_H */