jolly has uploaded this change for review.

View Change

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, 29 insertions(+), 15 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/onomondo-ipa refs/changes/52/43652/1
diff --git a/src/ipa/libipa/es10b_get_eim_cfg_data.c b/src/ipa/libipa/es10b_get_eim_cfg_data.c
index 6e2f32b..a9a9ae8 100644
--- a/src/ipa/libipa/es10b_get_eim_cfg_data.c
+++ b/src/ipa/libipa/es10b_get_eim_cfg_data.c
@@ -285,37 +285,46 @@
}

/*! 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;

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, just pick the item from the list that is specified by index */
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;
}

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 0a590ec..5092520 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 ebe8e91..f461dad 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: newchange
Gerrit-Project: onomondo-ipa
Gerrit-Branch: master
Gerrit-Change-Id: I7a3cbbf8cd765f6da955434d897d9ffbe847f525
Gerrit-Change-Number: 43652
Gerrit-PatchSet: 1
Gerrit-Owner: jolly <andreas@eversberg.eu>