jolly submitted this change.

View Change

Approvals: Jenkins Builder: Verified dexter: Looks good to me, approved
Add index to ipa_es10b_get_eim_cfg_data_filter

In order to select a specific item from EimConfigurationData list, an
index may be given. This is needed to select list items, if no specific
eIM ID is given. Later patch use this filter to loop through all
available eIM configurations.

Related: SYS#8101
Change-Id: I7a3cbbf8cd765f6da955434d897d9ffbe847f525
---
M src/ipa/libipa/es10b_get_eim_cfg_data.c
M src/ipa/libipa/es10b_get_eim_cfg_data.h
M src/ipa/libipa/ipad.c
M src/ipa/libipa/proc_eim_pkg_retr.c
M src/ipa/libipa/proc_euicc_data_req.c
5 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/src/ipa/libipa/es10b_get_eim_cfg_data.c b/src/ipa/libipa/es10b_get_eim_cfg_data.c
index 9a34392..d8a6b62 100644
--- a/src/ipa/libipa/es10b_get_eim_cfg_data.c
+++ b/src/ipa/libipa/es10b_get_eim_cfg_data.c
@@ -285,37 +285,48 @@
}

/*! Filter one EimConfigurationData list item from GetEimConfigurationDataResponse.
+ * \param[out] eim_cfg_data_ite pointer to EimConfigurationData item pointer.
* \param[in] res pointer to function result that contains the GetEimConfigurationDataResponse.
* \param[in] eim_id eimId to look for. When set to NULL, the first item of the EimConfigurationData list is returned.
- * \returns pointer to EimConfigurationData item, NULL on error. */
-struct EimConfigurationData *ipa_es10b_get_eim_cfg_data_filter(struct ipa_es10b_eim_cfg_data *res, char *eim_id)
+ * \param[in] index the item of the EimConfigurationData list to be returned. (If eim_id is set, this has no effect.)
+ * \returns 0 on success, negative on failure. (-ENOENT is returned if index not 0 and out of range.) */
+int ipa_es10b_get_eim_cfg_data_filter(struct EimConfigurationData **eim_cfg_data_item,
+ struct ipa_es10b_eim_cfg_data *res, char *eim_id, int index)
{
long i;

+ *eim_cfg_data_item = NULL;
+
if (!res || !res->res) {
IPA_LOGP_ES10X("GetEimConfigurationData", LERROR,
"cannot filter non existent EimConfigurationData list\n");
- return NULL;
+ return -EINVAL;
}

if (res->res->eimConfigurationDataList.list.count < 1) {
IPA_LOGP_ES10X("GetEimConfigurationData", LERROR, "cannot filter empty EimConfigurationData list\n");
- return NULL;
+ return -EINVAL;
}

- /* In case no eim_id is specified, just pick the first item from the list */
+ /* In case no eim_id is specified, pick the eim_cfg_data_item by its index and exit. */
if (!eim_id || eim_id[0] == '\0') {
- return res->res->eimConfigurationDataList.list.array[0];
+ /* If the index is out of range, return -ENOENT. */
+ if (index >= res->res->eimConfigurationDataList.list.count)
+ return -ENOENT;
+ *eim_cfg_data_item = res->res->eimConfigurationDataList.list.array[index];
+ return 0;
}

+ /* Otherwise find the eim_cfg_data_item by the specified eim_id and exit. */
for (i = 0; i < res->res->eimConfigurationDataList.list.count; i++) {
if (IPA_ASN_STR_CMP_BUF
(&res->res->eimConfigurationDataList.list.array[i]->eimId, eim_id, strlen(eim_id))) {
- return res->res->eimConfigurationDataList.list.array[i];
+ *eim_cfg_data_item = res->res->eimConfigurationDataList.list.array[i];
+ return 0;
}
}

IPA_LOGP_ES10X("GetEimConfigurationData", LERROR, "cannot find eimId %s in EimConfigurationData list\n",
eim_id);
- return NULL;
+ return -EINVAL;
}
diff --git a/src/ipa/libipa/es10b_get_eim_cfg_data.h b/src/ipa/libipa/es10b_get_eim_cfg_data.h
index 5c3c3c5..0bfb776 100644
--- a/src/ipa/libipa/es10b_get_eim_cfg_data.h
+++ b/src/ipa/libipa/es10b_get_eim_cfg_data.h
@@ -43,4 +43,5 @@
struct ipa_es10b_eim_cfg_data *ipa_es10b_get_eim_cfg_data(struct ipa_context *ctx);
void ipa_es10b_get_eim_cfg_data_free(struct ipa_es10b_eim_cfg_data *res);

