38
38
#include "storage.h"
40
#define NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN 0x1
41
#define NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN 0x2
40
#define SETTINGS_STORE "netreg"
41
#define SETTINGS_GROUP "Settings"
43
#define NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN 0x1
44
#define NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN 0x2
45
#define NETWORK_REGISTRATION_FLAG_READING_PNN 0x4
43
47
enum network_registration_mode {
44
48
NETWORK_REGISTRATION_MODE_AUTO = 0,
45
NETWORK_REGISTRATION_MODE_MANUAL = 1,
49
NETWORK_REGISTRATION_MODE_MANUAL = 2,
50
NETWORK_REGISTRATION_MODE_AUTO_ONLY = 5, /* Out of range of 27.007 */
48
#define SETTINGS_STORE "netreg"
49
#define SETTINGS_GROUP "Settings"
51
static GSList *g_drivers = NULL;
53
53
/* 27.007 Section 7.3 <stat> */
54
54
enum operator_status {
55
55
OPERATOR_STATUS_UNKNOWN = 0,
152
static void registration_status_callback(const struct ofono_error *error,
153
int status, int lac, int ci, int tech,
156
struct ofono_netreg *netreg = data;
158
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
159
DBG("Error during registration status query");
163
ofono_netreg_status_notify(netreg, status, lac, ci, tech);
166
static void init_register(const struct ofono_error *error, void *data)
168
struct ofono_netreg *netreg = data;
170
if (netreg->driver->registration_status == NULL)
173
netreg->driver->registration_status(netreg,
174
registration_status_callback, netreg);
177
static void enforce_auto_only(struct ofono_netreg *netreg)
179
if (netreg->mode != NETWORK_REGISTRATION_MODE_MANUAL)
182
if (netreg->driver->register_auto == NULL)
185
netreg->driver->register_auto(netreg, init_register, netreg);
147
188
static void set_registration_mode(struct ofono_netreg *netreg, int mode)
149
190
DBusConnection *conn;
171
222
"Mode", DBUS_TYPE_STRING, &strmode);
174
static void registration_status_callback(const struct ofono_error *error,
175
int status, int lac, int ci, int tech,
178
struct ofono_netreg *netreg = data;
180
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
181
DBG("Error during registration status query");
185
ofono_netreg_status_notify(netreg, status, lac, ci, tech);
188
225
static void register_callback(const struct ofono_error *error, void *data)
190
227
struct ofono_netreg *netreg = data;
191
DBusConnection *conn = ofono_dbus_get_connection();
192
228
DBusMessage *reply;
194
if (netreg->pending == NULL)
197
230
if (error->type == OFONO_ERROR_TYPE_NO_ERROR)
198
231
reply = dbus_message_new_method_return(netreg->pending);
200
233
reply = __ofono_error_failed(netreg->pending);
202
g_dbus_send_message(conn, reply);
204
dbus_message_unref(netreg->pending);
205
netreg->pending = NULL;
235
__ofono_dbus_pending_reply(&netreg->pending, reply);
208
237
if (netreg->driver->registration_status == NULL)
211
240
netreg->driver->registration_status(netreg,
212
registration_status_callback, netreg);
215
static void init_register(const struct ofono_error *error, void *data)
217
struct ofono_netreg *netreg = data;
219
if (netreg->driver->registration_status)
220
netreg->driver->registration_status(netreg,
221
registration_status_callback, netreg);
241
registration_status_callback,
224
245
static struct network_operator_data *
384
408
if (home_or_spdi)
385
409
if (netreg->flags & NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN)
387
snprintf(name, len, "%s (%s)", netreg->spname, plmn);
411
snprintf(name, len, "%s (%s)", spn, plmn);
390
snprintf(name, len, "%s", netreg->spname);
414
snprintf(name, len, "%s", spn);
392
416
if (netreg->flags & NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN)
394
snprintf(name, len, "%s (%s)", netreg->spname, plmn);
418
snprintf(name, len, "%s (%s)", spn, plmn);
397
421
snprintf(name, len, "%s", plmn);
606
static GDBusMethodTable network_operator_methods[] = {
607
{ "GetProperties", "", "a{sv}", network_operator_get_properties },
608
{ "Register", "", "", network_operator_register,
609
G_DBUS_METHOD_FLAG_ASYNC },
626
static const GDBusMethodTable network_operator_methods[] = {
627
{ GDBUS_METHOD("GetProperties",
628
NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
629
network_operator_get_properties) },
630
{ GDBUS_ASYNC_METHOD("Register", NULL, NULL,
631
network_operator_register) },
613
static GDBusSignalTable network_operator_signals[] = {
614
{ "PropertyChanged", "sv" },
635
static const GDBusSignalTable network_operator_signals[] = {
636
{ GDBUS_SIGNAL("PropertyChanged",
637
GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
994
static GDBusMethodTable network_registration_methods[] = {
995
{ "GetProperties", "", "a{sv}", network_get_properties },
996
{ "Register", "", "", network_register,
997
G_DBUS_METHOD_FLAG_ASYNC },
998
{ "GetOperators", "", "a(oa{sv})", network_get_operators },
999
{ "Scan", "", "a(oa{sv})", network_scan,
1000
G_DBUS_METHOD_FLAG_ASYNC },
1026
static const GDBusMethodTable network_registration_methods[] = {
1027
{ GDBUS_METHOD("GetProperties",
1028
NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
1029
network_get_properties) },
1030
{ GDBUS_ASYNC_METHOD("Register",
1031
NULL, NULL, network_register) },
1032
{ GDBUS_METHOD("GetOperators",
1033
NULL, GDBUS_ARGS({ "operators_with_properties", "a(oa{sv})" }),
1034
network_get_operators) },
1035
{ GDBUS_ASYNC_METHOD("Scan",
1036
NULL, GDBUS_ARGS({ "operators_with_properties", "a(oa{sv})" }),
1004
static GDBusSignalTable network_registration_signals[] = {
1005
{ "PropertyChanged", "sv" },
1041
static const GDBusSignalTable network_registration_signals[] = {
1042
{ GDBUS_SIGNAL("PropertyChanged",
1043
GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
1287
1320
ofono_netreg_strength_notify(netreg, strength);
1323
static void notify_emulator_status(struct ofono_atom *atom, void *data)
1325
struct ofono_emulator *em = __ofono_atom_get_data(atom);
1327
switch (GPOINTER_TO_INT(data)) {
1328
case NETWORK_REGISTRATION_STATUS_REGISTERED:
1329
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_SERVICE, 1);
1330
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_ROAMING, 0);
1332
case NETWORK_REGISTRATION_STATUS_ROAMING:
1333
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_SERVICE, 1);
1334
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_ROAMING, 1);
1337
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_SERVICE, 0);
1338
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_ROAMING, 0);
1290
1342
void ofono_netreg_status_notify(struct ofono_netreg *netreg, int status,
1291
1343
int lac, int ci, int tech)
1293
1345
if (netreg == NULL)
1296
if (netreg->status != status)
1348
DBG("%s status %d tech %d", __ofono_atom_get_path(netreg->atom),
1351
if (netreg->status != status) {
1352
struct ofono_modem *modem;
1297
1354
set_registration_status(netreg, status);
1356
modem = __ofono_atom_get_modem(netreg->atom);
1357
__ofono_modem_foreach_registered_atom(modem,
1358
OFONO_ATOM_TYPE_EMULATOR_HFP,
1359
notify_emulator_status,
1360
GINT_TO_POINTER(netreg->status));
1299
1363
if (netreg->location != lac)
1300
1364
set_registration_location(netreg, lac);
1340
1404
__ofono_nettime_info_received(modem, info);
1407
static void sim_csp_read_cb(int ok, int total_length, int record,
1408
const unsigned char *data,
1409
int record_length, void *user_data)
1411
struct ofono_netreg *netreg = user_data;
1417
if (total_length < 18)
1421
* According to CPHS 4.2, EFcsp is an array of two-byte service
1422
* entries, each consisting of a one byte service group
1423
* identifier followed by 8 bits; each bit is indicating
1424
* availability of a specific service or feature.
1426
* The PLMN mode bit, if present, indicates whether manual
1427
* operator selection should be disabled or enabled. When
1428
* unset, the device is forced to automatic mode; when set,
1429
* manual selection is to be enabled. The latter is also the
1432
while (i < total_length &&
1433
data[i] != SIM_CSP_ENTRY_VALUE_ADDED_SERVICES)
1436
if (i == total_length)
1439
if ((data[i + 1] & 0x80) != 0) {
1440
if (netreg->mode == NETWORK_REGISTRATION_MODE_AUTO_ONLY)
1441
set_registration_mode(netreg,
1442
NETWORK_REGISTRATION_MODE_AUTO);
1447
set_registration_mode(netreg, NETWORK_REGISTRATION_MODE_AUTO_ONLY);
1450
static void sim_csp_changed(int id, void *userdata)
1452
struct ofono_netreg *netreg = userdata;
1454
ofono_sim_read(netreg->sim_context, SIM_EF_CPHS_CSP_FILEID,
1455
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1456
sim_csp_read_cb, netreg);
1344
1459
static void init_registration_status(const struct ofono_error *error,
1345
1460
int status, int lac, int ci, int tech,
1373
1488
netreg->driver->register_auto(netreg, init_register,
1492
if (netreg->driver->register_manual == NULL) {
1493
set_registration_mode(netreg,
1494
NETWORK_REGISTRATION_MODE_AUTO_ONLY);
1498
if (netreg->sim_context) {
1499
ofono_sim_read(netreg->sim_context, SIM_EF_CPHS_CSP_FILEID,
1500
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1501
sim_csp_read_cb, netreg);
1503
ofono_sim_add_file_watch(netreg->sim_context,
1504
SIM_EF_CPHS_CSP_FILEID,
1505
sim_csp_changed, netreg, NULL);
1509
static void notify_emulator_strength(struct ofono_atom *atom, void *data)
1511
struct ofono_emulator *em = __ofono_atom_get_data(atom);
1514
if (GPOINTER_TO_INT(data) > 0)
1515
val = (GPOINTER_TO_INT(data) - 1) / 20 + 1;
1517
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_SIGNAL, val);
1378
1520
void ofono_netreg_strength_notify(struct ofono_netreg *netreg, int strength)
1380
1522
DBusConnection *conn = ofono_dbus_get_connection();
1523
struct ofono_modem *modem;
1382
1525
if (netreg->signal_strength == strength)
1390
1533
netreg->status != NETWORK_REGISTRATION_STATUS_ROAMING)
1536
DBG("strength %d", strength);
1393
1538
netreg->signal_strength = strength;
1395
1540
if (strength != -1) {
1396
1541
const char *path = __ofono_atom_get_path(netreg->atom);
1397
unsigned char strength = netreg->signal_strength;
1542
unsigned char strength_byte = netreg->signal_strength;
1399
1544
ofono_dbus_signal_property_changed(conn, path,
1400
1545
OFONO_NETWORK_REGISTRATION_INTERFACE,
1401
1546
"Strength", DBUS_TYPE_BYTE,
1550
modem = __ofono_atom_get_modem(netreg->atom);
1551
__ofono_modem_foreach_registered_atom(modem,
1552
OFONO_ATOM_TYPE_EMULATOR_HFP,
1553
notify_emulator_strength,
1554
GINT_TO_POINTER(netreg->signal_strength));
1406
1557
static void sim_opl_read_cb(int ok, int length, int record,
1482
1635
int record_length, void *user_data)
1484
1637
struct ofono_netreg *netreg = user_data;
1485
struct network_operator_data *current = netreg->current_operator;
1490
1642
netreg->spdi = sim_spdi_new(data, length);
1492
if (current == NULL)
1495
if (netreg->status == NETWORK_REGISTRATION_STATUS_ROAMING) {
1496
DBusConnection *conn = ofono_dbus_get_connection();
1497
const char *path = __ofono_atom_get_path(netreg->atom);
1498
const char *operator;
1500
if (!sim_spdi_lookup(netreg->spdi,
1501
current->mcc, current->mnc))
1504
operator = get_operator_display_name(netreg);
1506
ofono_dbus_signal_property_changed(conn, path,
1507
OFONO_NETWORK_REGISTRATION_INTERFACE,
1508
"Name", DBUS_TYPE_STRING,
1644
if (netreg->current_operator == NULL)
1647
if (netreg->status != NETWORK_REGISTRATION_STATUS_ROAMING)
1650
if (!sim_spdi_lookup(netreg->spdi, netreg->current_operator->mcc,
1651
netreg->current_operator->mnc))
1654
netreg_emit_operator_display_name(netreg);
1513
static void sim_spn_read_cb(int ok, int length, int record,
1514
const unsigned char *data,
1515
int record_length, void *user_data)
1657
static void sim_spn_display_condition_parse(struct ofono_netreg *netreg,
1517
struct ofono_netreg *netreg = user_data;
1518
unsigned char dcbyte;
1529
* the string shall use:
1531
* - either the SMS default 7-bit coded alphabet as defined in
1532
* TS 23.038 [5] with bit 8 set to 0. The string shall be left
1533
* justified. Unused bytes shall be set to 'FF'.
1535
* - or one of the UCS2 code options defined in the annex of TS
1538
* 31.101 has no such annex though. 51.101 refers to Annex B of
1539
* itself which is not there either. 11.11 contains the same
1540
* paragraph as 51.101 and has an Annex B which we implement.
1542
spn = sim_string_to_utf8(data + 1, length - 1);
1544
ofono_error("EFspn read successfully, but couldn't parse");
1548
if (strlen(spn) == 0) {
1553
netreg->spname = spn;
1554
ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
1555
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1556
sim_spdi_read_cb, netreg);
1558
1660
if (dcbyte & SIM_EFSPN_DC_HOME_PLMN_BIT)
1559
1661
netreg->flags |= NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN;
1561
1663
if (!(dcbyte & SIM_EFSPN_DC_ROAMING_SPN_BIT))
1562
1664
netreg->flags |= NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN;
1564
if (netreg->current_operator) {
1565
DBusConnection *conn = ofono_dbus_get_connection();
1566
const char *path = __ofono_atom_get_path(netreg->atom);
1567
const char *operator;
1569
operator = get_operator_display_name(netreg);
1571
ofono_dbus_signal_property_changed(conn, path,
1572
OFONO_NETWORK_REGISTRATION_INTERFACE,
1573
"Name", DBUS_TYPE_STRING,
1667
static void spn_read_cb(const char *spn, const char *dc, void *data)
1669
struct ofono_netreg *netreg = data;
1671
netreg->flags &= ~(NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN |
1672
NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN);
1675
sim_spn_display_condition_parse(netreg, *dc);
1677
if (netreg->current_operator)
1678
netreg_emit_operator_display_name(netreg);
1578
1681
int ofono_netreg_get_location(struct ofono_netreg *netreg)
1656
1766
const char *path = __ofono_atom_get_path(atom);
1769
__ofono_modem_foreach_registered_atom(modem,
1770
OFONO_ATOM_TYPE_EMULATOR_HFP,
1771
notify_emulator_status,
1772
GINT_TO_POINTER(0));
1773
__ofono_modem_foreach_registered_atom(modem,
1774
OFONO_ATOM_TYPE_EMULATOR_HFP,
1775
notify_emulator_strength,
1776
GINT_TO_POINTER(0));
1778
__ofono_modem_foreach_registered_atom(modem,
1779
OFONO_ATOM_TYPE_EMULATOR_HFP,
1780
emulator_remove_handler,
1783
__ofono_modem_remove_atom_watch(modem, netreg->hfp_watch);
1659
1785
__ofono_watchlist_free(netreg->status_watches);
1660
1786
netreg->status_watches = NULL;
1662
1788
for (l = netreg->operator_list; l; l = l->next) {
1663
1789
struct network_operator_data *opd = l->data;
1665
if (opd->mcc[0] == '\0' && opd->mnc[0] == '\0')
1791
if (opd->mcc[0] == '\0' && opd->mnc[0] == '\0') {
1668
1796
network_operator_dbus_unregister(netreg, l->data);
1775
1909
netreg->imsi = g_strdup(imsi);
1777
mode = g_key_file_get_integer(netreg->settings, SETTINGS_GROUP,
1911
strmode = g_key_file_get_string(netreg->settings, SETTINGS_GROUP,
1780
if (mode >= 0 && mode <= 1)
1781
netreg->mode = mode;
1783
g_key_file_set_integer(netreg->settings, SETTINGS_GROUP,
1784
"Mode", netreg->mode);
1914
if (strmode == NULL)
1916
else if (g_str_equal(strmode, "auto"))
1917
netreg->mode = NETWORK_REGISTRATION_MODE_AUTO;
1918
else if (g_str_equal(strmode, "manual"))
1919
netreg->mode = NETWORK_REGISTRATION_MODE_MANUAL;
1923
mode = g_key_file_get_integer(netreg->settings, SETTINGS_GROUP,
1927
case NETWORK_REGISTRATION_MODE_AUTO:
1928
case NETWORK_REGISTRATION_MODE_MANUAL:
1929
netreg->mode = mode;
1938
if (upgrade == FALSE)
1941
if (netreg->mode == NETWORK_REGISTRATION_MODE_MANUAL)
1946
g_key_file_set_string(netreg->settings, SETTINGS_GROUP,
1950
static void sim_pnn_opl_changed(int id, void *userdata)
1952
struct ofono_netreg *netreg = userdata;
1955
if (netreg->flags & NETWORK_REGISTRATION_FLAG_READING_PNN)
1958
* Free references to structures on the netreg->eons list and
1959
* update the operator info on D-bus. If EFpnn/EFopl read succeeds,
1960
* operator info will be updated again, otherwise it won't be
1963
for (l = netreg->operator_list; l; l = l->next)
1964
set_network_operator_eons_info(l->data, NULL);
1966
sim_eons_free(netreg->eons);
1967
netreg->eons = NULL;
1969
netreg->flags |= NETWORK_REGISTRATION_FLAG_READING_PNN;
1970
ofono_sim_read(netreg->sim_context, SIM_EFPNN_FILEID,
1971
OFONO_SIM_FILE_STRUCTURE_FIXED,
1972
sim_pnn_read_cb, netreg);
1975
static void sim_spdi_changed(int id, void *userdata)
1977
struct ofono_netreg *netreg = userdata;
1979
sim_spdi_free(netreg->spdi);
1980
netreg->spdi = NULL;
1982
if (netreg->current_operator &&
1983
netreg->status == NETWORK_REGISTRATION_STATUS_ROAMING)
1984
netreg_emit_operator_display_name(netreg);
1986
ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
1987
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1988
sim_spdi_read_cb, netreg);
1991
static void emulator_cops_cb(struct ofono_emulator *em,
1992
struct ofono_emulator_request *req, void *userdata)
1994
struct ofono_netreg *netreg = userdata;
1995
struct ofono_error result;
2002
switch (ofono_emulator_request_get_type(req)) {
2003
case OFONO_EMULATOR_REQUEST_TYPE_SET:
2004
ofono_emulator_request_next_number(req, &val);
2008
ofono_emulator_request_next_number(req, &val);
2012
result.type = OFONO_ERROR_TYPE_NO_ERROR;
2013
ofono_emulator_send_final(em, &result);
2016
case OFONO_EMULATOR_REQUEST_TYPE_QUERY:
2017
strncpy(name, get_operator_display_name(netreg), 16);
2019
sprintf(buf, "+COPS: %d,0,\"%s\"", netreg->mode, name);
2020
ofono_emulator_send_info(em, buf, TRUE);
2021
result.type = OFONO_ERROR_TYPE_NO_ERROR;
2022
ofono_emulator_send_final(em, &result);
2027
result.type = OFONO_ERROR_TYPE_FAILURE;
2028
ofono_emulator_send_final(em, &result);
2032
static void emulator_hfp_init(struct ofono_atom *atom, void *data)
2034
struct ofono_netreg *netreg = data;
2035
struct ofono_emulator *em = __ofono_atom_get_data(atom);
2037
notify_emulator_status(atom, GINT_TO_POINTER(netreg->status));
2038
notify_emulator_strength(atom,
2039
GINT_TO_POINTER(netreg->signal_strength));
2041
ofono_emulator_add_handler(em, "+COPS", emulator_cops_cb, data, NULL);
2044
static void emulator_hfp_watch(struct ofono_atom *atom,
2045
enum ofono_atom_watch_condition cond,
2048
if (cond == OFONO_ATOM_WATCH_CONDITION_REGISTERED)
2049
emulator_hfp_init(atom, data);
1787
2052
void ofono_netreg_register(struct ofono_netreg *netreg)
1810
2074
netreg->driver->registration_status(netreg,
1811
2075
init_registration_status, netreg);
1813
sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
1815
if (sim_atom != NULL) {
2077
netreg->sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
2078
if (netreg->sim != NULL) {
1816
2079
/* Assume that if sim atom exists, it is ready */
1817
netreg->sim = __ofono_atom_get_data(sim_atom);
1818
2080
netreg->sim_context = ofono_sim_context_create(netreg->sim);
1820
2082
netreg_load_settings(netreg);
2084
netreg->flags |= NETWORK_REGISTRATION_FLAG_READING_PNN;
1822
2085
ofono_sim_read(netreg->sim_context, SIM_EFPNN_FILEID,
1823
2086
OFONO_SIM_FILE_STRUCTURE_FIXED,
1824
2087
sim_pnn_read_cb, netreg);
1825
ofono_sim_read(netreg->sim_context, SIM_EFSPN_FILEID,
1826
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1827
sim_spn_read_cb, netreg);
2088
ofono_sim_add_file_watch(netreg->sim_context, SIM_EFPNN_FILEID,
2089
sim_pnn_opl_changed, netreg,
2091
ofono_sim_add_file_watch(netreg->sim_context, SIM_EFOPL_FILEID,
2092
sim_pnn_opl_changed, netreg,
2095
ofono_sim_add_spn_watch(netreg->sim, &netreg->spn_watch,
2096
spn_read_cb, netreg, NULL);
2098
if (__ofono_sim_service_available(netreg->sim,
2099
SIM_UST_SERVICE_PROVIDER_DISPLAY_INFO,
2100
SIM_SST_SERVICE_PROVIDER_DISPLAY_INFO)) {
2101
ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
2102
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
2103
sim_spdi_read_cb, netreg);
2105
ofono_sim_add_file_watch(netreg->sim_context,
1830
2112
__ofono_atom_register(netreg->atom, netreg_unregister);
2114
netreg->hfp_watch = __ofono_modem_add_atom_watch(modem,
2115
OFONO_ATOM_TYPE_EMULATOR_HFP,
2116
emulator_hfp_watch, netreg, NULL);
1833
2119
void ofono_netreg_remove(struct ofono_netreg *netreg)