1*691668feSPatrick 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> 5cc45aed7SAndrew Jeffery #include <libpldm/requester/pldm.h> 6cc45aed7SAndrew Jeffery 7cc45aed7SAndrew Jeffery #include <stdbool.h> 8cc45aed7SAndrew Jeffery 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 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 * 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