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