Message ID | 20220518074304.42497-3-abhishek@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | Implement PLDM self test | expand |
Le 18/05/2022 à 09:42, Abhishek Singh Tomar a écrit : > The patch contains a self-test implementation for > PLDM_OEM type message support that is used for > inband file I/O. > > This patch tests code flow for the PLDM command > PLDM_GET_FILE_TABLE that is used to retrieve the > file table which contains the list of lid files > available and their attributes. > > Signed-off-by: Abhishek Singh Tomar<abhishek@linux.ibm.com> > --- > core/pldm/pldm.h | 2 +- > core/pldm/test/Makefile.check | 43 ++++++++ > core/pldm/test/test-pldm-fileio.c | 174 ++++++++++++++++++++++++++++++ > 3 files changed, 218 insertions(+), 1 deletion(-) > create mode 100644 core/pldm/test/Makefile.check > create mode 100644 core/pldm/test/test-pldm-fileio.c > > diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h > index 81df9f8b..5ac9c443 100644 > --- a/core/pldm/pldm.h > +++ b/core/pldm/pldm.h > @@ -45,7 +45,7 @@ extern int watchdog_period_sec; > * @example enum_bit(1) = 0x00000002 > * @example enum_bit(4) = 0x00000010 > */ > -inline uint32_t enum_bit(unsigned int enumeration) > +extern inline uint32_t enum_bit(unsigned int enumeration) > { > return 1 << enumeration; > } > diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check > new file mode 100644 > index 00000000..7af66ccf > --- /dev/null > +++ b/core/pldm/test/Makefile.check > @@ -0,0 +1,43 @@ > +# -*-Makefile-*- > +PLDM_TEST := core/pldm/test/test-pldm-fileio \ > + > +LCOV_EXCLUDE += $(PLDM_TEST:%=%.c) > + > +.PHONY : core-pldm-check core-pldm-coverage > +core-pldm-check: $(PLDM_TEST:%=%-check) > +core-pldm-coverage: $(PLDM_TEST:%=%-gcov-run) > +HOSTCFLAG_PLDM:= $(filter-out -Wdeclaration-after-statement,$(HOSTCFLAGS)) > +HOSTCFLAG_PLDM:= $(filter-out -Wstrict-prototypes,$(HOSTCFLAG_PLDM)) > +HOSTCFLAG_PLDM:= $(filter-out -Wjump-misses-init,$(HOSTCFLAG_PLDM)) > +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-prototypes,$(HOSTCFLAG_PLDM)) > +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-declarations,$(HOSTCFLAG_PLDM)) > +HOSTCFLAG_PLDM += -Wno-format > + > +check: core-pldm-check > +coverage: core-pldm-coverage > + > +$(PLDM_TEST:%=%-gcov-run) : %-run: % > + $(call Q, TEST-COVERAGE ,$< , $<) > + > +$(PLDM_TEST:%=%-check) : %-check: % > + $(call Q, RUN-TEST ,$(VALGRIND) $<, $<) > + > +core/test/stubs.o: core/test/stubs.c > + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) -I . -I include -Wno-error=attributes -g -c -o core/test/stubs.o core/test/stubs.c, $<) > + > +$(PLDM_TEST) : % : %.c core/test/stubs.o > + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAG_PLDM) -O0 -g -I include -I . -I pldm/libpldm/ -I libfdt -o $@ $< core/test/stubs.o -g, $<) > + > +$(PLDM_TEST:%=%-gcov): %-gcov : %.c % > + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTFLAG_PLDM) $(HOSTGCOVCFLAGS) -I include -I . -I pldm/libpldm/ -I libfdt -lgcov -o $@ $<, $<) > + > +$(PLDM_TEST:%=%-gcov): % : $(%.d:-gcov=) > + > +-include $(wildcard core/pldm/test/*.d) > + > +clean: pldm-test-clean > + > +pldm-test-clean: > + $(RM) -f core/pldm/test/*.[od] $(PLDM_TEST) $(PLDM_TEST:%=%-gcov) > + $(RM) -f *.gcda *.gcno skiboot.info > + $(RM) -rf coverage-report > diff --git a/core/pldm/test/test-pldm-fileio.c b/core/pldm/test/test-pldm-fileio.c > new file mode 100644 > index 00000000..e14f6df7 > --- /dev/null > +++ b/core/pldm/test/test-pldm-fileio.c > @@ -0,0 +1,174 @@ > +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later > +// Copyright 2022 IBM Corp. > + > + > +#include "common/test-pldm-common.c" > +#define TEST_FILE_IO_NAME "81e0066b.lid" > +#define TEST_FILE_IO_HANDLE 11 > +#define TEST_FILE_IO_LENGTH 50 > +#define TEST_FILE_IO_BUF1 "This is Test buffer Open power Foundation" > + > +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size); Not necessary to declare this function here. > +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, > + void **response_msg, size_t *response_len); > + > +int pldm_test_reply_request(void *request_msg, size_t request_len, > + void **response_msg, size_t *response_len); > + > + > +/* > + * This function duplicates BMC functionality for Pldm self test > + * It will handle pldm response message > + * For now we don't have any response > + */ > +int pldm_test_verify_response(void *response_msg, size_t response_len) > +{ > + if (response_len > 0 || response_msg != NULL) > + return OPAL_PARAMETER; > + > + return OPAL_PARAMETER; > + > +} Nothing happens in this function. A generic function could do the job. > + > +/* > + * This function duplicates BMC functionality for Pldm self test > + * This Genrate Filetable entry for self test > + * The file table contains the list of files available and > + * their attributes. > + * > + * Ex: > + * { > + * "FileHandle": "11", > + * "FileNameLength": 12, > + * "FileName": "81e0066b.lid", > + * "FileSize": 589824, > + * "FileTraits": 6 > + * } > + */ > +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size) > +{ > + struct pldm_file_attr_table_entry *pldm_file_attr_table_entry; > + uint8_t FileName[] = TEST_FILE_IO_NAME; > + uint32_t file_length = TEST_FILE_IO_LENGTH; > + > + /* calculate sizeof whole struct */ > + *size = sizeof(struct pldm_file_attr_table_entry *) + strlen(FileName) > + + sizeof(file_length) - 1; > + *file_attr_table = malloc(*size); > + if (*file_attr_table == NULL) > + return OPAL_RESOURCE; > + > + pldm_file_attr_table_entry = (struct pldm_file_attr_table_entry *)*file_attr_table; > + pldm_file_attr_table_entry->file_handle = TEST_FILE_IO_HANDLE; > + pldm_file_attr_table_entry->file_name_length = strlen(FileName); > + memcpy(pldm_file_attr_table_entry->file_attr_table_nst, FileName, > + strlen(FileName)); > + > + memcpy(pldm_file_attr_table_entry->file_attr_table_nst + strlen(FileName), > + (uint8_t *)&file_length, sizeof(file_length)); > + > + return OPAL_SUCCESS; > +} > + > +/* > + * This function duplicates BMC functionality for Pldm self test > + * It will only handle PLDM_OEM type request > + * As fileio test will have only pldm request of type = PLDM_OEM > + */ > +int pldm_test_reply_request(void *request_msg, size_t request_len, > + void **response_msg, size_t *response_len) > +{ > + > + switch (((struct pldm_msg *)request_msg)->hdr.type) { > + case PLDM_OEM: > + return pldm_test_reply_request_file_io(request_msg, request_len, > + response_msg, response_len); > + default: > + printf("PLDM_TEST : hdr type %d not expected\n", > + ((struct pldm_msg *)request_msg)->hdr.type); > + return OPAL_PARAMETER; > + } > + > + > +} > + > + > +/* > + * This function duplicates BMC functionality for Pldm self test > + * it tries to handle PLDM_REQUEST for fileio and reply with appropriate PLDM_RESPONSE > + * message > + */ > +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, > + void **response_msg, size_t *response_len) > +{ > + int rc; > + int payload_len = 0; > + uint32_t transfer_handle; > + uint8_t transfer_opflag; > + uint8_t table_type; > + uint8_t *file_attr_table; > + uint32_t table_size; > + > + > + /* check command received and reply with appropriate pldm response message */ > + switch (((struct pldm_msg *)request_msg)->hdr.command) { > + case PLDM_GET_FILE_TABLE: > + > + payload_len = request_len - sizeof(struct pldm_msg_hdr); > + > + rc = decode_get_file_table_req(request_msg, payload_len, &transfer_handle, > + &transfer_opflag, &table_type); > + if (rc != PLDM_SUCCESS) > + return OPAL_PARAMETER; > + > + /* Get Filetable entry for self test */ > + rc = get_test_filetable_entry(&file_attr_table, &table_size); > + if (rc != OPAL_SUCCESS) > + return OPAL_PARAMETER; > + > + *response_len = sizeof(struct pldm_msg_hdr) > + + sizeof(struct pldm_get_file_table_resp) > + + table_size - 1; > + *response_msg = malloc(*response_len); > + if (*response_msg == NULL) > + return OPAL_RESOURCE; > + > + > + rc = encode_get_file_table_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, > + PLDM_SUCCESS, PLDM_GET_NEXTPART, PLDM_START_AND_END, > + file_attr_table, table_size, *response_msg); > + if (rc != PLDM_SUCCESS) > + return OPAL_PARAMETER; > + > + free(file_attr_table); > + > + break; > + > + default: > + return OPAL_PARAMETER; > + > + } > + > + return OPAL_SUCCESS; > + > + > + > +} > + > + > +int main(void) > +{ > + size_t rc; > + > + > + /* Init PLDM File IO */ > + rc = pldm_file_io_init(); > + if (rc != OPAL_SUCCESS) { > + printf("PLDM_TEST : pldm_file_io_init failed"); > + return rc; > + } > + > + return OPAL_SUCCESS; > +} > + > +
On Mon, May 23, 2022 at 03:47:39PM +0200, Christophe Lombard wrote: > > Le 18/05/2022 à 09:42, Abhishek Singh Tomar a écrit : > > The patch contains a self-test implementation for > > PLDM_OEM type message support that is used for > > inband file I/O. > > > > This patch tests code flow for the PLDM command > > PLDM_GET_FILE_TABLE that is used to retrieve the > > file table which contains the list of lid files > > available and their attributes. > > > > Signed-off-by: Abhishek Singh Tomar<abhishek@linux.ibm.com> > > --- > > core/pldm/pldm.h | 2 +- > > core/pldm/test/Makefile.check | 43 ++++++++ > > core/pldm/test/test-pldm-fileio.c | 174 ++++++++++++++++++++++++++++++ > > 3 files changed, 218 insertions(+), 1 deletion(-) > > create mode 100644 core/pldm/test/Makefile.check > > create mode 100644 core/pldm/test/test-pldm-fileio.c > > > > diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h > > index 81df9f8b..5ac9c443 100644 > > --- a/core/pldm/pldm.h > > +++ b/core/pldm/pldm.h > > @@ -45,7 +45,7 @@ extern int watchdog_period_sec; > > * @example enum_bit(1) = 0x00000002 > > * @example enum_bit(4) = 0x00000010 > > */ > > -inline uint32_t enum_bit(unsigned int enumeration) > > +extern inline uint32_t enum_bit(unsigned int enumeration) > > { > > return 1 << enumeration; > > } > > diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check > > new file mode 100644 > > index 00000000..7af66ccf > > --- /dev/null > > +++ b/core/pldm/test/Makefile.check > > @@ -0,0 +1,43 @@ > > +# -*-Makefile-*- > > +PLDM_TEST := core/pldm/test/test-pldm-fileio \ > > + > > +LCOV_EXCLUDE += $(PLDM_TEST:%=%.c) > > + > > +.PHONY : core-pldm-check core-pldm-coverage > > +core-pldm-check: $(PLDM_TEST:%=%-check) > > +core-pldm-coverage: $(PLDM_TEST:%=%-gcov-run) > > +HOSTCFLAG_PLDM:= $(filter-out -Wdeclaration-after-statement,$(HOSTCFLAGS)) > > +HOSTCFLAG_PLDM:= $(filter-out -Wstrict-prototypes,$(HOSTCFLAG_PLDM)) > > +HOSTCFLAG_PLDM:= $(filter-out -Wjump-misses-init,$(HOSTCFLAG_PLDM)) > > +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-prototypes,$(HOSTCFLAG_PLDM)) > > +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-declarations,$(HOSTCFLAG_PLDM)) > > +HOSTCFLAG_PLDM += -Wno-format > > + > > +check: core-pldm-check > > +coverage: core-pldm-coverage > > + > > +$(PLDM_TEST:%=%-gcov-run) : %-run: % > > + $(call Q, TEST-COVERAGE ,$< , $<) > > + > > +$(PLDM_TEST:%=%-check) : %-check: % > > + $(call Q, RUN-TEST ,$(VALGRIND) $<, $<) > > + > > +core/test/stubs.o: core/test/stubs.c > > + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) -I . -I include -Wno-error=attributes -g -c -o core/test/stubs.o core/test/stubs.c, $<) > > + > > +$(PLDM_TEST) : % : %.c core/test/stubs.o > > + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAG_PLDM) -O0 -g -I include -I . -I pldm/libpldm/ -I libfdt -o $@ $< core/test/stubs.o -g, $<) > > + > > +$(PLDM_TEST:%=%-gcov): %-gcov : %.c % > > + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTFLAG_PLDM) $(HOSTGCOVCFLAGS) -I include -I . -I pldm/libpldm/ -I libfdt -lgcov -o $@ $<, $<) > > + > > +$(PLDM_TEST:%=%-gcov): % : $(%.d:-gcov=) > > + > > +-include $(wildcard core/pldm/test/*.d) > > + > > +clean: pldm-test-clean > > + > > +pldm-test-clean: > > + $(RM) -f core/pldm/test/*.[od] $(PLDM_TEST) $(PLDM_TEST:%=%-gcov) > > + $(RM) -f *.gcda *.gcno skiboot.info > > + $(RM) -rf coverage-report > > diff --git a/core/pldm/test/test-pldm-fileio.c b/core/pldm/test/test-pldm-fileio.c > > new file mode 100644 > > index 00000000..e14f6df7 > > --- /dev/null > > +++ b/core/pldm/test/test-pldm-fileio.c > > @@ -0,0 +1,174 @@ > > +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later > > +// Copyright 2022 IBM Corp. > > + > > + > > +#include "common/test-pldm-common.c" > > +#define TEST_FILE_IO_NAME "81e0066b.lid" > > +#define TEST_FILE_IO_HANDLE 11 > > +#define TEST_FILE_IO_LENGTH 50 > > +#define TEST_FILE_IO_BUF1 "This is Test buffer Open power Foundation" > > + > > +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size); > > Not necessary to declare this function here. > Yup > > +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, > > + void **response_msg, size_t *response_len); > > + > > +int pldm_test_reply_request(void *request_msg, size_t request_len, > > + void **response_msg, size_t *response_len); > > + > > + > > +/* > > + * This function duplicates BMC functionality for Pldm self test > > + * It will handle pldm response message > > + * For now we don't have any response > > + */ > > +int pldm_test_verify_response(void *response_msg, size_t response_len) > > +{ > > + if (response_len > 0 || response_msg != NULL) > > + return OPAL_PARAMETER; > > + > > + return OPAL_PARAMETER; > > + > > +} > > Nothing happens in this function. A generic function could > do the job. > This function is added so that this testcase can also use test-pldm-common. else it will give compilation error. Here test-pldm-common.c provide generic flow for all testfile. so we need to provide defination of all functions which are called there. We use test-pldm-common.c so that we can reuse code and in case of any change in future we need not to do same changes in all file. The code written in function pldm_test_verify_response() is just to avoid error due to unused variable and reply error if this function is called as we don't expect any response from skiboot in fileio for now. > > + > > +/* > > + * This function duplicates BMC functionality for Pldm self test > > + * This Genrate Filetable entry for self test > > + * The file table contains the list of files available and > > + * their attributes. > > + * > > + * Ex: > > + * { > > + * "FileHandle": "11", > > + * "FileNameLength": 12, > > + * "FileName": "81e0066b.lid", > > + * "FileSize": 589824, > > + * "FileTraits": 6 > > + * } > > + */ > > +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size) > > +{ > > + struct pldm_file_attr_table_entry *pldm_file_attr_table_entry; > > + uint8_t FileName[] = TEST_FILE_IO_NAME; > > + uint32_t file_length = TEST_FILE_IO_LENGTH; > > + > > + /* calculate sizeof whole struct */ > > + *size = sizeof(struct pldm_file_attr_table_entry *) + strlen(FileName) > > + + sizeof(file_length) - 1; > > + *file_attr_table = malloc(*size); > > + if (*file_attr_table == NULL) > > + return OPAL_RESOURCE; > > + > > + pldm_file_attr_table_entry = (struct pldm_file_attr_table_entry *)*file_attr_table; > > + pldm_file_attr_table_entry->file_handle = TEST_FILE_IO_HANDLE; > > + pldm_file_attr_table_entry->file_name_length = strlen(FileName); > > + memcpy(pldm_file_attr_table_entry->file_attr_table_nst, FileName, > > + strlen(FileName)); > > + > > + memcpy(pldm_file_attr_table_entry->file_attr_table_nst + strlen(FileName), > > + (uint8_t *)&file_length, sizeof(file_length)); > > + > > + return OPAL_SUCCESS; > > +} > > + > > +/* > > + * This function duplicates BMC functionality for Pldm self test > > + * It will only handle PLDM_OEM type request > > + * As fileio test will have only pldm request of type = PLDM_OEM > > + */ > > +int pldm_test_reply_request(void *request_msg, size_t request_len, > > + void **response_msg, size_t *response_len) > > +{ > > + > > + switch (((struct pldm_msg *)request_msg)->hdr.type) { > > + case PLDM_OEM: > > + return pldm_test_reply_request_file_io(request_msg, request_len, > > + response_msg, response_len); > > + default: > > + printf("PLDM_TEST : hdr type %d not expected\n", > > + ((struct pldm_msg *)request_msg)->hdr.type); > > + return OPAL_PARAMETER; > > + } > > + > > + > > +} > > + > > + > > +/* > > + * This function duplicates BMC functionality for Pldm self test > > + * it tries to handle PLDM_REQUEST for fileio and reply with appropriate PLDM_RESPONSE > > + * message > > + */ > > +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, > > + void **response_msg, size_t *response_len) > > +{ > > + int rc; > > + int payload_len = 0; > > + uint32_t transfer_handle; > > + uint8_t transfer_opflag; > > + uint8_t table_type; > > + uint8_t *file_attr_table; > > + uint32_t table_size; > > + > > + > > + /* check command received and reply with appropriate pldm response message */ > > + switch (((struct pldm_msg *)request_msg)->hdr.command) { > > + case PLDM_GET_FILE_TABLE: > > + > > + payload_len = request_len - sizeof(struct pldm_msg_hdr); > > + > > + rc = decode_get_file_table_req(request_msg, payload_len, &transfer_handle, > > + &transfer_opflag, &table_type); > > + if (rc != PLDM_SUCCESS) > > + return OPAL_PARAMETER; > > + > > + /* Get Filetable entry for self test */ > > + rc = get_test_filetable_entry(&file_attr_table, &table_size); > > + if (rc != OPAL_SUCCESS) > > + return OPAL_PARAMETER; > > + > > + *response_len = sizeof(struct pldm_msg_hdr) > > + + sizeof(struct pldm_get_file_table_resp) > > + + table_size - 1; > > + *response_msg = malloc(*response_len); > > + if (*response_msg == NULL) > > + return OPAL_RESOURCE; > > + > > + > > + rc = encode_get_file_table_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, > > + PLDM_SUCCESS, PLDM_GET_NEXTPART, PLDM_START_AND_END, > > + file_attr_table, table_size, *response_msg); > > + if (rc != PLDM_SUCCESS) > > + return OPAL_PARAMETER; > > + > > + free(file_attr_table); > > + > > + break; > > + > > + default: > > + return OPAL_PARAMETER; > > + > > + } > > + > > + return OPAL_SUCCESS; > > + > > + > > + > > +} > > + > > + > > +int main(void) > > +{ > > + size_t rc; > > + > > + > > + /* Init PLDM File IO */ > > + rc = pldm_file_io_init(); > > + if (rc != OPAL_SUCCESS) { > > + printf("PLDM_TEST : pldm_file_io_init failed"); > > + return rc; > > + } > > + > > + return OPAL_SUCCESS; > > +} > > + > > +
diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h index 81df9f8b..5ac9c443 100644 --- a/core/pldm/pldm.h +++ b/core/pldm/pldm.h @@ -45,7 +45,7 @@ extern int watchdog_period_sec; * @example enum_bit(1) = 0x00000002 * @example enum_bit(4) = 0x00000010 */ -inline uint32_t enum_bit(unsigned int enumeration) +extern inline uint32_t enum_bit(unsigned int enumeration) { return 1 << enumeration; } diff --git a/core/pldm/test/Makefile.check b/core/pldm/test/Makefile.check new file mode 100644 index 00000000..7af66ccf --- /dev/null +++ b/core/pldm/test/Makefile.check @@ -0,0 +1,43 @@ +# -*-Makefile-*- +PLDM_TEST := core/pldm/test/test-pldm-fileio \ + +LCOV_EXCLUDE += $(PLDM_TEST:%=%.c) + +.PHONY : core-pldm-check core-pldm-coverage +core-pldm-check: $(PLDM_TEST:%=%-check) +core-pldm-coverage: $(PLDM_TEST:%=%-gcov-run) +HOSTCFLAG_PLDM:= $(filter-out -Wdeclaration-after-statement,$(HOSTCFLAGS)) +HOSTCFLAG_PLDM:= $(filter-out -Wstrict-prototypes,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM:= $(filter-out -Wjump-misses-init,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-prototypes,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM:= $(filter-out -Wmissing-declarations,$(HOSTCFLAG_PLDM)) +HOSTCFLAG_PLDM += -Wno-format + +check: core-pldm-check +coverage: core-pldm-coverage + +$(PLDM_TEST:%=%-gcov-run) : %-run: % + $(call Q, TEST-COVERAGE ,$< , $<) + +$(PLDM_TEST:%=%-check) : %-check: % + $(call Q, RUN-TEST ,$(VALGRIND) $<, $<) + +core/test/stubs.o: core/test/stubs.c + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) -I . -I include -Wno-error=attributes -g -c -o core/test/stubs.o core/test/stubs.c, $<) + +$(PLDM_TEST) : % : %.c core/test/stubs.o + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAG_PLDM) -O0 -g -I include -I . -I pldm/libpldm/ -I libfdt -o $@ $< core/test/stubs.o -g, $<) + +$(PLDM_TEST:%=%-gcov): %-gcov : %.c % + $(call Q, HOSTCC ,$(HOSTCC) $(HOSTFLAG_PLDM) $(HOSTGCOVCFLAGS) -I include -I . -I pldm/libpldm/ -I libfdt -lgcov -o $@ $<, $<) + +$(PLDM_TEST:%=%-gcov): % : $(%.d:-gcov=) + +-include $(wildcard core/pldm/test/*.d) + +clean: pldm-test-clean + +pldm-test-clean: + $(RM) -f core/pldm/test/*.[od] $(PLDM_TEST) $(PLDM_TEST:%=%-gcov) + $(RM) -f *.gcda *.gcno skiboot.info + $(RM) -rf coverage-report diff --git a/core/pldm/test/test-pldm-fileio.c b/core/pldm/test/test-pldm-fileio.c new file mode 100644 index 00000000..e14f6df7 --- /dev/null +++ b/core/pldm/test/test-pldm-fileio.c @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later +// Copyright 2022 IBM Corp. + + +#include "common/test-pldm-common.c" +#define TEST_FILE_IO_NAME "81e0066b.lid" +#define TEST_FILE_IO_HANDLE 11 +#define TEST_FILE_IO_LENGTH 50 +#define TEST_FILE_IO_BUF1 "This is Test buffer Open power Foundation" + +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size); +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); + +int pldm_test_reply_request(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len); + + +/* + * This function duplicates BMC functionality for Pldm self test + * It will handle pldm response message + * For now we don't have any response + */ +int pldm_test_verify_response(void *response_msg, size_t response_len) +{ + if (response_len > 0 || response_msg != NULL) + return OPAL_PARAMETER; + + return OPAL_PARAMETER; + +} + +/* + * This function duplicates BMC functionality for Pldm self test + * This Genrate Filetable entry for self test + * The file table contains the list of files available and + * their attributes. + * + * Ex: + * { + * "FileHandle": "11", + * "FileNameLength": 12, + * "FileName": "81e0066b.lid", + * "FileSize": 589824, + * "FileTraits": 6 + * } + */ +uint32_t get_test_filetable_entry(uint8_t **file_attr_table, int *size) +{ + struct pldm_file_attr_table_entry *pldm_file_attr_table_entry; + uint8_t FileName[] = TEST_FILE_IO_NAME; + uint32_t file_length = TEST_FILE_IO_LENGTH; + + /* calculate sizeof whole struct */ + *size = sizeof(struct pldm_file_attr_table_entry *) + strlen(FileName) + + sizeof(file_length) - 1; + *file_attr_table = malloc(*size); + if (*file_attr_table == NULL) + return OPAL_RESOURCE; + + pldm_file_attr_table_entry = (struct pldm_file_attr_table_entry *)*file_attr_table; + pldm_file_attr_table_entry->file_handle = TEST_FILE_IO_HANDLE; + pldm_file_attr_table_entry->file_name_length = strlen(FileName); + memcpy(pldm_file_attr_table_entry->file_attr_table_nst, FileName, + strlen(FileName)); + + memcpy(pldm_file_attr_table_entry->file_attr_table_nst + strlen(FileName), + (uint8_t *)&file_length, sizeof(file_length)); + + return OPAL_SUCCESS; +} + +/* + * This function duplicates BMC functionality for Pldm self test + * It will only handle PLDM_OEM type request + * As fileio test will have only pldm request of type = PLDM_OEM + */ +int pldm_test_reply_request(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len) +{ + + switch (((struct pldm_msg *)request_msg)->hdr.type) { + case PLDM_OEM: + return pldm_test_reply_request_file_io(request_msg, request_len, + response_msg, response_len); + default: + printf("PLDM_TEST : hdr type %d not expected\n", + ((struct pldm_msg *)request_msg)->hdr.type); + return OPAL_PARAMETER; + } + + +} + + +/* + * This function duplicates BMC functionality for Pldm self test + * it tries to handle PLDM_REQUEST for fileio and reply with appropriate PLDM_RESPONSE + * message + */ +int pldm_test_reply_request_file_io(void *request_msg, size_t request_len, + void **response_msg, size_t *response_len) +{ + int rc; + int payload_len = 0; + uint32_t transfer_handle; + uint8_t transfer_opflag; + uint8_t table_type; + uint8_t *file_attr_table; + uint32_t table_size; + + + /* check command received and reply with appropriate pldm response message */ + switch (((struct pldm_msg *)request_msg)->hdr.command) { + case PLDM_GET_FILE_TABLE: + + payload_len = request_len - sizeof(struct pldm_msg_hdr); + + rc = decode_get_file_table_req(request_msg, payload_len, &transfer_handle, + &transfer_opflag, &table_type); + if (rc != PLDM_SUCCESS) + return OPAL_PARAMETER; + + /* Get Filetable entry for self test */ + rc = get_test_filetable_entry(&file_attr_table, &table_size); + if (rc != OPAL_SUCCESS) + return OPAL_PARAMETER; + + *response_len = sizeof(struct pldm_msg_hdr) + + sizeof(struct pldm_get_file_table_resp) + + table_size - 1; + *response_msg = malloc(*response_len); + if (*response_msg == NULL) + return OPAL_RESOURCE; + + + rc = encode_get_file_table_resp(((struct pldm_msg *)request_msg)->hdr.instance_id, + PLDM_SUCCESS, PLDM_GET_NEXTPART, PLDM_START_AND_END, + file_attr_table, table_size, *response_msg); + if (rc != PLDM_SUCCESS) + return OPAL_PARAMETER; + + free(file_attr_table); + + break; + + default: + return OPAL_PARAMETER; + + } + + return OPAL_SUCCESS; + + + +} + + +int main(void) +{ + size_t rc; + + + /* Init PLDM File IO */ + rc = pldm_file_io_init(); + if (rc != OPAL_SUCCESS) { + printf("PLDM_TEST : pldm_file_io_init failed"); + return rc; + } + + return OPAL_SUCCESS; +} + +
The patch contains a self-test implementation for PLDM_OEM type message support that is used for inband file I/O. This patch tests code flow for the PLDM command PLDM_GET_FILE_TABLE that is used to retrieve the file table which contains the list of lid files available and their attributes. Signed-off-by: Abhishek Singh Tomar <abhishek@linux.ibm.com> --- core/pldm/pldm.h | 2 +- core/pldm/test/Makefile.check | 43 ++++++++ core/pldm/test/test-pldm-fileio.c | 174 ++++++++++++++++++++++++++++++ 3 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 core/pldm/test/Makefile.check create mode 100644 core/pldm/test/test-pldm-fileio.c