summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2018-12-19 14:41:19 -0600
committerDenis Kenzior <denkenz@gmail.com>2018-12-19 14:46:08 -0600
commitab55f2f811949c3c74946f30378bd0bf4c9ce30d (patch)
tree66fb8d3da7876fb36a0cc3eae49b6b320199293e /src
parent0b5ed6049aa597d025ca5ecd8951478ff41557fe (diff)
downloadofono-ab55f2f811949c3c74946f30378bd0bf4c9ce30d.tar.gz
gprs: Use l_uintset instead of idmap
Diffstat (limited to 'src')
-rw-r--r--src/gprs.c97
1 files changed, 31 insertions, 66 deletions
diff --git a/src/gprs.c b/src/gprs.c
index edd17f23..7e9e5161 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -36,6 +36,7 @@
#include <arpa/inet.h>
#include <stdbool.h>
+#include <ell/ell.h>
#include <glib.h>
#include <gdbus.h>
@@ -43,7 +44,6 @@
#include "common.h"
#include "storage.h"
-#include "idmap.h"
#include "simutil.h"
#include "util.h"
@@ -70,9 +70,9 @@ struct ofono_gprs {
int flags;
int bearer;
guint suspend_timeout;
- struct idmap *pid_map;
+ struct l_uintset *used_pids;
unsigned int last_context_id;
- struct idmap *cid_map;
+ struct l_uintset *used_cids;
int netreg_status;
struct ofono_netreg *netreg;
unsigned int netreg_watch;
@@ -223,43 +223,23 @@ static gboolean gprs_context_string_to_type(const char *str,
return FALSE;
}
-static unsigned int gprs_cid_alloc(struct ofono_gprs *gprs)
+static gboolean assign_context(struct pri_context *ctx, unsigned int use_cid)
{
- return idmap_alloc(gprs->cid_map);
-}
-
-static void gprs_cid_take(struct ofono_gprs *gprs, unsigned int id)
-{
- idmap_take(gprs->cid_map, id);
-}
-
-static void gprs_cid_release(struct ofono_gprs *gprs, unsigned int id)
-{
- idmap_put(gprs->cid_map, id);
-}
-
-static gboolean gprs_cid_taken(struct ofono_gprs *gprs, unsigned int id)
-{
- return idmap_find(gprs->cid_map, id) != 0;
-}
-
-static gboolean assign_context(struct pri_context *ctx, int use_cid)
-{
- struct idmap *cidmap = ctx->gprs->cid_map;
+ struct l_uintset *used_cids = ctx->gprs->used_cids;
GSList *l;
- if (cidmap == NULL)
+ if (used_cids == NULL)
return FALSE;
- if (use_cid > 0) {
- gprs_cid_take(ctx->gprs, use_cid);
- ctx->context.cid = use_cid;
- } else
- ctx->context.cid = gprs_cid_alloc(ctx->gprs);
+ if (!use_cid)
+ use_cid = l_uintset_find_unused_min(used_cids);
- if (ctx->context.cid > idmap_get_max(cidmap))
+ if (use_cid > l_uintset_get_max(used_cids))
return FALSE;
+ l_uintset_put(used_cids, use_cid);
+ ctx->context.cid = use_cid;
+
for (l = ctx->gprs->context_drivers; l; l = l->next) {
struct ofono_gprs_context *gc = l->data;
@@ -299,7 +279,7 @@ static void release_context(struct pri_context *ctx)
if (ctx == NULL || ctx->gprs == NULL || ctx->context_driver == NULL)
return;
- gprs_cid_release(ctx->gprs, ctx->context.cid);
+ l_uintset_take(ctx->gprs->used_cids, ctx->context.cid);
ctx->context.cid = 0;
ctx->context_driver->inuse = FALSE;
ctx->context_driver = NULL;
@@ -1434,7 +1414,7 @@ static gboolean context_dbus_register(struct pri_context *ctx)
context_methods, context_signals,
NULL, ctx, pri_context_destroy)) {
ofono_error("Could not register PrimaryContext %s", path);
- idmap_put(ctx->gprs->pid_map, ctx->id);
+ l_uintset_take(ctx->gprs->used_pids, ctx->id);
pri_context_destroy(ctx);
return FALSE;
@@ -1462,7 +1442,7 @@ static gboolean context_dbus_unregister(struct pri_context *ctx)
}
strcpy(path, ctx->path);
- idmap_put(ctx->gprs->pid_map, ctx->id);
+ l_uintset_take(ctx->gprs->used_pids, ctx->id);
return g_dbus_unregister_interface(conn, path,
OFONO_CONNECTION_CONTEXT_INTERFACE);
@@ -1918,21 +1898,17 @@ static struct pri_context *add_context(struct ofono_gprs *gprs,
unsigned int id;
struct pri_context *context;
- if (gprs->last_context_id)
- id = idmap_alloc_next(gprs->pid_map, gprs->last_context_id);
- else
- id = idmap_alloc(gprs->pid_map);
-
- if (id > idmap_get_max(gprs->pid_map))
+ id = l_uintset_find_unused(gprs->used_pids, gprs->last_context_id);
+ if (id > l_uintset_get_max(gprs->used_pids))
return NULL;
context = pri_context_create(gprs, name, type);
if (context == NULL) {
- idmap_put(gprs->pid_map, id);
ofono_error("Unable to allocate context struct");
return NULL;
}
+ l_uintset_put(gprs->used_pids, id);
context->id = id;
DBG("Registering new context");
@@ -1962,7 +1938,7 @@ void ofono_gprs_cid_activated(struct ofono_gprs *gprs, unsigned int cid,
DBG("");
- if (gprs_cid_taken(gprs, cid)) {
+ if (l_uintset_contains(gprs->used_cids, cid)) {
DBG("cid %u already activated", cid);
return;
}
@@ -2353,20 +2329,15 @@ static void provision_context(const struct ofono_gprs_provision_data *ap,
strlen(ap->message_center) > MAX_MESSAGE_CENTER_LENGTH)
return;
- if (gprs->last_context_id)
- id = idmap_alloc_next(gprs->pid_map, gprs->last_context_id);
- else
- id = idmap_alloc(gprs->pid_map);
-
- if (id > idmap_get_max(gprs->pid_map))
+ id = l_uintset_find_unused(gprs->used_pids, gprs->last_context_id);
+ if (id > l_uintset_get_max(gprs->used_pids))
return;
context = pri_context_create(gprs, ap->name, ap->type);
- if (context == NULL) {
- idmap_put(gprs->pid_map, id);
+ if (context == NULL)
return;
- }
+ l_uintset_put(gprs->used_pids, id);
context->id = id;
if (ap->username != NULL)
@@ -2600,10 +2571,8 @@ void ofono_gprs_set_cid_range(struct ofono_gprs *gprs,
if (gprs == NULL)
return;
- if (gprs->cid_map)
- idmap_free(gprs->cid_map);
-
- gprs->cid_map = idmap_new_from_range(min, max);
+ l_uintset_free(gprs->used_cids);
+ gprs->used_cids = l_uintset_new_from_range(min, max);
}
static void gprs_context_unregister(struct ofono_atom *atom)
@@ -3010,10 +2979,8 @@ static void gprs_unregister(struct ofono_atom *atom)
free_contexts(gprs);
- if (gprs->cid_map) {
- idmap_free(gprs->cid_map);
- gprs->cid_map = NULL;
- }
+ l_uintset_free(gprs->used_cids);
+ gprs->used_cids = NULL;
if (gprs->netreg_watch) {
if (gprs->status_watch) {
@@ -3053,10 +3020,8 @@ static void gprs_remove(struct ofono_atom *atom)
if (gprs->suspend_timeout)
g_source_remove(gprs->suspend_timeout);
- if (gprs->pid_map) {
- idmap_free(gprs->pid_map);
- gprs->pid_map = NULL;
- }
+ l_uintset_free(gprs->used_pids);
+ gprs->used_pids = NULL;
for (l = gprs->context_drivers; l; l = l->next) {
struct ofono_gprs_context *gc = l->data;
@@ -3104,7 +3069,7 @@ struct ofono_gprs *ofono_gprs_create(struct ofono_modem *modem,
gprs->status = NETWORK_REGISTRATION_STATUS_UNKNOWN;
gprs->netreg_status = NETWORK_REGISTRATION_STATUS_UNKNOWN;
- gprs->pid_map = idmap_new(MAX_CONTEXTS);
+ gprs->used_pids = l_uintset_new(MAX_CONTEXTS);
return gprs;
}
@@ -3224,7 +3189,7 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
if (context == NULL)
goto error;
- idmap_take(gprs->pid_map, id);
+ l_uintset_put(gprs->used_pids, id);
context->id = id;
strcpy(context->context.username, username);
strcpy(context->context.password, password);