summaryrefslogtreecommitdiffstats
path: root/drivers/isimodem/network-registration.c
diff options
context:
space:
mode:
authorAki Niemi <aki.niemi@nokia.com>2010-01-08 10:58:22 +0200
committerAki Niemi <aki.niemi@nokia.com>2010-01-11 10:51:01 +0200
commit862358b916132ab62087290c6f1316e65ed97a50 (patch)
treead740e2a3f942522dffc8148148a3135b9306f37 /drivers/isimodem/network-registration.c
parentb412c1b3e7a1c09e35bdb11db0e4ba7ea8abee0e (diff)
downloadofono-862358b916132ab62087290c6f1316e65ed97a50.tar.bz2
Refactor netreg driver
Diffstat (limited to 'drivers/isimodem/network-registration.c')
-rw-r--r--drivers/isimodem/network-registration.c130
1 files changed, 56 insertions, 74 deletions
diff --git a/drivers/isimodem/network-registration.c b/drivers/isimodem/network-registration.c
index 9ade176e..7730a9e7 100644
--- a/drivers/isimodem/network-registration.c
+++ b/drivers/isimodem/network-registration.c
@@ -62,12 +62,6 @@ static inline guint8 *mccmnc_to_bcd(const char *mcc, const char *mnc,
return bcd;
}
-static void net_debug(const void *restrict buf, size_t len, void *data)
-{
- DBG("");
- dump_msg(buf, len);
-}
-
static inline int isi_status_to_at_status(guint8 status)
{
switch (status) {
@@ -172,8 +166,8 @@ static gboolean decode_reg_status(struct netreg_data *nd, const guint8 *msg,
}
default:
- DBG("Skipping sub-block: 0x%02X (%zu bytes)",
- g_isi_sb_iter_get_id(&iter),
+ DBG("Skipping sub-block: %s (%zu bytes)",
+ net_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter));
break;
}
@@ -181,7 +175,9 @@ static gboolean decode_reg_status(struct netreg_data *nd, const guint8 *msg,
g_isi_sb_iter_next(&iter);
}
- DBG("status=%d, lac=%d, ci=%d, tech=%d", *status, *lac, *ci, *tech);
+ DBG("status=%s, lac=%d, ci=%d, tech=%d",
+ net_status_name(*status), *lac, *ci, *tech);
+
return TRUE;
}
@@ -220,8 +216,6 @@ static bool reg_status_resp_cb(GIsiClient *client, const void *restrict data,
int ci = -1;
int tech = -1;
- DBG("");
-
if (!msg) {
DBG("ISI client error: %d", g_isi_client_error(client));
goto error;
@@ -231,7 +225,7 @@ static bool reg_status_resp_cb(GIsiClient *client, const void *restrict data,
goto error;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
goto error;
}
@@ -288,16 +282,18 @@ static bool name_get_resp_cb(GIsiClient *client, const void *restrict data,
DBG("");
+ memset(&op, 0, sizeof(struct ofono_network_operator));
+
if (!msg) {
DBG("ISI client error: %d", g_isi_client_error(client));
goto error;
}
if (len < 3 || msg[0] != NET_OPER_NAME_READ_RESP)
- goto error;
+ return false;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
goto error;
}
@@ -316,11 +312,9 @@ static bool name_get_resp_cb(GIsiClient *client, const void *restrict data,
char *tag = NULL;
guint8 taglen = 0;
- if (!g_isi_sb_iter_get_byte(&iter, &taglen, 3))
- goto error;
-
- if (!g_isi_sb_iter_get_alpha_tag(&iter, &tag,
- taglen * 2, 4))
+ if (!g_isi_sb_iter_get_byte(&iter, &taglen, 3)
+ || !g_isi_sb_iter_get_alpha_tag(&iter, &tag,
+ taglen * 2, 4))
goto error;
strncpy(op.name, tag, OFONO_MAX_OPERATOR_NAME_LENGTH);
@@ -330,16 +324,14 @@ static bool name_get_resp_cb(GIsiClient *client, const void *restrict data,
}
default:
- DBG("Skipping sub-block: 0x%02X (%zu bytes)",
- g_isi_sb_iter_get_id(&iter),
+ DBG("Skipping sub-block: %s (%zu bytes)",
+ net_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter));
break;
}
-
g_isi_sb_iter_next(&iter);
}
- DBG("mnc=%s, mcc=%s, name=%s", op.mnc, op.mcc, op.name);
CALLBACK_WITH_SUCCESS(cb, &op, cbd->data);
goto out;
@@ -377,10 +369,8 @@ static void isi_current_operator(struct ofono_netreg *netreg,
return;
error:
- if (cbd)
- g_free(cbd);
-
CALLBACK_WITH_FAILURE(cb, NULL, data);
+ g_free(cbd);
}
@@ -403,10 +393,10 @@ static bool available_resp_cb(GIsiClient *client, const void *restrict data,
}
if (len < 3 || msg[0] != NET_AVAILABLE_GET_RESP)
- goto error;
+ return false;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
goto error;
}
@@ -456,8 +446,8 @@ static bool available_resp_cb(GIsiClient *client, const void *restrict data,
}
default:
- DBG("Skipping sub-block: 0x%02X (%zu bytes)",
- g_isi_sb_iter_get_id(&iter),
+ DBG("Skipping sub-block: %s (%zu bytes)",
+ net_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter));
break;
}
@@ -503,10 +493,8 @@ static void isi_list_operators(struct ofono_netreg *netreg,
return;
error:
- if (cbd)
- g_free(cbd);
-
CALLBACK_WITH_FAILURE(cb, 0, NULL, data);
+ g_free(cbd);
}
static bool set_auto_resp_cb(GIsiClient *client, const void *restrict data,
@@ -522,11 +510,11 @@ static bool set_auto_resp_cb(GIsiClient *client, const void *restrict data,
goto error;
}
- if (!msg|| len < 3 || msg[0] != NET_SET_RESP)
+ if (!msg || len < 3 || msg[0] != NET_SET_RESP)
goto error;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
goto error;
}
@@ -570,10 +558,8 @@ static void isi_register_auto(struct ofono_netreg *netreg,
return;
error:
- if (cbd)
- g_free(cbd);
-
CALLBACK_WITH_FAILURE(cb, data);
+ g_free(cbd);
}
static bool set_manual_resp_cb(GIsiClient *client, const void *restrict data,
@@ -594,7 +580,7 @@ static bool set_manual_resp_cb(GIsiClient *client, const void *restrict data,
goto error;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
goto error;
}
@@ -644,10 +630,8 @@ static void isi_register_manual(struct ofono_netreg *netreg,
return;
error:
- if (cbd)
- g_free(cbd);
-
CALLBACK_WITH_FAILURE(cb, data);
+ g_free(cbd);
}
static void isi_deregister(struct ofono_netreg *netreg,
@@ -693,8 +677,8 @@ static void rat_ind_cb(GIsiClient *client, const void *restrict data,
}
default:
- DBG("Skipping sub-block: 0x%02X (%zu bytes)",
- g_isi_sb_iter_get_id(&iter),
+ DBG("Skipping sub-block: %s (%zu bytes)",
+ net_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter));
break;
}
@@ -717,10 +701,10 @@ static bool rat_resp_cb(GIsiClient *client, const void *restrict data,
}
if (len < 3 || msg[0] != NET_RAT_RESP)
- return true;
+ return false;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
return true;
}
@@ -733,22 +717,19 @@ static bool rat_resp_cb(GIsiClient *client, const void *restrict data,
case NET_RAT_INFO: {
guint8 info = 0;
- if (!g_isi_sb_iter_get_byte(&iter, &nd->rat, 2))
- return true;
-
- if (!g_isi_sb_iter_get_byte(&iter, &info, 3))
+ if (!g_isi_sb_iter_get_byte(&iter, &nd->rat, 2)
+ || !g_isi_sb_iter_get_byte(&iter, &info, 3)
+ || !info
+ || !g_isi_sb_iter_get_byte(&iter,
+ &nd->gsm_compact, 4))
return true;
- if (info)
- if (!g_isi_sb_iter_get_byte(&iter,
- &nd->gsm_compact, 4))
- return true;
break;
}
default:
- DBG("Skipping sub-block: 0x%02X (%zu bytes)",
- g_isi_sb_iter_get_id(&iter),
+ DBG("Skipping sub-block: %s (%zu bytes)",
+ net_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter));
break;
}
@@ -785,10 +766,10 @@ static bool rssi_resp_cb(GIsiClient *client, const void *restrict data,
}
if (len < 3 || msg[0] != NET_RSSI_GET_RESP)
- goto error;
+ return false;
if (msg[1] != NET_CAUSE_OK) {
- DBG("Request failed: 0x%02X", msg[1]);
+ DBG("Request failed: %s", net_isi_cause_name(msg[1]));
goto error;
}
@@ -809,8 +790,8 @@ static bool rssi_resp_cb(GIsiClient *client, const void *restrict data,
}
default:
- DBG("Skipping sub-block: 0x%02X (%zd bytes)",
- g_isi_sb_iter_get_id(&iter),
+ DBG("Skipping sub-block: %s (%zd bytes)",
+ net_subblock_name(g_isi_sb_iter_get_id(&iter)),
g_isi_sb_iter_get_len(&iter));
break;
}
@@ -850,10 +831,8 @@ static void isi_strength(struct ofono_netreg *netreg,
return;
error:
- if (cbd)
- g_free(cbd);
-
CALLBACK_WITH_FAILURE(cb, -1, data);
+ g_free(cbd);
}
static gboolean isi_netreg_register(gpointer user)
@@ -866,7 +845,10 @@ static gboolean isi_netreg_register(gpointer user)
NET_CURRENT_RAT
};
- g_isi_client_set_debug(nd->client, net_debug, NULL);
+ const char *debug = getenv("OFONO_ISI_DEBUG");
+
+ if (debug && (strcmp(debug, "all") == 0 || strcmp(debug, "net") == 0))
+ g_isi_client_set_debug(nd->client, net_debug, NULL);
g_isi_subscribe(nd->client, NET_RSSI_IND, rssi_ind_cb, netreg);
g_isi_subscribe(nd->client, NET_REG_STATUS_IND, reg_status_ind_cb,
@@ -889,15 +871,17 @@ static void reachable_cb(GIsiClient *client, bool alive, uint16_t object,
{
struct ofono_netreg *netreg = opaque;
- if (alive == true) {
- DBG("Resource 0x%02X, with version %03d.%03d reachable",
- g_isi_client_resource(client),
- g_isi_version_major(client),
- g_isi_version_minor(client));
- g_idle_add(isi_netreg_register, netreg);
+ if (!alive) {
+ DBG("Unable to bootsrap netreg driver");
return;
}
- DBG("Unable to bootsrap netreg driver");
+
+ DBG("%s (v%03d.%03d) reachable",
+ pn_resource_name(g_isi_client_resource(client)),
+ g_isi_version_major(client),
+ g_isi_version_minor(client));
+
+ g_idle_add(isi_netreg_register, netreg);
}
static int isi_netreg_probe(struct ofono_netreg *netreg, unsigned int vendor,
@@ -916,9 +900,7 @@ static int isi_netreg_probe(struct ofono_netreg *netreg, unsigned int vendor,
}
ofono_netreg_set_data(netreg, nd);
-
- if (!g_isi_verify(nd->client, reachable_cb, netreg))
- DBG("Unable to verify reachability");
+ g_isi_verify(nd->client, reachable_cb, netreg);
return 0;
}