-struct EimConfigurationData *ipa_es10b_get_eim_cfg_data_filter(struct ipa_es10b_eim_cfg_data *res, char *eim_id);
+int ipa_es10b_get_eim_cfg_data_filter(struct EimConfigurationData **eim_cfg_data_item,
+ struct ipa_es10b_eim_cfg_data *res, char *eim_id, int index);
diff --git a/src/ipa/libipa/ipad.c b/src/ipa/libipa/ipad.c
index 1b15e56..8838f91 100644
--- a/src/ipa/libipa/ipad.c
+++ b/src/ipa/libipa/ipad.c
@@ -145,6 +145,7 @@
{
struct ipa_es10b_eim_cfg_data *eim_cfg_data = NULL;
struct EimConfigurationData *eim_cfg_data_item = NULL;
+ int rc;

eim_cfg_data = ipa_es10b_get_eim_cfg_data(ctx);
if (!eim_cfg_data) {
@@ -153,8 +154,8 @@
}

/* In case no preferred_eim_id is set, the first eIM configuration item will be pulled from the list */
- eim_cfg_data_item = ipa_es10b_get_eim_cfg_data_filter(eim_cfg_data, ctx->cfg->preferred_eim_id);
- if (!eim_cfg_data_item) {
+ rc = ipa_es10b_get_eim_cfg_data_filter(&eim_cfg_data_item, eim_cfg_data, ctx->cfg->preferred_eim_id, 0);
+ if (rc < 0) {
IPA_LOGP(SIPA, LERROR, "no suitable EimConfigurationData item present.\n");
goto error;
}
diff --git a/src/ipa/libipa/proc_eim_pkg_retr.c b/src/ipa/libipa/proc_eim_pkg_retr.c
index e5b3422..2028605 100644
--- a/src/ipa/libipa/proc_eim_pkg_retr.c
+++ b/src/ipa/libipa/proc_eim_pkg_retr.c
@@ -32,6 +32,7 @@
{
struct ipa_es10b_eim_cfg_data *eim_cfg_data = NULL;
struct EimConfigurationData *eim_cfg_data_item = NULL;
+ int rc;

*pkid = NULL;

@@ -41,8 +42,8 @@
goto error;
}

- eim_cfg_data_item = ipa_es10b_get_eim_cfg_data_filter(eim_cfg_data, ctx->eim_id);
- if (!eim_cfg_data_item) {
+ rc = ipa_es10b_get_eim_cfg_data_filter(&eim_cfg_data_item, eim_cfg_data, ctx->eim_id, 0);
+ if (rc < 0) {
IPA_LOGP(SIPA, LERROR, "no EimConfigurationData item for eimId %s present!\n", ctx->eim_id);
goto error;
}
diff --git a/src/ipa/libipa/proc_euicc_data_req.c b/src/ipa/libipa/proc_euicc_data_req.c
index b867828..28174f9 100644
--- a/src/ipa/libipa/proc_euicc_data_req.c
+++ b/src/ipa/libipa/proc_euicc_data_req.c
@@ -153,8 +153,10 @@
IPA_LOGP(SIPA, LINFO, "eIM asks for Association token\n");
eim_cfg_data = ipa_es10b_get_eim_cfg_data(ctx);
if (eim_cfg_data && eim_cfg_data->res) {
- eim_cfg_data_item = ipa_es10b_get_eim_cfg_data_filter(eim_cfg_data, ctx->eim_id);
- if (eim_cfg_data_item)
+ int rc;
+
+ rc = ipa_es10b_get_eim_cfg_data_filter(&eim_cfg_data_item, eim_cfg_data, ctx->eim_id, 0);
+ if (rc >= 0)
ipa_euicc_data_response.choice.ipaEuiccData.associationToken = eim_cfg_data_item->associationToken;
}
}

To view, visit change 43652. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: onomondo-ipa
Gerrit-Branch: master
Gerrit-Change-Id: I7a3cbbf8cd765f6da955434d897d9ffbe847f525
Gerrit-Change-Number: 43652
Gerrit-PatchSet: 3
Gerrit-Owner: jolly <andreas@eversberg.eu>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier@sysmocom.de>
Gerrit-Reviewer: jolly <andreas@eversberg.eu>