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