X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=plugins%2Fofono.c;h=ae419be4e15bcab1c93af6b9968a5b9dae0db49a;hb=091f5fa9229897a52424cd442b325f97d361dbc3;hp=f15c36d0955d4ebca91e7103571539d1fc107129;hpb=1cb80dc2f268a341938430dfe135030c0a9f6ce5;p=framework%2Fconnectivity%2Fconnman.git diff --git a/plugins/ofono.c b/plugins/ofono.c index f15c36d..ae419be 100644 --- a/plugins/ofono.c +++ b/plugins/ofono.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2010 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 Intel Corporation. All rights reserved. * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). * Copyright (C) 2011 BWM Car IT GmbH. All rights reserved. * @@ -43,8 +43,6 @@ #include "mcc.h" -#define uninitialized_var(x) x = x - #define OFONO_SERVICE "org.ofono" #define OFONO_MANAGER_INTERFACE OFONO_SERVICE ".Manager" @@ -83,13 +81,48 @@ enum ofono_api { * powered -> SubscriberIdentity or Online = True -> gprs, context -> * attached -> netreg -> ready * - * Enabling and disabling modems are steered through the rfkill - * interface. That means when ConnMan toggles the rfkill bit oFono - * will add or remove the modems. + * Depending on the modem type, this plugin will behave differently. + * + * GSM working flow: + * + * When a new modem appears, the plugin always powers it up. This + * allows the plugin to create a connman_device. The core will call + * modem_enable() if the technology is enabled. modem_enable() will + * then set the modem online. If the technology is disabled then + * modem_disable() will just set the modem offline. The modem is + * always kept powered all the time. + * + * After setting the modem online the plugin waits for the + * ConnectionManager and ConnectionContext to appear. When the context + * signals that it is attached and the NetworkRegistration interface + * appears, a new Service will be created and registered at the core. + * + * When asked to connect to the network (network_connect()) the plugin + * will set the Active property on the context. If this operation is + * successful the modem is connected to the network. oFono will inform + * the plugin about IP configuration through the updating the context's + * properties. * - * ConnMan will always power up (set Powered and Online) the - * modems. No need to power them down because this will be done - * through the rfkill inteface. + * CDMA working flow: + * + * When a new modem appears, the plugin always powers it up. This + * allows the plugin to create connman_device either using IMSI either + * using modem Serial if the modem got a SIM interface or not. + * + * As for GSM, the core will call modem_enable() if the technology + * is enabled. modem_enable() will then set the modem online. + * If the technology is disabled then modem_disable() will just set the + * modem offline. The modem is always kept powered all the time. + * + * After setting the modem online the plugin waits for CdmaConnectionManager + * interface to appear. Then, once CdmaNetworkRegistration appears, a new + * Service will be created and registered at the core. + * + * When asked to connect to the network (network_connect()) the plugin + * will power up the CdmaConnectionManager interface. + * If the operation is successful the modem is connected to the network. + * oFono will inform the plugin about IP configuration through the + * updating CdmaConnectionManager settings properties. */ static DBusConnection *connection; @@ -137,6 +170,7 @@ struct modem_data { /* ConnectionContext Interface */ connman_bool_t active; connman_bool_t set_active; + connman_bool_t valid_apn; /* APN is 'valid' if length > 0 */ /* SimManager Interface */ char *imsi; @@ -277,6 +311,9 @@ static void set_disconnected(struct modem_data *modem) { DBG("%s", modem->path); + if (modem->network == NULL) + return; + connman_network_set_connected(modem->network, FALSE); } @@ -795,7 +832,7 @@ static void extract_ipv6_settings(DBusMessageIter *array, { DBusMessageIter dict; char *address = NULL, *gateway = NULL; - unsigned char prefix_length; + unsigned char prefix_length = 0; char *nameservers = NULL; const char *interface = NULL; int index = -1; @@ -879,8 +916,6 @@ static connman_bool_t ready_to_create_device(struct modem_data *modem) * different: * - GSM modems will expose the SIM interface then the * CM interface. - * - DUN modems will expose first a unique serial number (BDADDR) - * and then the CM interface. * - CDMA modems will expose CM first and sometime later * a unique serial number. * @@ -900,7 +935,7 @@ static connman_bool_t ready_to_create_device(struct modem_data *modem) static void create_device(struct modem_data *modem) { struct connman_device *device; - char *uninitialized_var(ident); + char *ident = NULL; DBG("%s", modem->path); @@ -1025,7 +1060,7 @@ static void remove_network(struct modem_data *modem) static int add_cm_context(struct modem_data *modem, const char *context_path, DBusMessageIter *dict) { - const char *context_type; + const char *context_type = NULL; struct network_context *context = NULL; connman_bool_t active = FALSE; @@ -1070,8 +1105,17 @@ static int add_cm_context(struct modem_data *modem, const char *context_path, dbus_message_iter_get_basic(&value, &active); DBG("%s Active %d", modem->path, active); - } + } else if (g_str_equal(key, "AccessPointName") == TRUE) { + const char *apn; + dbus_message_iter_get_basic(&value, &apn); + if (apn != NULL && strlen(apn) > 0) + modem->valid_apn = TRUE; + else + modem->valid_apn = FALSE; + + DBG("%s AccessPointName '%s'", modem->path, apn); + } dbus_message_iter_next(dict); } @@ -1085,6 +1129,12 @@ static int add_cm_context(struct modem_data *modem, const char *context_path, g_hash_table_replace(context_hash, g_strdup(context_path), modem); + if (modem->valid_apn == TRUE && modem->attached == TRUE && + has_interface(modem->interfaces, + OFONO_API_NETREG) == TRUE) { + add_network(modem); + } + return 0; } @@ -1094,10 +1144,18 @@ static void remove_cm_context(struct modem_data *modem, if (modem->context == NULL) return; + if (modem->network != NULL) + remove_network(modem); + g_hash_table_remove(context_hash, context_path); network_context_free(modem->context); modem->context = NULL; + + modem->valid_apn = FALSE; + + if (modem->network != NULL) + remove_network(modem); } static gboolean context_changed(DBusConnection *connection, @@ -1145,6 +1203,39 @@ static gboolean context_changed(DBusConnection *connection, set_connected(modem); else set_disconnected(modem); + } else if (g_str_equal(key, "AccessPointName") == TRUE) { + const char *apn; + + dbus_message_iter_get_basic(&value, &apn); + + DBG("%s AccessPointName %s", modem->path, apn); + + if (apn != NULL && strlen(apn) > 0) { + modem->valid_apn = TRUE; + + if (modem->network != NULL) + return TRUE; + + if (modem->attached == FALSE) + return TRUE; + + if (has_interface(modem->interfaces, + OFONO_API_NETREG) == FALSE) { + return TRUE; + } + + add_network(modem); + + if (modem->active == TRUE) + set_connected(modem); + } else { + modem->valid_apn = FALSE; + + if (modem->network == NULL) + return TRUE; + + remove_network(modem); + } } return TRUE; @@ -1247,7 +1338,7 @@ static gboolean cm_context_added(DBusConnection *connection, DBG("%s", path); - modem = g_hash_table_lookup(modem_hash, context_path); + modem = g_hash_table_lookup(modem_hash, path); if (modem == NULL) return TRUE; @@ -1401,11 +1492,12 @@ static void netreg_update_regdom(struct modem_data *modem, mcc = atoi(mobile_country_code); - if (mcc > 799) + if (mcc > 799 || mcc < 200) return; alpha2 = mcc_country_codes[mcc - 200]; - connman_technology_set_regdom(alpha2); + if (alpha2 != NULL) + connman_technology_set_regdom(alpha2); } static gboolean netreg_changed(DBusConnection *connection, DBusMessage *message, @@ -1482,7 +1574,8 @@ static void netreg_properties_reply(struct modem_data *modem, return; } - add_network(modem); + if (modem->valid_apn == TRUE) + add_network(modem); if (modem->active == TRUE) set_connected(modem); @@ -2354,7 +2447,7 @@ static int network_disconnect(struct connman_network *network) } static struct connman_network_driver network_driver = { - .name = "network", + .name = "cellular", .type = CONNMAN_NETWORK_TYPE_CELLULAR, .probe = network_probe, .remove = network_remove,