xref: /openbmc/libpldm/src/responder.c (revision d12dd36e)
1691668feSPatrick Williams /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2cc45aed7SAndrew Jeffery #include "responder.h"
3cc45aed7SAndrew Jeffery 
4cc45aed7SAndrew Jeffery #include <libpldm/base.h>
5*d12dd36eSAndrew Jeffery #include <libpldm/pldm.h>
6cc45aed7SAndrew Jeffery 
7cc45aed7SAndrew Jeffery #include <stdbool.h>
8cc45aed7SAndrew Jeffery 
pldm_responder_cookie_eq(const struct pldm_responder_cookie * left,const struct pldm_responder_cookie * right)9cc45aed7SAndrew Jeffery static bool pldm_responder_cookie_eq(const struct pldm_responder_cookie *left,
10cc45aed7SAndrew Jeffery 				     const struct pldm_responder_cookie *right)
11cc45aed7SAndrew Jeffery {
12cc45aed7SAndrew Jeffery 	return left->tid == right->tid &&
13cc45aed7SAndrew Jeffery 	       left->instance_id == right->instance_id &&
14cc45aed7SAndrew Jeffery 	       left->type == right->type && left->command == right->command;
15cc45aed7SAndrew Jeffery }
16cc45aed7SAndrew Jeffery 
pldm_responder_cookie_track(struct pldm_responder_cookie * jar,struct pldm_responder_cookie * cookie)17cc45aed7SAndrew Jeffery int pldm_responder_cookie_track(struct pldm_responder_cookie *jar,
18cc45aed7SAndrew Jeffery 				struct pldm_responder_cookie *cookie)
19cc45aed7SAndrew Jeffery {
20cc45aed7SAndrew Jeffery 	struct pldm_responder_cookie *current;
21cc45aed7SAndrew Jeffery 	struct pldm_responder_cookie *next;
22cc45aed7SAndrew Jeffery 
23cc45aed7SAndrew Jeffery 	if (!jar || !cookie) {
24cc45aed7SAndrew Jeffery 		return PLDM_REQUESTER_INVALID_SETUP;
25cc45aed7SAndrew Jeffery 	}
26cc45aed7SAndrew Jeffery 
27cc45aed7SAndrew Jeffery 	current = jar;
28cc45aed7SAndrew Jeffery 	next = current->next;
29cc45aed7SAndrew Jeffery 	while (next) {
30cc45aed7SAndrew Jeffery 		/* Cookie must not already be known */
31cc45aed7SAndrew Jeffery 		if (pldm_responder_cookie_eq(next, cookie)) {
32cc45aed7SAndrew Jeffery 			return PLDM_REQUESTER_INVALID_SETUP;
33cc45aed7SAndrew Jeffery 		}
34cc45aed7SAndrew Jeffery 		current = next;
35cc45aed7SAndrew Jeffery 		next = next->next;
36cc45aed7SAndrew Jeffery 	}
37cc45aed7SAndrew Jeffery 
38cc45aed7SAndrew Jeffery 	cookie->next = NULL;
39cc45aed7SAndrew Jeffery 	current->next = cookie;
40cc45aed7SAndrew Jeffery 
41cc45aed7SAndrew Jeffery 	return PLDM_REQUESTER_SUCCESS;
42cc45aed7SAndrew Jeffery }
43cc45aed7SAndrew Jeffery 
44cc45aed7SAndrew Jeffery struct pldm_responder_cookie *
pldm_responder_cookie_untrack(struct pldm_responder_cookie * jar,pldm_tid_t tid,pldm_instance_id_t instance_id,uint8_t type,uint8_t command)45cc45aed7SAndrew Jeffery pldm_responder_cookie_untrack(struct pldm_responder_cookie *jar, pldm_tid_t tid,
46cc45aed7SAndrew Jeffery 			      pldm_instance_id_t instance_id, uint8_t type,
47cc45aed7SAndrew Jeffery 			      uint8_t command)
48cc45aed7SAndrew Jeffery {
49cc45aed7SAndrew Jeffery 	const struct pldm_responder_cookie cookie = { tid, instance_id, type,
50cc45aed7SAndrew Jeffery 						      command, NULL };
51cc45aed7SAndrew Jeffery 	struct pldm_responder_cookie *current;
52cc45aed7SAndrew Jeffery 	struct pldm_responder_cookie *next;
53cc45aed7SAndrew Jeffery 
54cc45aed7SAndrew Jeffery 	if (!jar) {
55cc45aed7SAndrew Jeffery 		return NULL;
56cc45aed7SAndrew Jeffery 	}
57cc45aed7SAndrew Jeffery 
58cc45aed7SAndrew Jeffery 	current = jar;
59cc45aed7SAndrew Jeffery 	next = current->next;
60cc45aed7SAndrew Jeffery 	while (next && !pldm_responder_cookie_eq(next, &cookie)) {
61cc45aed7SAndrew Jeffery 		current = next;
62cc45aed7SAndrew Jeffery 		next = next->next;
63cc45aed7SAndrew Jeffery 	}
64cc45aed7SAndrew Jeffery 
65cc45aed7SAndrew Jeffery 	if (next) {
66cc45aed7SAndrew Jeffery 		current->next = next->next;
67cc45aed7SAndrew Jeffery 	}
68cc45aed7SAndrew Jeffery 
69cc45aed7SAndrew Jeffery 	return next;
70cc45aed7SAndrew Jeffery }
71