forked from sailfishos/ofono
Compare commits
184 Commits
mer/1.25+g
...
1.29+git2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0ea7b54c6 | ||
|
|
01c5e7fc1a | ||
|
|
291530d291 | ||
|
|
108611ef72 | ||
|
|
a3c9fc793c | ||
|
|
03491c78e7 | ||
|
|
c534b7e9b0 | ||
|
|
35e7cd19e6 | ||
|
|
2ed8b1bb7f | ||
|
|
8f65b01f4c | ||
|
|
1aa2ac5e67 | ||
|
|
cb8a13433f | ||
|
|
ee1c34cd7f | ||
|
|
2b89f6d488 | ||
|
|
32b886d89d | ||
|
|
a9a3e024e1 | ||
|
|
8c432e5426 | ||
|
|
fc26876503 | ||
|
|
7461d52b10 | ||
|
|
9e2fd992b5 | ||
|
|
1295539515 | ||
|
|
65aa5aab14 | ||
|
|
8da2178a96 | ||
|
|
181c74b1a9 | ||
|
|
a30ef13844 | ||
|
|
ec85e50ab4 | ||
|
|
1cedb9d750 | ||
|
|
a412839f45 | ||
|
|
86af7cd7c9 | ||
|
|
050332577c | ||
|
|
339814e429 | ||
|
|
278d7236c9 | ||
|
|
15a9ea2977 | ||
|
|
9910ab1693 | ||
|
|
d5a3613fd4 | ||
|
|
d337893b39 | ||
|
|
9ef41fdc2f | ||
|
|
c779a8b19d | ||
|
|
81c7f886cb | ||
|
|
4adac31b51 | ||
|
|
31bebd7ecf | ||
|
|
f1965b1e2b | ||
|
|
fed8c5b171 | ||
|
|
5e1f159ad1 | ||
|
|
972aea87e8 | ||
|
|
f4df805783 | ||
|
|
1066668a4b | ||
|
|
c5029eafcf | ||
|
|
6ce1e081a4 | ||
|
|
91435c39ed | ||
|
|
531afae6b2 | ||
|
|
1c8a577a4b | ||
|
|
bd175869f4 | ||
|
|
bcb08afc50 | ||
|
|
eb8bfb57e9 | ||
|
|
871eab499c | ||
|
|
dae12e74a4 | ||
|
|
9f486aa91a | ||
|
|
b015849e98 | ||
|
|
6c77fa2ddd | ||
|
|
09bd3cc5ac | ||
|
|
1758eb3b2a | ||
|
|
faae02c2f4 | ||
|
|
d2abaa7776 | ||
|
|
78e83f877c | ||
|
|
2b00591782 | ||
|
|
18b38db35f | ||
|
|
056cc73bae | ||
|
|
ad0d616696 | ||
|
|
15d0364dc0 | ||
|
|
0faff9bf8d | ||
|
|
9a2ef6c17d | ||
|
|
aab3e8cca9 | ||
|
|
0538daab9d | ||
|
|
24fd7e863c | ||
|
|
3bdcd55ad8 | ||
|
|
fb76fa7be1 | ||
|
|
36c281e843 | ||
|
|
a4d5053c65 | ||
|
|
2168d53bd6 | ||
|
|
258a623939 | ||
|
|
d0208b2085 | ||
|
|
955ce593d2 | ||
|
|
535b0e2e6e | ||
|
|
2809230885 | ||
|
|
ad1037fbd2 | ||
|
|
75a10ccb5a | ||
|
|
4745d6ed8a | ||
|
|
1a56f30091 | ||
|
|
04021d8cf4 | ||
|
|
16402d5056 | ||
|
|
8b90d7f8f1 | ||
|
|
db093dae3f | ||
|
|
1cf235bc0d | ||
|
|
dd2ec559af | ||
|
|
25c11d6697 | ||
|
|
0f789ddf25 | ||
|
|
cfae9cd095 | ||
|
|
dca2747d5f | ||
|
|
b6df026722 | ||
|
|
aa1e36040d | ||
|
|
227af51e10 | ||
|
|
cbab683ac2 | ||
|
|
8a42f7cf48 | ||
|
|
45b8b675ac | ||
|
|
b977415db8 | ||
|
|
011377b505 | ||
|
|
7653e2b293 | ||
|
|
0012a3e4f0 | ||
|
|
40ec15a394 | ||
|
|
cb2fd2de41 | ||
|
|
3221ab9512 | ||
|
|
06b58a3650 | ||
|
|
e834b8c1a8 | ||
|
|
c6eaa7f108 | ||
|
|
ccf340a896 | ||
|
|
c8577e681b | ||
|
|
64f833d351 | ||
|
|
0bd5121144 | ||
|
|
f7cd4d229f | ||
|
|
b55593d9ef | ||
|
|
ab9fdb8af1 | ||
|
|
1daf3f62c2 | ||
|
|
20359b88d2 | ||
|
|
4e1f39638d | ||
|
|
22c5c3ae98 | ||
|
|
f3f3d6819d | ||
|
|
8934c398bb | ||
|
|
14759305fd | ||
|
|
df160a28f7 | ||
|
|
90cc6a3862 | ||
|
|
9176411489 | ||
|
|
c470ab5043 | ||
|
|
9c092bbe72 | ||
|
|
2c41120b78 | ||
|
|
88342a037c | ||
|
|
75ff3e7bbf | ||
|
|
6abd0106b9 | ||
|
|
85f9307c71 | ||
|
|
c5f48019ff | ||
|
|
efa0627332 | ||
|
|
35e8201e96 | ||
|
|
b465782a10 | ||
|
|
557f907b27 | ||
|
|
9a354879d3 | ||
|
|
e6799aacc9 | ||
|
|
f5d78b7e2f | ||
|
|
8fde6264c8 | ||
|
|
eb8371b02d | ||
|
|
3b2bfa8943 | ||
|
|
d2e46f9a5f | ||
|
|
9b3ba1a2f0 | ||
|
|
b36b0d86f6 | ||
|
|
655dd9ab5a | ||
|
|
74017fe30f | ||
|
|
022b31b075 | ||
|
|
6674cc3340 | ||
|
|
a850fd8978 | ||
|
|
c006d8b5ce | ||
|
|
bf8e09da98 | ||
|
|
e60c6b16ff | ||
|
|
c2dd50232f | ||
|
|
fff50b8670 | ||
|
|
0dd2d4874a | ||
|
|
b0e79b7564 | ||
|
|
e7f7197e5f | ||
|
|
fea0b49834 | ||
|
|
e67bf1c41c | ||
|
|
3a5feec41d | ||
|
|
8457376df4 | ||
|
|
2aed406a96 | ||
|
|
9ec0f966ef | ||
|
|
81b1bf3943 | ||
|
|
c1bdd87f22 | ||
|
|
a796f670e1 | ||
|
|
122998372d | ||
|
|
29a9190dce | ||
|
|
3eba9c2518 | ||
|
|
8bd27690bf | ||
|
|
09074dc026 | ||
|
|
b6c5a7e33f | ||
|
|
9de9417ef1 | ||
|
|
d5599452b4 | ||
|
|
b1f3d44524 |
1
ofono/.gitignore
vendored
1
ofono/.gitignore
vendored
@@ -43,6 +43,7 @@ unit/test-simutil
|
||||
unit/test-mux
|
||||
unit/test-caif
|
||||
unit/test-cell-info
|
||||
unit/test-cell-info-control
|
||||
unit/test-cell-info-dbus
|
||||
unit/test-stkutil
|
||||
unit/test-cdmasms
|
||||
|
||||
@@ -137,3 +137,7 @@ Varun Gargi <varun.gargi@intel.com>
|
||||
Florent Beillonnet <florent.beillonnet@gmail.com>
|
||||
Martin Hundebøll <martin@geanix.com>
|
||||
Julien Tournier <tournier.julien@gmail.com>
|
||||
Nandini Rebello <nandini.rebello@intel.com>
|
||||
Giacinto Cifelli <gciofono@gmail.com>
|
||||
Khaled Romdhani <khaledromdhani216@gmail.com>
|
||||
Pavel Machek <pavel@ucw.cz>
|
||||
|
||||
@@ -1,3 +1,30 @@
|
||||
ver 1.29:
|
||||
Fix issue with QMI and SIM initialized notification.
|
||||
Add support for multiple PDP contexts and xmm7xxx modems.
|
||||
Add support for handling Dual SIM Single Active feature
|
||||
Add support for SIM PIN caching feature.
|
||||
|
||||
ver 1.28:
|
||||
Fix issue with SIM initialization and Gemalto modems.
|
||||
|
||||
ver 1.27:
|
||||
Add support for handling SIMCom based SIM800 modems.
|
||||
Add support for SIM lock state with xmm7xxx modems.
|
||||
Add support for coexistence feature with xmm7xxx modems.
|
||||
|
||||
ver 1.26:
|
||||
Fix issue with AT callback handler and GPRS.
|
||||
Fix issue with handling EUTRAN SMS only states.
|
||||
Fix issue with handling MBIM strings on big endian.
|
||||
Fix issue with missing char and SMS national language.
|
||||
Fix issue with unsolicited notifications of +CGAUTH/+CGDCONT.
|
||||
Add support for setting "none" authentication method.
|
||||
Add support for SMS and phonebook with xmm7xxx modems.
|
||||
Add support for voice features and Gemalto modems.
|
||||
Add support for Bengali and Gujrati SMS alphabets.
|
||||
Add support for 8 additional languages for GSM 7 bit
|
||||
Add support for using internal Embedded Linux library.
|
||||
|
||||
ver 1.25:
|
||||
Fix issue with handling GPRS context release.
|
||||
Fix issue with GPRS context shutdown and Huawei modems.
|
||||
|
||||
@@ -113,6 +113,9 @@ gril_sources = gril/gril.h gril/gril.c \
|
||||
|
||||
btio_sources = btio/btio.h btio/btio.c
|
||||
|
||||
builtin_modules += cellinfo_netmon generic_phonebook
|
||||
builtin_sources += plugins/cellinfo-netmon.c plugins/generic-phonebook.c
|
||||
|
||||
if UDEV
|
||||
builtin_cflags += @UDEV_CFLAGS@
|
||||
builtin_libadd += @UDEV_LIBS@
|
||||
@@ -409,14 +412,16 @@ builtin_modules += gemaltomodem
|
||||
builtin_sources += drivers/atmodem/atutil.h \
|
||||
drivers/gemaltomodem/gemaltomodem.h \
|
||||
drivers/gemaltomodem/gemaltomodem.c \
|
||||
drivers/gemaltomodem/location-reporting.c
|
||||
drivers/gemaltomodem/location-reporting.c \
|
||||
drivers/gemaltomodem/voicecall.c
|
||||
|
||||
builtin_modules += xmm7modem
|
||||
builtin_sources += drivers/atmodem/atutil.h \
|
||||
drivers/xmm7modem/xmm7modem.h \
|
||||
drivers/xmm7modem/xmm7modem.c \
|
||||
drivers/xmm7modem/radio-settings.c \
|
||||
drivers/xmm7modem/ims.c
|
||||
drivers/xmm7modem/ims.c \
|
||||
drivers/xmm7modem/netmon.c
|
||||
|
||||
if PHONESIM
|
||||
builtin_modules += phonesim
|
||||
@@ -664,6 +669,7 @@ builtin_libadd += @ELL_LIBS@
|
||||
if MBIMMODEM
|
||||
mbim_sources = drivers/mbimmodem/mbim.h \
|
||||
drivers/mbimmodem/mbim.c \
|
||||
drivers/mbimmodem/mbim-private.h \
|
||||
drivers/mbimmodem/mbim-desc.h \
|
||||
drivers/mbimmodem/mbim-desc.c \
|
||||
drivers/mbimmodem/mbim-message.h \
|
||||
@@ -723,6 +729,7 @@ src_ofonod_SOURCES = $(builtin_sources) $(gatchat_sources) src/ofono.ver \
|
||||
src/netmonagent.c src/netmonagent.h \
|
||||
src/slot-manager.c src/slot-manager-dbus.c \
|
||||
src/cell-info.c src/cell-info-dbus.c \
|
||||
src/cell-info-control.c \
|
||||
src/sim-info.c src/sim-info-dbus.c \
|
||||
src/conf.c src/mtu-limit.c
|
||||
|
||||
@@ -888,7 +895,8 @@ test_scripts = test/backtrace \
|
||||
test/test-serving-cell-info \
|
||||
test/ims-register \
|
||||
test/ims-unregister \
|
||||
test/list-applications
|
||||
test/list-applications \
|
||||
test/set-sms-alphabet
|
||||
|
||||
|
||||
if TEST
|
||||
@@ -923,11 +931,19 @@ unit_test_cell_info_LDADD = @GLIB_LIBS@ -ldl
|
||||
unit_objects += $(unit_test_cell_info_OBJECTS)
|
||||
unit_tests += unit/test-cell-info
|
||||
|
||||
unit_test_cell_info_control_SOURCES = unit/test-cell-info-control.c \
|
||||
unit/fake_cell_info.c src/cell-info.c \
|
||||
src/cell-info-control.c src/log.c
|
||||
unit_test_cell_info_control_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT)
|
||||
unit_test_cell_info_control_LDADD = @GLIB_LIBS@ -ldl
|
||||
unit_objects += $(unit_test_cell_info_control_OBJECTS)
|
||||
unit_tests += unit/test-cell-info-control
|
||||
|
||||
unit_test_cell_info_dbus_SOURCES = unit/test-dbus.c \
|
||||
unit/test-cell-info-dbus.c unit/fake_cell_info.c \
|
||||
src/cell-info.c src/cell-info-dbus.c \
|
||||
gdbus/object.c src/dbus-clients.c \
|
||||
src/dbus.c src/log.c
|
||||
src/cell-info-control.c gdbus/object.c \
|
||||
src/dbus-clients.c src/dbus.c src/log.c
|
||||
unit_test_cell_info_dbus_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
||||
@DBUS_GLIB_CFLAGS@
|
||||
unit_test_cell_info_dbus_LDADD = @DBUS_GLIB_LIBS@ @GLIB_LIBS@ -ldl
|
||||
@@ -954,8 +970,9 @@ unit_objects += $(unit_test_sim_info_dbus_OBJECTS)
|
||||
unit_tests += unit/test-sim-info-dbus
|
||||
|
||||
unit_test_slot_manager_SOURCES = unit/test-slot-manager.c unit/fake_watch.c \
|
||||
src/slot-manager.c src/cell-info.c src/sim-info.c \
|
||||
src/storage.c src/log.c
|
||||
unit/fake_cell_info.c src/slot-manager.c \
|
||||
src/cell-info.c src/cell-info-control.c \
|
||||
src/sim-info.c src/storage.c src/log.c
|
||||
unit_test_slot_manager_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
||||
-DSTORAGEDIR='"/tmp/ofono"'
|
||||
unit_test_slot_manager_LDADD = @GLIB_LIBS@ -ldl
|
||||
@@ -963,6 +980,7 @@ unit_objects += $(unit_test_slot_manager_OBJECTS)
|
||||
unit_tests += unit/test-slot-manager
|
||||
|
||||
unit_test_watch_SOURCES = unit/test-watch.c src/watch.c \
|
||||
src/cell-info.c src/cell-info-control.c \
|
||||
src/log.c src/watchlist.c
|
||||
unit_test_watch_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
||||
-DSTORAGEDIR='"/tmp/ofono"'
|
||||
|
||||
@@ -12,7 +12,8 @@ AC_DEFUN([AC_PROG_CC_PIE], [
|
||||
|
||||
AC_DEFUN([COMPILER_FLAGS], [
|
||||
if (test "${CFLAGS}" = ""); then
|
||||
CFLAGS="-Wall -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
|
||||
CFLAGS="-Wall -O2 -fsigned-char -fno-exceptions"
|
||||
CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
|
||||
fi
|
||||
if (test "$USE_MAINTAINER_MODE" = "yes"); then
|
||||
CFLAGS="$CFLAGS -Werror -Wextra"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.60)
|
||||
AC_INIT(ofono, 1.25)
|
||||
AC_INIT(ofono, 1.29)
|
||||
|
||||
AM_INIT_AUTOMAKE([foreign subdir-objects color-tests])
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
164
ofono/doc/common-patterns.txt
Normal file
164
ofono/doc/common-patterns.txt
Normal file
@@ -0,0 +1,164 @@
|
||||
Every project has its own recursive patterns, and oFono is not an exception.
|
||||
This document describes the most common ones found in the code.
|
||||
|
||||
Typical flow for atom <-> atom driver operations
|
||||
================================================
|
||||
Most of the time, the core atom for a given request calls a function in
|
||||
the atom driver, which generally executes some commands against the modem,
|
||||
and can then return the results to the core.
|
||||
|
||||
For example:
|
||||
|
||||
dbus call: lte/SetProperty(DefaultAPN)
|
||||
|
|
||||
v
|
||||
core: check APN validity, call the modem atom for execution in the modem
|
||||
|
|
||||
v
|
||||
atom driver: schedules 'AT+CGDCONT=0,"IP","MyNiceAPN"' for execution
|
||||
|
|
||||
[ break in the flow: the functions return back to the core, the dbus request ]
|
||||
[ is not answered at this time ]
|
||||
...
|
||||
[GLibMain event loop schedules the command, it is sent to the modem and the ]
|
||||
[ modem's reply is obtained ]
|
||||
|
|
||||
v
|
||||
atom driver: a callback function, optionally provided when AT command was
|
||||
scheduled is now called
|
||||
|
|
||||
v
|
||||
core: atom driver core callback function is now called. This was passed from
|
||||
the core as an argument, earlier, when the atom driver operation was invoked,
|
||||
along with some context data (opaque info for the atom driver containing core
|
||||
atom owned data)
|
||||
|
|
||||
v
|
||||
the core can now answer the dbus message
|
||||
|
||||
|
||||
In the code, it looks like this:
|
||||
|
||||
//core call:
|
||||
static DBusMessage *lte_set_property(DBusConnection *conn,
|
||||
DBusMessage *msg, void *data)
|
||||
{
|
||||
struct ofono_lte *lte = data;
|
||||
|
||||
/*
|
||||
* a block of code here processes the msg and fills the
|
||||
* lte->pending_info structure
|
||||
*/
|
||||
|
||||
lte->driver->set_default_attach_info(lte, <e->pending_info,
|
||||
lte_set_default_attach_info_cb, lte);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
// lte_set_default_attach_info_cb is the core callback function,
|
||||
// the lte structure is the parameter that it takes
|
||||
|
||||
//atom:
|
||||
static void at_lte_set_default_attach_info(const struct ofono_lte *lte,
|
||||
const struct ofono_lte_default_attach_info *info,
|
||||
ofono_lte_cb_t cb, void *data)
|
||||
{
|
||||
struct lte_driver_data *ldd = ofono_lte_get_data(lte);
|
||||
|
||||
// next line creates a structure for the in-atom callback
|
||||
struct cb_data *cbd = cb_data_new(cb, data);
|
||||
|
||||
if (g_at_chat_send(ldd->chat, "AT", NULL,
|
||||
at_lte_set_default_attach_info_cb,
|
||||
cbd, g_free) > 0)
|
||||
return;
|
||||
|
||||
g_free(cbd);
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
}
|
||||
// here the structure is allocate dynamically, and since it is quite common,
|
||||
// the function g_at_chat_send accepts the last 3 parameters:
|
||||
// - in-atom callback function
|
||||
// - in-atom callback data
|
||||
// - destroy function for dynamically-allocated callback data
|
||||
// NOTE: if g_at_chat_send fails, it does not free the memory, so it must be
|
||||
// done after the call.
|
||||
// Note also the callback to the core directly here if the g_at_chat_send fails.
|
||||
|
||||
//atom callback:
|
||||
|
||||
static void at_lte_set_default_attach_info_cb(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
|
||||
if (result == NULL) {
|
||||
CALLBACK_WITH_FAILURE(cbd->cb, cbd->data);
|
||||
return;
|
||||
}
|
||||
|
||||
decode_at_error(&error, g_at_result_final_response(result));
|
||||
cbd->cb(&error, cbd->data);
|
||||
}
|
||||
// note that here cbd must not be released, it will be done by the GAtChat
|
||||
// after invoking the callback (at_lte_set_default_attach_info_cb)
|
||||
// note also that the core function will be executed before cbd is released,
|
||||
// so the last line of the code is ok.
|
||||
|
||||
|
||||
Use of the cb_data in AT command based atom drivers
|
||||
===================================================
|
||||
|
||||
the cb_data can be used by creating the structure with cb_data_new,
|
||||
and then there are two possibilities:
|
||||
- use it in a single callback function, and destroy it with a call to
|
||||
g_free.
|
||||
Example:
|
||||
- calling function:
|
||||
struct cb_data *cbd = cb_data_new(cb, data);
|
||||
if (g_at_chat_send(chat, buf, NULL, at_cgatt_cb, cbd, g_free) > 0)
|
||||
return;
|
||||
g_free(cbd);
|
||||
- called function (here at_cgatt_cb):
|
||||
static void at_cgatt_cb(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
ofono_gprs_cb_t cb = cbd->cb;
|
||||
struct ofono_error error;
|
||||
|
||||
decode_at_error(&error,
|
||||
g_at_result_final_response(result));
|
||||
|
||||
cb(&error, cbd->data);
|
||||
}
|
||||
note the absence of explicit g_free(cbd);
|
||||
|
||||
- pass it through a train of callback functions, adding a reference at
|
||||
each pass cb_data_ref, and removing it with cb_data_unref.
|
||||
the use of cb_data_ref would replace a new object creation, while the
|
||||
use of cb_data_unref the use of g_free.
|
||||
Example:
|
||||
- calling function:
|
||||
struct cb_data *cbd = cb_data_new(cb, data);
|
||||
// no cb_ref at the creation
|
||||
if (g_at_chat_send(chat, buf, NULL,
|
||||
at_lte_set_default_attach_info_cb,
|
||||
cbd, cb_data_unref) > 0)
|
||||
goto end;
|
||||
cb_data_unref(cbd);
|
||||
- called function 1 (at_lte_set_default_attach_info_cb):
|
||||
static void at_lte_set_default_attach_info_cb(gboolean ok,
|
||||
GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
|
||||
cbd = cb_data_ref(cbd);
|
||||
if (g_at_chat_send(chat, buf, NULL,
|
||||
at_cgatt_cb, cbd, cb_data_unref) > 0)
|
||||
return;
|
||||
cb_data_unref(cbd);
|
||||
}
|
||||
- called function 2 (at_cgatt_cb):
|
||||
like above. no call to g_free or cb_data_unref. The terminal function
|
||||
doesn't need to know about the reference scheme.
|
||||
@@ -201,7 +201,8 @@ Properties boolean Active [readwrite]
|
||||
|
||||
string AuthenticationMethod [readwrite]
|
||||
Holds the PPP authentication method to use. Valid
|
||||
values are "pap" and "chap". Defaults to "chap".
|
||||
values are "pap", "chap" and "none".
|
||||
Defaults to "chap".
|
||||
|
||||
string Username [readwrite]
|
||||
|
||||
|
||||
137
ofono/doc/intel-lte-coex-api.txt
Normal file
137
ofono/doc/intel-lte-coex-api.txt
Normal file
@@ -0,0 +1,137 @@
|
||||
LTE Coexistence hierarchy
|
||||
=========================
|
||||
|
||||
Service org.ofono
|
||||
Interface org.ofono.intel.LteCoexistence
|
||||
Object path [variable prefix]/{modem0,modem1,...}
|
||||
|
||||
Methods dict GetProperties()
|
||||
|
||||
Returns all coexistence configuration properties.
|
||||
|
||||
void SetProperty(string property, variant value)
|
||||
|
||||
Changes the value of the specified property. Only
|
||||
properties that are listed as Read-write are changeable.
|
||||
On success a PropertyChanged signal will be emitted.
|
||||
|
||||
Possible Errors: [service].Error.InProgress
|
||||
[service].Error.InvalidArguments
|
||||
[service].Error.Failed
|
||||
|
||||
void RegisterAgent(object path)
|
||||
|
||||
Registers an agent which will be called whenever the
|
||||
modem initiates LTE Coexistence information.
|
||||
|
||||
Possible Errors: [service].Error.InProgress
|
||||
[service].Error.InvalidArguments
|
||||
[service].Error.InvalidFormat
|
||||
[service].Error.Failed
|
||||
|
||||
void UnregisterAgent(object path)
|
||||
|
||||
Unregisters an agent.
|
||||
|
||||
Possible Errors: [service].Error.InvalidArguments
|
||||
[service].Error.Failed
|
||||
|
||||
a(a{sv}) GetPlmnHistory()
|
||||
Requests for LTE Plmn history list stored in NVM to
|
||||
retrieve geo location history like MobileNetworkCode,
|
||||
MobileCountryCode, LteBandsFDD, LteBandsTDD,
|
||||
ChannelBandwidth.
|
||||
|
||||
Refer to the sections below for which property types
|
||||
are available, their valid value ranges and
|
||||
applicability to different cell types.
|
||||
|
||||
Signals PropertyChanged(string property, variant value)
|
||||
|
||||
This signal indicates a changed value of the given
|
||||
property.
|
||||
|
||||
Properties string Band [readwrite]
|
||||
|
||||
Frequency band in which the modem is operating when
|
||||
using "lte" mode.
|
||||
|
||||
boolean BTActive [readwrite]
|
||||
|
||||
Contains whether BT Coex is activated or not.
|
||||
|
||||
boolean WLANActive [readwrite]
|
||||
|
||||
Contains whether WLAN Coex is activated or not.
|
||||
|
||||
string WLANBandwidth [readwrite]
|
||||
|
||||
Contains the frequency WLAN Coex is activated on, when
|
||||
"CoexWLANActive" is active.
|
||||
|
||||
The possible values are:
|
||||
- "20MHz"
|
||||
- "40MHz"
|
||||
- "80MHz"
|
||||
|
||||
LTECoexistenceAgent Hierarchy [experimental]
|
||||
=============================
|
||||
|
||||
Service unique name
|
||||
Interface org.ofono.intel.LteCoexistenceAgent
|
||||
Object path freely definable
|
||||
|
||||
Methods void ReceiveBluetoothNotification(array{byte} notification,
|
||||
dict info) [noreply]
|
||||
|
||||
Requests the agent to process Bluetooth related LTE
|
||||
Coexistence information. The dictionary info contains
|
||||
vector table with modem recommended Safe Tx/Rx band and
|
||||
range information.The properties involved are
|
||||
'SafeTxMin', 'SafeRxMin', 'SafeTxMax', 'SafeRxMax' and
|
||||
'SafeVector'.
|
||||
|
||||
Possible Errors: None
|
||||
|
||||
void ReceiveWiFiNotification(array{byte} notification,
|
||||
dict info) [noreply]
|
||||
|
||||
Requests the agent to process WiFi related LTE
|
||||
Coexistence information. The dictionary info contains
|
||||
vector table with modem recommended SafeTx/Rx band and
|
||||
range information. The properties involved are
|
||||
'SafeTxMin', 'SafeRxMin', 'SafeTxMax', 'SafeRxMax' and
|
||||
'SafeVector'.
|
||||
|
||||
Possible Errors: None
|
||||
|
||||
void Release() [noreply]
|
||||
|
||||
Agent is being released, possibly because of oFono
|
||||
terminating, Coex interface is being torn down or modem
|
||||
off. No UnregisterAgent call is needed.
|
||||
|
||||
LTE Plmn history params
|
||||
=======================
|
||||
uint16 MobileNetworkCode [readonly, optional]
|
||||
|
||||
Contains the MNC of the cell.
|
||||
|
||||
uint16 MobileCountryCode [readonly, optional]
|
||||
|
||||
Contains the MCC of the cell.
|
||||
|
||||
uint32 LteBandsFDD [readonly, optional]
|
||||
|
||||
Contains the Lte FDD band. Valid range of values is 1 to 32 as per
|
||||
3GPP 36.101 Section 5.5.
|
||||
|
||||
uint32 LteBandsTDD [readonly, optional]
|
||||
|
||||
Contains the Lte TDD band. Valid range of values is 33 to 64 as per
|
||||
3GPP 36.101 Section 5.5.
|
||||
|
||||
byte ChannelBandwidth [readonly, optional]
|
||||
|
||||
Contains the Channel bandwidth. Valid range of values is 0 to 6 as per
|
||||
3GPP 36.101 Section 5.6.
|
||||
@@ -33,3 +33,39 @@ Properties string DefaultAccessPointName [readwrite]
|
||||
|
||||
Setting this property to an empty string clears the
|
||||
default APN from the modem.
|
||||
|
||||
string Protocol [readwrite, experimental]
|
||||
|
||||
Holds the protocol for this context. Valid values
|
||||
are: "ip", "ipv6" and "dual". Default value is "ip".
|
||||
|
||||
string AuthenticationMethod [readwrite, experimental]
|
||||
|
||||
Sets the Method used for the authentication
|
||||
for the default APN.
|
||||
|
||||
Available values are "none", "pap" and "chap".
|
||||
Default is "none".
|
||||
|
||||
If the AuthenticationMethod is set to 'none',
|
||||
no authentication is performed for the default attach
|
||||
APN. Username and Password properties are ignored,
|
||||
even if containing a valid value. If Username or
|
||||
Password are empty, AuthenticationMethod is implicitly
|
||||
assumed to be set to 'none'.
|
||||
|
||||
If the default APN supports authentication and it
|
||||
fails, then it is up to the network how to proceed.
|
||||
In general LTE access is denied and the modem can
|
||||
fallback to a legacy technology if capable and another
|
||||
radio technology is available.
|
||||
|
||||
string Username [readwrite, experimental]
|
||||
|
||||
Holds the username to be used for authentication
|
||||
purposes.
|
||||
|
||||
string Password [readwrite, experimental]
|
||||
|
||||
Holds the password to be used for authentication
|
||||
purposes.
|
||||
|
||||
@@ -104,6 +104,16 @@ Properties string ServiceCenterAddress
|
||||
"turkish" - Turkish alphabet
|
||||
"spanish" - Spanish alphabet
|
||||
"portuguese" - Portuguese alphabet
|
||||
"bengali" - Bengali alphabet
|
||||
"gujarati" - Gujarati alphabet
|
||||
"hindi" - Hindi alphabet
|
||||
"kannada" - Kannada alphabet
|
||||
"malayalam" - Malayalam alphabet
|
||||
"oriya" - Oriya alphabet
|
||||
"punjabi"- Punjabi alphabet
|
||||
"tamil" - Tamil alphabet
|
||||
"telugu" - Telugu alphabet
|
||||
"urdu" - Urdu alphabet
|
||||
|
||||
The standard, language-specific alphabets are defined
|
||||
in 3GPP TS23.038, Annex A. By default, oFono uses
|
||||
|
||||
@@ -82,7 +82,9 @@ Properties string Mode [readonly]
|
||||
|
||||
string Status [readonly]
|
||||
|
||||
The current registration status of a modem.
|
||||
The current registration status of a modem. In case
|
||||
technology is 'lte', 'registered' and 'roaming' may
|
||||
not necessarily mean voice calling available.
|
||||
|
||||
The possible values are:
|
||||
"unregistered" Not registered to any network
|
||||
|
||||
@@ -205,3 +205,15 @@ Properties boolean Present [readonly]
|
||||
|
||||
Contains the SIM's ImsPrivateIdentity, read from the
|
||||
ISIM.
|
||||
|
||||
uint32 CardSlotCount [readonly, experimental]
|
||||
|
||||
Contains the count of number of SIM card slots available.
|
||||
|
||||
uint32 ActiveCardSlot [readwrite, experimental]
|
||||
|
||||
Contains the index of the currently active SIM card slot
|
||||
for dual SIM single active mode.
|
||||
|
||||
This property will range from 1 (default) to
|
||||
CardSlotCount (max) value.
|
||||
|
||||
@@ -10,3 +10,13 @@ On the i-Tetra tracking device, the SIM900 is accessed
|
||||
via N_GSM mux device. We use ofono as SMS message
|
||||
service and incoming voice calls service, so we
|
||||
use /dev/gsmtty1 provided by N_GSM mux.
|
||||
|
||||
SIM800 modem usage
|
||||
==================
|
||||
|
||||
When using sim800 modem, the udev rule is the same as the
|
||||
sim900 rule :
|
||||
|
||||
KERNEL=="ttyS3", ENV{OFONO_DRIVER}="sim900"
|
||||
|
||||
Because the SIM800 and SIM900 code are the merged into one driver.
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2018 Gemalto M2M
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -654,3 +655,46 @@ int at_util_get_ipv4_address_and_netmask(const char *addrnetmask,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int at_util_gprs_auth_method_to_auth_prot(
|
||||
enum ofono_gprs_auth_method auth_method)
|
||||
{
|
||||
switch (auth_method) {
|
||||
case OFONO_GPRS_AUTH_METHOD_ANY:
|
||||
case OFONO_GPRS_AUTH_METHOD_PAP:
|
||||
return 1;
|
||||
case OFONO_GPRS_AUTH_METHOD_CHAP:
|
||||
return 2;
|
||||
case OFONO_GPRS_AUTH_METHOD_NONE:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *at_util_gprs_proto_to_pdp_type(enum ofono_gprs_proto proto)
|
||||
{
|
||||
switch (proto) {
|
||||
case OFONO_GPRS_PROTO_IPV6:
|
||||
return "IPV6";
|
||||
case OFONO_GPRS_PROTO_IPV4V6:
|
||||
return "IPV4V6";
|
||||
break;
|
||||
case OFONO_GPRS_PROTO_IP:
|
||||
return "IP";
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *at_util_get_cgdcont_command(guint cid, enum ofono_gprs_proto proto,
|
||||
const char *apn)
|
||||
{
|
||||
const char *pdp_type = at_util_gprs_proto_to_pdp_type(proto);
|
||||
|
||||
if (!apn)
|
||||
return g_strdup_printf("AT+CGDCONT=%u", cid);
|
||||
|
||||
return g_strdup_printf("AT+CGDCONT=%u,\"%s\",\"%s\"", cid, pdp_type,
|
||||
apn);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2018 Gemalto M2M
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -86,7 +87,24 @@ void at_util_sim_state_query_free(struct at_util_sim_state_query *req);
|
||||
int at_util_get_ipv4_address_and_netmask(const char *addrnetmask,
|
||||
char *address, char *netmask);
|
||||
|
||||
int at_util_gprs_auth_method_to_auth_prot(
|
||||
enum ofono_gprs_auth_method auth_method);
|
||||
|
||||
const char *at_util_gprs_proto_to_pdp_type(enum ofono_gprs_proto proto);
|
||||
|
||||
/*
|
||||
* at_util_get_cgdcont_command
|
||||
* if the apn pointer is NULL, the context will be removed: the resulting
|
||||
* string will be like: AT+CGDCONT=7
|
||||
* but if apn pointer is not NULL and the string is empty, then
|
||||
* this function will create a normal context with empty apn, like:
|
||||
* AT+CGDCONT=4,"IPV6",""
|
||||
*/
|
||||
char *at_util_get_cgdcont_command(guint cid, enum ofono_gprs_proto proto,
|
||||
const char *apn);
|
||||
|
||||
struct cb_data {
|
||||
gint ref_count;
|
||||
void *cb;
|
||||
void *data;
|
||||
void *user;
|
||||
@@ -97,12 +115,29 @@ static inline struct cb_data *cb_data_new(void *cb, void *data)
|
||||
struct cb_data *ret;
|
||||
|
||||
ret = g_new0(struct cb_data, 1);
|
||||
ret->ref_count = 1;
|
||||
ret->cb = cb;
|
||||
ret->data = data;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline struct cb_data *cb_data_ref(struct cb_data *cbd)
|
||||
{
|
||||
cbd->ref_count++;
|
||||
return cbd;
|
||||
}
|
||||
|
||||
static inline void cb_data_unref(gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
|
||||
if (--cbd->ref_count)
|
||||
return;
|
||||
|
||||
g_free(cbd);
|
||||
}
|
||||
|
||||
static inline int at_util_convert_signal_strength(int strength)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -212,7 +211,7 @@ static void at_call_barring_remove(struct ofono_call_barring *cb)
|
||||
ofono_call_barring_set_data(cb, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_call_barring_driver driver = {
|
||||
static const struct ofono_call_barring_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_call_barring_probe,
|
||||
.remove = at_call_barring_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -264,7 +263,7 @@ static void at_ccfc_remove(struct ofono_call_forwarding *cf)
|
||||
ofono_call_forwarding_set_data(cf, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_call_forwarding_driver driver = {
|
||||
static const struct ofono_call_forwarding_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_ccfc_probe,
|
||||
.remove = at_ccfc_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -331,7 +330,7 @@ static void at_caoc_remove(struct ofono_call_meter *cm)
|
||||
ofono_call_meter_set_data(cm, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_call_meter_driver driver = {
|
||||
static const struct ofono_call_meter_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_caoc_probe,
|
||||
.remove = at_caoc_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -398,7 +397,7 @@ static void at_call_settings_remove(struct ofono_call_settings *cs)
|
||||
ofono_call_settings_set_data(cs, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_call_settings_driver driver = {
|
||||
static const struct ofono_call_settings_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_call_settings_probe,
|
||||
.remove = at_call_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -207,7 +206,7 @@ static void at_call_volume_remove(struct ofono_call_volume *cv)
|
||||
g_free(cvd);
|
||||
}
|
||||
|
||||
static struct ofono_call_volume_driver driver = {
|
||||
static const struct ofono_call_volume_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_call_volume_probe,
|
||||
.remove = at_call_volume_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -304,7 +303,7 @@ static void at_cbs_remove(struct ofono_cbs *cbs)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_cbs_driver driver = {
|
||||
static const struct ofono_cbs_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_cbs_probe,
|
||||
.remove = at_cbs_remove,
|
||||
|
||||
@@ -153,7 +153,7 @@ static void at_devinfo_remove(struct ofono_devinfo *info)
|
||||
g_at_chat_unref(chat);
|
||||
}
|
||||
|
||||
static struct ofono_devinfo_driver driver = {
|
||||
static const struct ofono_devinfo_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_devinfo_probe,
|
||||
.remove = at_devinfo_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -263,7 +262,7 @@ static void at_gnss_remove(struct ofono_gnss *gnss)
|
||||
g_free(gd);
|
||||
}
|
||||
|
||||
static struct ofono_gnss_driver driver = {
|
||||
static const struct ofono_gnss_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_gnss_probe,
|
||||
.remove = at_gnss_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -488,7 +487,7 @@ static void at_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_gprs_context_probe,
|
||||
.remove = at_gprs_context_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -456,7 +455,6 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
FALSE, gprs, NULL);
|
||||
break;
|
||||
case OFONO_VENDOR_UBLOX:
|
||||
case OFONO_VENDOR_UBLOX_TOBY_L2:
|
||||
g_at_chat_register(gd->chat, "+UREG:", ublox_ureg_notify,
|
||||
FALSE, gprs, NULL);
|
||||
g_at_chat_send(gd->chat, "AT+UREG=1", none_prefix,
|
||||
@@ -642,7 +640,7 @@ static void at_gprs_remove(struct ofono_gprs *gprs)
|
||||
g_free(gd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_driver driver = {
|
||||
static const struct ofono_gprs_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_gprs_probe,
|
||||
.remove = at_gprs_remove,
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2017 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2018 Gemalto M2M
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -23,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -41,45 +41,88 @@
|
||||
|
||||
#include "atmodem.h"
|
||||
|
||||
static const char *none_prefix[] = { NULL };
|
||||
|
||||
struct lte_driver_data {
|
||||
GAtChat *chat;
|
||||
struct ofono_lte_default_attach_info pending_info;
|
||||
};
|
||||
|
||||
static void at_lte_set_default_attach_info_cb(gboolean ok, GAtResult *result,
|
||||
static void at_lte_set_auth_cb(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
ofono_lte_cb_t cb = cbd->cb;
|
||||
struct ofono_error error;
|
||||
|
||||
DBG("ok %d", ok);
|
||||
|
||||
decode_at_error(&error, g_at_result_final_response(result));
|
||||
cb(&error, cbd->data);
|
||||
}
|
||||
|
||||
static void at_lte_set_default_attach_info_cb(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
ofono_lte_cb_t cb = cbd->cb;
|
||||
void *data = cbd->data;
|
||||
struct lte_driver_data *ldd = cbd->user;
|
||||
struct ofono_error error;
|
||||
char buf[32 + OFONO_GPRS_MAX_USERNAME_LENGTH +
|
||||
OFONO_GPRS_MAX_PASSWORD_LENGTH + 1];
|
||||
size_t buflen = sizeof(buf);
|
||||
size_t len;
|
||||
enum ofono_gprs_auth_method auth_method;
|
||||
|
||||
if (!ok) {
|
||||
decode_at_error(&error, g_at_result_final_response(result));
|
||||
cb(&error, data);
|
||||
return;
|
||||
}
|
||||
|
||||
auth_method = ldd->pending_info.auth_method;
|
||||
|
||||
/* change the authentication method if the parameters are invalid */
|
||||
if (!*ldd->pending_info.username || !*ldd->pending_info.password)
|
||||
auth_method = OFONO_GPRS_AUTH_METHOD_NONE;
|
||||
|
||||
len = snprintf(buf, buflen, "AT+CGAUTH=0,%d",
|
||||
at_util_gprs_auth_method_to_auth_prot(auth_method));
|
||||
buflen -= len;
|
||||
|
||||
if (auth_method != OFONO_GPRS_AUTH_METHOD_NONE)
|
||||
snprintf(buf + len, buflen, ",\"%s\",\"%s\"",
|
||||
ldd->pending_info.username,
|
||||
ldd->pending_info.password);
|
||||
|
||||
cbd = cb_data_ref(cbd);
|
||||
if (g_at_chat_send(ldd->chat, buf, none_prefix,
|
||||
at_lte_set_auth_cb, cbd, cb_data_unref) > 0)
|
||||
return;
|
||||
|
||||
cb_data_unref(cbd);
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
}
|
||||
|
||||
static void at_lte_set_default_attach_info(const struct ofono_lte *lte,
|
||||
const struct ofono_lte_default_attach_info *info,
|
||||
ofono_lte_cb_t cb, void *data)
|
||||
{
|
||||
struct lte_driver_data *ldd = ofono_lte_get_data(lte);
|
||||
char buf[32 + OFONO_GPRS_MAX_APN_LENGTH + 1];
|
||||
struct cb_data *cbd = cb_data_new(cb, data);
|
||||
char *buf = at_util_get_cgdcont_command(0, info->proto, info->apn);
|
||||
|
||||
DBG("LTE config with APN: %s", info->apn);
|
||||
cbd->user = ldd;
|
||||
memcpy(&ldd->pending_info, info, sizeof(ldd->pending_info));
|
||||
|
||||
if (strlen(info->apn) > 0)
|
||||
snprintf(buf, sizeof(buf), "AT+CGDCONT=0,\"IP\",\"%s\"",
|
||||
info->apn);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "AT+CGDCONT=0,\"IP\"");
|
||||
|
||||
/* We can't do much in case of failure so don't check response. */
|
||||
if (g_at_chat_send(ldd->chat, buf, NULL,
|
||||
at_lte_set_default_attach_info_cb, cbd, g_free) > 0)
|
||||
return;
|
||||
if (g_at_chat_send(ldd->chat, buf, none_prefix,
|
||||
at_lte_set_default_attach_info_cb,
|
||||
cbd, cb_data_unref) > 0)
|
||||
goto end;
|
||||
|
||||
cb_data_unref(cbd);
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
end:
|
||||
g_free(buf);
|
||||
}
|
||||
|
||||
static gboolean lte_delayed_register(gpointer user_data)
|
||||
@@ -124,7 +167,7 @@ static void at_lte_remove(struct ofono_lte *lte)
|
||||
g_free(ldd);
|
||||
}
|
||||
|
||||
static struct ofono_lte_driver driver = {
|
||||
static const struct ofono_lte_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_lte_probe,
|
||||
.remove = at_lte_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -179,7 +178,7 @@ static int option_parse_tech(GAtResult *result)
|
||||
return tech;
|
||||
}
|
||||
|
||||
static int cinterion_parse_tech(GAtResult *result)
|
||||
static int gemalto_parse_tech(GAtResult *result)
|
||||
{
|
||||
int tech = -1;
|
||||
GAtResultIter iter;
|
||||
@@ -235,13 +234,13 @@ static void at_creg_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
cb(&error, status, lac, ci, tech, cbd->data);
|
||||
}
|
||||
|
||||
static void cinterion_query_tech_cb(gboolean ok, GAtResult *result,
|
||||
static void gemalto_query_tech_cb(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct tech_query *tq = user_data;
|
||||
int tech;
|
||||
|
||||
tech = cinterion_parse_tech(result);
|
||||
tech = gemalto_parse_tech(result);
|
||||
|
||||
ofono_netreg_status_notify(tq->netreg,
|
||||
tq->status, tq->lac, tq->ci, tech);
|
||||
@@ -880,7 +879,7 @@ static void telit_ciev_notify(GAtResult *result, gpointer user_data)
|
||||
ofono_netreg_strength_notify(netreg, strength);
|
||||
}
|
||||
|
||||
static void cinterion_ciev_notify(GAtResult *result, gpointer user_data)
|
||||
static void gemalto_ciev_notify(GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_netreg *netreg = user_data;
|
||||
struct netreg_data *nd = ofono_netreg_get_data(netreg);
|
||||
@@ -1560,12 +1559,12 @@ static void creg_notify(GAtResult *result, gpointer user_data)
|
||||
option_query_tech_cb, tq, g_free) > 0)
|
||||
return;
|
||||
break;
|
||||
case OFONO_VENDOR_CINTERION:
|
||||
if (g_at_chat_send(nd->chat, "AT^SMONI",
|
||||
smoni_prefix,
|
||||
cinterion_query_tech_cb, tq, g_free) > 0)
|
||||
return;
|
||||
break;
|
||||
case OFONO_VENDOR_GEMALTO:
|
||||
if (g_at_chat_send(nd->chat, "AT^SMONI",
|
||||
smoni_prefix,
|
||||
gemalto_query_tech_cb, tq, g_free) > 0)
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
g_free(tq);
|
||||
@@ -1656,8 +1655,11 @@ static ofono_bool_t build_cmer_string(char *buf, int *cmer_opts,
|
||||
DBG("");
|
||||
|
||||
switch (nd->vendor) {
|
||||
case OFONO_VENDOR_UBLOX_TOBY_L2:
|
||||
/* UBX-13002752 R33: TOBY L2 doesn't support mode 2 and 3 */
|
||||
case OFONO_VENDOR_UBLOX:
|
||||
/* For all u-blox models, mode 3 is equivalent to mode 1;
|
||||
* since some models do not support setting modes 2 nor 3
|
||||
* (see UBX-13002752), we prefer mode 1 for all models.
|
||||
*/
|
||||
mode = "1";
|
||||
break;
|
||||
default:
|
||||
@@ -2032,12 +2034,12 @@ static void at_creg_set_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
g_at_chat_send(nd->chat, "AT*TLTS=1", none_prefix,
|
||||
NULL, NULL, NULL);
|
||||
break;
|
||||
case OFONO_VENDOR_CINTERION:
|
||||
case OFONO_VENDOR_GEMALTO:
|
||||
/*
|
||||
* We can't set rssi bounds from Cinterion responses
|
||||
* We can't set rssi bounds from Gemalto responses
|
||||
* so set them up to specified values here
|
||||
*
|
||||
* Cinterion rssi signal strength specified as:
|
||||
* Gemalto rssi signal strength specified as:
|
||||
* 0 <= -112dBm
|
||||
* 1 - 4 signal strengh in 15 dB steps
|
||||
* 5 >= -51 dBm
|
||||
@@ -2051,7 +2053,7 @@ static void at_creg_set_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
g_at_chat_send(nd->chat, "AT^SIND=\"rssi\",1", none_prefix,
|
||||
NULL, NULL, NULL);
|
||||
g_at_chat_register(nd->chat, "+CIEV:",
|
||||
cinterion_ciev_notify, FALSE, netreg, NULL);
|
||||
gemalto_ciev_notify, FALSE, netreg, NULL);
|
||||
break;
|
||||
case OFONO_VENDOR_NOKIA:
|
||||
case OFONO_VENDOR_SAMSUNG:
|
||||
@@ -2155,7 +2157,7 @@ static void at_netreg_remove(struct ofono_netreg *netreg)
|
||||
g_free(nd);
|
||||
}
|
||||
|
||||
static struct ofono_netreg_driver driver = {
|
||||
static const struct ofono_netreg_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_netreg_probe,
|
||||
.remove = at_netreg_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -593,7 +592,7 @@ static void at_phonebook_remove(struct ofono_phonebook *pb)
|
||||
g_free(pbd);
|
||||
}
|
||||
|
||||
static struct ofono_phonebook_driver driver = {
|
||||
static const struct ofono_phonebook_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_phonebook_probe,
|
||||
.remove = at_phonebook_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -76,6 +75,7 @@ static const char *cuad_prefix[] = { "+CUAD:", NULL };
|
||||
static const char *ccho_prefix[] = { "+CCHO:", NULL };
|
||||
static const char *crla_prefix[] = { "+CRLA:", NULL };
|
||||
static const char *cgla_prefix[] = { "+CGLA:", NULL };
|
||||
static const char *xcmscsc_prefix[] = { "+XCMSCSC:", NULL};
|
||||
static const char *none_prefix[] = { NULL };
|
||||
|
||||
static void append_file_path(char *buf, const unsigned char *path,
|
||||
@@ -1161,6 +1161,7 @@ static void at_pin_retries_query(struct ofono_sim *sim,
|
||||
DBG("");
|
||||
|
||||
switch (sd->vendor) {
|
||||
case OFONO_VENDOR_XMM:
|
||||
case OFONO_VENDOR_IFX:
|
||||
if (g_at_chat_send(sd->chat, "AT+XPINCNT", xpincnt_prefix,
|
||||
xpincnt_cb, cbd, g_free) > 0)
|
||||
@@ -1222,7 +1223,6 @@ static void at_pin_retries_query(struct ofono_sim *sim,
|
||||
return;
|
||||
break;
|
||||
case OFONO_VENDOR_UBLOX:
|
||||
case OFONO_VENDOR_UBLOX_TOBY_L2:
|
||||
if (g_at_chat_send(sd->chat, "AT+UPINCNT", upincnt_prefix,
|
||||
upincnt_cb, cbd, g_free) > 0)
|
||||
return;
|
||||
@@ -1922,6 +1922,83 @@ static void at_logical_access(struct ofono_sim *sim, int session_id,
|
||||
CALLBACK_WITH_FAILURE(cb, NULL, 0, data);
|
||||
}
|
||||
|
||||
static void xcmscsc_query_cb(gboolean ok, GAtResult *result, gpointer user)
|
||||
{
|
||||
struct ofono_sim *sim = user;
|
||||
struct sim_data *sd = ofono_sim_get_data(sim);
|
||||
GAtResultIter iter;
|
||||
int active_slot;
|
||||
|
||||
if (!ok)
|
||||
goto done;
|
||||
|
||||
g_at_result_iter_init(&iter, result);
|
||||
|
||||
if (!g_at_result_iter_next(&iter, "+XCMSCSC:"))
|
||||
goto done;
|
||||
|
||||
g_at_result_iter_skip_next(&iter);
|
||||
g_at_result_iter_skip_next(&iter);
|
||||
|
||||
g_at_result_iter_next_number(&iter, &active_slot);
|
||||
|
||||
/* set active SIM slot */
|
||||
ofono_sim_set_active_card_slot(sim, active_slot + 1);
|
||||
|
||||
done:
|
||||
/* Query supported <fac>s */
|
||||
g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
|
||||
at_clck_query_cb, sim, NULL);
|
||||
}
|
||||
|
||||
static void at_xcmscsc_test_cb(gboolean ok, GAtResult *result, gpointer user)
|
||||
{
|
||||
struct ofono_sim *sim = user;
|
||||
struct sim_data *sd = ofono_sim_get_data(sim);
|
||||
GAtResultIter iter;
|
||||
int card_slot_count;
|
||||
|
||||
if (!ok)
|
||||
goto done;
|
||||
|
||||
g_at_result_iter_init(&iter, result);
|
||||
|
||||
if (!g_at_result_iter_next(&iter, "+XCMSCSC:"))
|
||||
goto done;
|
||||
|
||||
g_at_result_iter_skip_next(&iter);
|
||||
g_at_result_iter_skip_next(&iter);
|
||||
|
||||
if (!g_at_result_iter_open_list(&iter))
|
||||
goto done;
|
||||
|
||||
g_at_result_iter_skip_next(&iter);
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &card_slot_count))
|
||||
goto done;
|
||||
|
||||
/* Set num slots */
|
||||
ofono_sim_set_card_slot_count(sim, card_slot_count + 1);
|
||||
|
||||
/*
|
||||
* enable reporting of MSIM remap status information
|
||||
* and enable automatic acceptance of MSIM Remap
|
||||
* acknowledgement
|
||||
*/
|
||||
g_at_chat_send(sd->chat, "AT+XCMSRS=2", none_prefix,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
/* Query active card slot */
|
||||
g_at_chat_send(sd->chat, "AT+XCMSCSC?", xcmscsc_prefix,
|
||||
xcmscsc_query_cb, sim, NULL);
|
||||
return;
|
||||
|
||||
done:
|
||||
/* Query supported <fac>s */
|
||||
g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
|
||||
at_clck_query_cb, sim, NULL);
|
||||
}
|
||||
|
||||
static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
|
||||
void *data)
|
||||
{
|
||||
@@ -1940,6 +2017,10 @@ static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
|
||||
if (at_clck_cpwd_fac[i])
|
||||
sd->passwd_type_mask |= (1 << i);
|
||||
|
||||
if (sd->vendor == OFONO_VENDOR_XMM)
|
||||
return g_at_chat_send(sd->chat, "AT+XCMSCSC=?", xcmscsc_prefix,
|
||||
at_xcmscsc_test_cb, sim, NULL) ? 0 : -1;
|
||||
|
||||
/* Query supported <fac>s */
|
||||
return g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
|
||||
at_clck_query_cb, sim, NULL) ? 0 : -1;
|
||||
@@ -1959,7 +2040,47 @@ static void at_sim_remove(struct ofono_sim *sim)
|
||||
g_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_sim_driver driver = {
|
||||
static void xcmscsc_cb(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct cb_data *cbd = user_data;
|
||||
ofono_sim_set_active_card_slot_cb_t cb = cbd->cb;
|
||||
struct ofono_error error;
|
||||
|
||||
decode_at_error(&error, g_at_result_final_response(result));
|
||||
|
||||
if (cb)
|
||||
cb(&error, cbd->data);
|
||||
}
|
||||
|
||||
static void at_set_active_card_slot(struct ofono_sim *sim, unsigned int index,
|
||||
ofono_sim_set_active_card_slot_cb_t cb, void *data)
|
||||
{
|
||||
struct sim_data *sd = ofono_sim_get_data(sim);
|
||||
struct cb_data *cbd = cb_data_new(cb, data);
|
||||
char cmd[43];
|
||||
|
||||
if (sd->vendor != OFONO_VENDOR_XMM) {
|
||||
struct ofono_error error;
|
||||
error.type = OFONO_ERROR_TYPE_CME;
|
||||
error.error = 4;
|
||||
|
||||
cb(&error, data);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enable single SIM mode for indicated card slot id */
|
||||
snprintf(cmd, sizeof(cmd), "AT+XCMSCSC=1,0,%u,1", index);
|
||||
|
||||
if (g_at_chat_send(sd->chat, cmd, none_prefix, xcmscsc_cb,
|
||||
cbd, g_free) > 0)
|
||||
return;
|
||||
|
||||
g_free(cbd);
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
}
|
||||
|
||||
static const struct ofono_sim_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_sim_probe,
|
||||
.remove = at_sim_remove,
|
||||
@@ -1984,10 +2105,11 @@ static struct ofono_sim_driver driver = {
|
||||
.session_read_binary = at_session_read_binary,
|
||||
.session_read_record = at_session_read_record,
|
||||
.session_read_info = at_session_read_info,
|
||||
.logical_access = at_logical_access
|
||||
.logical_access = at_logical_access,
|
||||
.set_active_card_slot = at_set_active_card_slot
|
||||
};
|
||||
|
||||
static struct ofono_sim_driver driver_noef = {
|
||||
static const struct ofono_sim_driver driver_noef = {
|
||||
.name = "atmodem-noef",
|
||||
.probe = at_sim_probe,
|
||||
.remove = at_sim_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -859,8 +858,18 @@ static gboolean build_cnmi_string(char *buf, int *cnmi_opts,
|
||||
data->cnma_enabled ? "21" : "1", FALSE))
|
||||
return FALSE;
|
||||
|
||||
switch (data->vendor) {
|
||||
case OFONO_VENDOR_GEMALTO:
|
||||
mode = "0";
|
||||
break;
|
||||
default:
|
||||
/* Sounds like 2 is the sanest mode */
|
||||
mode = "20";
|
||||
break;
|
||||
}
|
||||
|
||||
/* Always deliver CB via +CBM, otherwise don't deliver at all */
|
||||
if (!append_cnmi_element(buf, &len, cnmi_opts[2], "20", FALSE))
|
||||
if (!append_cnmi_element(buf, &len, cnmi_opts[2], mode, FALSE))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
@@ -1320,7 +1329,7 @@ static void at_sms_remove(struct ofono_sms *sms)
|
||||
ofono_sms_set_data(sms, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_sms_driver driver = {
|
||||
static const struct ofono_sms_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_sms_probe,
|
||||
.remove = at_sms_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -223,7 +222,7 @@ static void at_stk_remove(struct ofono_stk *stk)
|
||||
g_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_stk_driver driver = {
|
||||
static const struct ofono_stk_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_stk_probe,
|
||||
.remove = at_stk_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -92,7 +91,7 @@ static const unsigned char *ucs2_gsm_to_packed(const char *content,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
packed = pack_7bit_own_buf(gsm, written, 0, TRUE, msg_len, 0, msg);
|
||||
packed = pack_7bit_own_buf(gsm, written, 0, true, msg_len, 0, msg);
|
||||
g_free(gsm);
|
||||
|
||||
return packed;
|
||||
@@ -137,7 +136,7 @@ static void cusd_parse(GAtResult *result, struct ofono_ussd *ussd)
|
||||
switch (data->charset) {
|
||||
case AT_UTIL_CHARSET_GSM:
|
||||
msg_ptr = pack_7bit_own_buf((const guint8 *) content,
|
||||
-1, 0, TRUE, &msg_len,
|
||||
-1, 0, true, &msg_len,
|
||||
0, msg);
|
||||
break;
|
||||
|
||||
@@ -201,7 +200,7 @@ static void at_ussd_request(struct ofono_ussd *ussd, int dcs,
|
||||
unsigned char unpacked_buf[182];
|
||||
long written;
|
||||
|
||||
unpack_7bit_own_buf(pdu, len, 0, TRUE, sizeof(unpacked_buf),
|
||||
unpack_7bit_own_buf(pdu, len, 0, true, sizeof(unpacked_buf),
|
||||
&written, 0, unpacked_buf);
|
||||
|
||||
if (written < 1)
|
||||
@@ -327,7 +326,7 @@ static void at_ussd_remove(struct ofono_ussd *ussd)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_ussd_driver driver = {
|
||||
static const struct ofono_ussd_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_ussd_probe,
|
||||
.remove = at_ussd_remove,
|
||||
|
||||
@@ -46,8 +46,6 @@ enum ofono_vendor {
|
||||
OFONO_VENDOR_QUECTEL,
|
||||
OFONO_VENDOR_QUECTEL_M95,
|
||||
OFONO_VENDOR_UBLOX,
|
||||
OFONO_VENDOR_UBLOX_TOBY_L2,
|
||||
OFONO_VENDOR_CINTERION,
|
||||
OFONO_VENDOR_XMM,
|
||||
OFONO_VENDOR_GEMALTO,
|
||||
};
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -1155,7 +1154,7 @@ static void at_voicecall_remove(struct ofono_voicecall *vc)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_voicecall_driver driver = {
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "atmodem",
|
||||
.probe = at_voicecall_probe,
|
||||
.remove = at_voicecall_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -292,7 +291,7 @@ static void calypso_stk_remove(struct ofono_stk *stk)
|
||||
g_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_stk_driver driver = {
|
||||
static const struct ofono_stk_driver driver = {
|
||||
.name = "calypsomodem",
|
||||
.probe = calypso_stk_probe,
|
||||
.remove = calypso_stk_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -402,7 +401,7 @@ static void calypso_voicecall_remove(struct ofono_voicecall *vc)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_voicecall_driver driver = {
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "calypsomodem",
|
||||
.probe = calypso_voicecall_probe,
|
||||
.remove = calypso_voicecall_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -323,7 +322,7 @@ static void cdma_connman_remove(struct ofono_cdma_connman *cm)
|
||||
g_free(cd);
|
||||
}
|
||||
|
||||
static struct ofono_cdma_connman_driver driver = {
|
||||
static const struct ofono_cdma_connman_driver driver = {
|
||||
.name = "cdmamodem",
|
||||
.probe = cdma_connman_probe,
|
||||
.remove = cdma_connman_remove,
|
||||
|
||||
@@ -153,7 +153,7 @@ static void cdma_devinfo_remove(struct ofono_devinfo *info)
|
||||
ofono_devinfo_set_data(info, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_devinfo_driver driver = {
|
||||
static const struct ofono_devinfo_driver driver = {
|
||||
.name = "cdmamodem",
|
||||
.probe = cdma_devinfo_probe,
|
||||
.remove = cdma_devinfo_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -143,7 +142,7 @@ static void cdma_voicecall_remove(struct ofono_cdma_voicecall *vc)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_cdma_voicecall_driver driver = {
|
||||
static const struct ofono_cdma_voicecall_driver driver = {
|
||||
.name = "cdmamodem",
|
||||
.probe = cdma_voicecall_probe,
|
||||
.remove = cdma_voicecall_remove,
|
||||
|
||||
@@ -73,7 +73,7 @@ static void dun_gprs_attached_status(struct ofono_gprs *gprs,
|
||||
CALLBACK_WITH_SUCCESS(cb, 1, data);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_driver driver = {
|
||||
static const struct ofono_gprs_driver driver = {
|
||||
.name = "dunmodem",
|
||||
.probe = dun_gprs_probe,
|
||||
.remove = dun_gprs_remove,
|
||||
|
||||
@@ -107,7 +107,7 @@ static void dun_netreg_remove(struct ofono_netreg *netreg)
|
||||
g_free(nd);
|
||||
}
|
||||
|
||||
static struct ofono_netreg_driver driver = {
|
||||
static const struct ofono_netreg_driver driver = {
|
||||
.name = "dunmodem",
|
||||
.probe = dun_netreg_probe,
|
||||
.remove = dun_netreg_remove,
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2017 Vincent Cesson. All rights reserved.
|
||||
* Copyright (C) 2018 Gemalto M2M
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -35,12 +36,14 @@
|
||||
static int gemaltomodem_init(void)
|
||||
{
|
||||
gemalto_location_reporting_init();
|
||||
gemalto_voicecall_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gemaltomodem_exit(void)
|
||||
{
|
||||
gemalto_voicecall_exit();
|
||||
gemalto_location_reporting_exit();
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2017 Vincent Cesson. All rights reserved.
|
||||
* Copyright (C) 2018 Gemalto M2M
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -23,3 +24,6 @@
|
||||
|
||||
extern void gemalto_location_reporting_init();
|
||||
extern void gemalto_location_reporting_exit();
|
||||
|
||||
extern void gemalto_voicecall_init();
|
||||
extern void gemalto_voicecall_exit();
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -217,7 +216,7 @@ static void gemalto_location_reporting_remove(struct ofono_location_reporting *l
|
||||
g_free(gd);
|
||||
}
|
||||
|
||||
static struct ofono_location_reporting_driver driver = {
|
||||
static const struct ofono_location_reporting_driver driver = {
|
||||
.name = "gemaltomodem",
|
||||
.type = OFONO_LOCATION_REPORTING_TYPE_NMEA,
|
||||
.probe = gemalto_location_reporting_probe,
|
||||
|
||||
576
ofono/drivers/gemaltomodem/voicecall.c
Normal file
576
ofono/drivers/gemaltomodem/voicecall.c
Normal file
@@ -0,0 +1,576 @@
|
||||
/*
|
||||
*
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2018 Gemalto M2M
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <ofono/log.h>
|
||||
#include <ofono/modem.h>
|
||||
#include <ofono/voicecall.h>
|
||||
|
||||
#include "gatchat.h"
|
||||
#include "gatresult.h"
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "gemaltomodem.h"
|
||||
|
||||
static const char *clcc_prefix[] = { "+CLCC:", NULL };
|
||||
static const char *none_prefix[] = { NULL };
|
||||
|
||||
struct voicecall_data {
|
||||
GAtChat *chat;
|
||||
GSList *calls;
|
||||
unsigned int local_release;
|
||||
GSList *new_calls;
|
||||
};
|
||||
|
||||
struct release_id_req {
|
||||
struct ofono_voicecall *vc;
|
||||
ofono_voicecall_cb_t cb;
|
||||
void *data;
|
||||
int id;
|
||||
};
|
||||
|
||||
struct change_state_req {
|
||||
struct ofono_voicecall *vc;
|
||||
ofono_voicecall_cb_t cb;
|
||||
void *data;
|
||||
int affected_types;
|
||||
};
|
||||
|
||||
static void generic_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct change_state_req *req = user_data;
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(req->vc);
|
||||
struct ofono_error error;
|
||||
|
||||
decode_at_error(&error, g_at_result_final_response(result));
|
||||
|
||||
if (ok && req->affected_types) {
|
||||
GSList *l;
|
||||
struct ofono_call *call;
|
||||
|
||||
for (l = vd->calls; l; l = l->next) {
|
||||
call = l->data;
|
||||
|
||||
if (req->affected_types & (1 << call->status))
|
||||
vd->local_release |= (1 << call->id);
|
||||
}
|
||||
}
|
||||
|
||||
req->cb(&error, req->data);
|
||||
}
|
||||
|
||||
static void gemalto_call_common(const char *cmd, struct ofono_voicecall *vc,
|
||||
GAtResultFunc result_cb,
|
||||
unsigned int affected_types,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||
struct change_state_req *req = g_new0(struct change_state_req, 1);
|
||||
|
||||
req->vc = vc;
|
||||
req->cb = cb;
|
||||
req->data = data;
|
||||
req->affected_types = affected_types;
|
||||
|
||||
if (g_at_chat_send(vd->chat, cmd, none_prefix,
|
||||
result_cb, req, g_free) > 0)
|
||||
return;
|
||||
|
||||
g_free(req);
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_answer(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
gemalto_call_common("ATA", vc, generic_cb, 0, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_hangup_all(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
unsigned int affected = (1 << CALL_STATUS_INCOMING) |
|
||||
(1 << CALL_STATUS_DIALING) |
|
||||
(1 << CALL_STATUS_ALERTING) |
|
||||
(1 << CALL_STATUS_WAITING) |
|
||||
(1 << CALL_STATUS_HELD) |
|
||||
(1 << CALL_STATUS_ACTIVE);
|
||||
|
||||
/* Hangup all calls */
|
||||
gemalto_call_common("AT+CHUP", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_hangup(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
unsigned int affected = (1 << CALL_STATUS_ACTIVE);
|
||||
|
||||
/* Hangup current active call */
|
||||
gemalto_call_common("AT+CHLD=1", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_hold_all_active(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
unsigned int affected = (1 << CALL_STATUS_ACTIVE);
|
||||
gemalto_call_common("AT+CHLD=2", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_release_all_held(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
unsigned int affected = (1 << CALL_STATUS_INCOMING) |
|
||||
(1 << CALL_STATUS_WAITING);
|
||||
|
||||
gemalto_call_common("AT+CHLD=0", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_set_udub(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
unsigned int affected = (1 << CALL_STATUS_INCOMING) |
|
||||
(1 << CALL_STATUS_WAITING);
|
||||
|
||||
gemalto_call_common("AT+CHLD=0", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_release_all_active(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
unsigned int affected = (1 << CALL_STATUS_ACTIVE);
|
||||
|
||||
gemalto_call_common("AT+CHLD=1", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void release_id_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct release_id_req *req = user_data;
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(req->vc);
|
||||
struct ofono_error error;
|
||||
|
||||
decode_at_error(&error, g_at_result_final_response(result));
|
||||
|
||||
if (ok)
|
||||
vd->local_release = 1 << req->id;
|
||||
|
||||
req->cb(&error, req->data);
|
||||
}
|
||||
|
||||
static void gemalto_release_specific(struct ofono_voicecall *vc, int id,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||
struct release_id_req *req = g_new0(struct release_id_req, 1);
|
||||
char buf[32];
|
||||
|
||||
req->vc = vc;
|
||||
req->cb = cb;
|
||||
req->data = data;
|
||||
req->id = id;
|
||||
|
||||
snprintf(buf, sizeof(buf), "AT+CHLD=1%d", id);
|
||||
|
||||
if (g_at_chat_send(vd->chat, buf, none_prefix,
|
||||
release_id_cb, req, g_free) > 0)
|
||||
return;
|
||||
|
||||
g_free(req);
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_private_chat(struct ofono_voicecall *vc, int id,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
snprintf(buf, sizeof(buf), "AT+CHLD=2%d", id);
|
||||
gemalto_call_common(buf, vc, generic_cb, 0, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_create_multiparty(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
gemalto_call_common("AT+CHLD=3", vc, generic_cb, 0, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_transfer(struct ofono_voicecall *vc,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
/* Held & Active */
|
||||
unsigned int affected = (1 << CALL_STATUS_ACTIVE) |
|
||||
(1 << CALL_STATUS_HELD);
|
||||
|
||||
/* Transfer can puts held & active calls together and disconnects
|
||||
* from both. However, some networks support transferring of
|
||||
* dialing/ringing calls as well.
|
||||
*/
|
||||
affected |= (1 << CALL_STATUS_DIALING) |
|
||||
(1 << CALL_STATUS_ALERTING);
|
||||
|
||||
gemalto_call_common("AT+CHLD=4", vc, generic_cb, affected, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_send_dtmf(struct ofono_voicecall *vc, const char *dtmf,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
struct ofono_modem *modem = ofono_voicecall_get_modem(vc);
|
||||
int use_quotes = ofono_modem_get_integer(modem, "GemaltoVtsQuotes");
|
||||
int len = strlen(dtmf);
|
||||
int s;
|
||||
int i;
|
||||
char *buf;
|
||||
|
||||
/* strlen("+VTS=\"T\";") = 9 + initial AT + null */
|
||||
buf = (char *)alloca(len * 9 + 3);
|
||||
|
||||
if (use_quotes)
|
||||
s = sprintf(buf, "AT+VTS=\"%c\"", dtmf[0]);
|
||||
else
|
||||
s = sprintf(buf, "AT+VTS=%c", dtmf[0]);
|
||||
|
||||
for (i = 1; i < len; i++) {
|
||||
if (use_quotes)
|
||||
s += sprintf(buf + s, ";+VTS=\"%c\"", dtmf[i]);
|
||||
else
|
||||
s += sprintf(buf + s, ";+VTS=%c", dtmf[i]);
|
||||
}
|
||||
|
||||
gemalto_call_common(buf, vc, generic_cb, 0, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_dial(struct ofono_voicecall *vc,
|
||||
const struct ofono_phone_number *ph,
|
||||
enum ofono_clir_option clir,
|
||||
ofono_voicecall_cb_t cb, void *data)
|
||||
{
|
||||
struct cb_data *cbd = cb_data_new(cb, data);
|
||||
char buf[256];
|
||||
size_t len;
|
||||
|
||||
cbd->user = vc;
|
||||
|
||||
if (ph->type == 145)
|
||||
len = snprintf(buf, sizeof(buf), "ATD+%s", ph->number);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "ATD%s", ph->number);
|
||||
|
||||
switch (clir) {
|
||||
case OFONO_CLIR_OPTION_INVOCATION:
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "I");
|
||||
break;
|
||||
case OFONO_CLIR_OPTION_SUPPRESSION:
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "i");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
snprintf(buf + len, sizeof(buf) - len, ";");
|
||||
|
||||
gemalto_call_common(buf, vc, generic_cb, 0, cb, data);
|
||||
}
|
||||
|
||||
static void gemalto_parse_slcc(GAtResult *result, GSList **l,
|
||||
ofono_bool_t *ret_mpty, gboolean *last)
|
||||
{
|
||||
GAtResultIter iter;
|
||||
int id, dir, status, type;
|
||||
ofono_bool_t mpty;
|
||||
struct ofono_call *call;
|
||||
const char *str = "";
|
||||
int number_type = 129;
|
||||
|
||||
if (last)
|
||||
*last = TRUE;
|
||||
|
||||
g_at_result_iter_init(&iter, result);
|
||||
|
||||
g_at_result_iter_next(&iter, "^SLCC:");
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &id))
|
||||
return;
|
||||
|
||||
if (last)
|
||||
*last = FALSE;
|
||||
|
||||
if (id == 0)
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &dir))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &status))
|
||||
return;
|
||||
|
||||
if (status > 5)
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &type))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &mpty))
|
||||
return;
|
||||
|
||||
/* skip 'Reserved=0' parameter, only difference from CLCC */
|
||||
if (!g_at_result_iter_skip_next(&iter))
|
||||
return;
|
||||
|
||||
if (g_at_result_iter_next_string(&iter, &str))
|
||||
g_at_result_iter_next_number(&iter, &number_type);
|
||||
|
||||
call = g_new0(struct ofono_call, 1);
|
||||
ofono_call_init(call);
|
||||
call->id = id;
|
||||
call->direction = dir;
|
||||
call->status = status;
|
||||
call->type = type;
|
||||
strncpy(call->phone_number.number, str,
|
||||
OFONO_MAX_PHONE_NUMBER_LENGTH);
|
||||
call->phone_number.type = number_type;
|
||||
|
||||
if (strlen(str) > 0)
|
||||
call->clip_validity = 2;
|
||||
else
|
||||
call->clip_validity = 0;
|
||||
|
||||
*l = g_slist_insert_sorted(*l, call, at_util_call_compare);
|
||||
|
||||
if (ret_mpty)
|
||||
*ret_mpty = mpty;
|
||||
}
|
||||
|
||||
static void clcc_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_voicecall *vc = user_data;
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||
GSList *l;
|
||||
|
||||
if (!ok)
|
||||
return;
|
||||
|
||||
vd->calls = at_util_parse_clcc(result, NULL);
|
||||
|
||||
for (l = vd->calls; l; l = l->next)
|
||||
ofono_voicecall_notify(vc, l->data);
|
||||
}
|
||||
|
||||
/*
|
||||
* ^SLCC, except for one RFU parameter (see above in the parsing), is identical
|
||||
* to +CLCC, but as URC it is parsed line by line, and the last line is
|
||||
* indicated by an empty "^SLCC:" (equivalent to the "OK" for CLCC).
|
||||
*/
|
||||
static void slcc_notify(GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_voicecall *vc = user_data;
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||
GSList *n, *o;
|
||||
struct ofono_call *nc, *oc;
|
||||
gboolean last;
|
||||
|
||||
gemalto_parse_slcc(result, &vd->new_calls, NULL, &last);
|
||||
|
||||
if (!last)
|
||||
return;
|
||||
|
||||
n = vd->new_calls;
|
||||
o = vd->calls;
|
||||
|
||||
while (n || o) {
|
||||
nc = n ? n->data : NULL;
|
||||
oc = o ? o->data : NULL;
|
||||
|
||||
if (oc && (nc == NULL || (nc->id > oc->id))) {
|
||||
enum ofono_disconnect_reason reason;
|
||||
|
||||
if (vd->local_release & (1 << oc->id))
|
||||
reason = OFONO_DISCONNECT_REASON_LOCAL_HANGUP;
|
||||
else
|
||||
reason = OFONO_DISCONNECT_REASON_REMOTE_HANGUP;
|
||||
|
||||
if (!oc->type)
|
||||
ofono_voicecall_disconnected(vc, oc->id,
|
||||
reason, NULL);
|
||||
|
||||
o = o->next;
|
||||
} else if (nc && (oc == NULL || (nc->id < oc->id))) {
|
||||
|
||||
if (nc->type == 0) /* new call, signal it */
|
||||
ofono_voicecall_notify(vc, nc);
|
||||
|
||||
n = n->next;
|
||||
} else {
|
||||
|
||||
DBG("modify call part");
|
||||
|
||||
/* notify in case of changes */
|
||||
if (memcmp(nc, oc, sizeof(*nc)))
|
||||
ofono_voicecall_notify(vc, nc);
|
||||
|
||||
n = n->next;
|
||||
o = o->next;
|
||||
}
|
||||
}
|
||||
|
||||
g_slist_free_full(vd->calls, g_free);
|
||||
vd->calls = vd->new_calls;
|
||||
vd->new_calls = NULL;
|
||||
vd->local_release = 0;
|
||||
}
|
||||
|
||||
static void cssi_notify(GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_voicecall *vc = user_data;
|
||||
GAtResultIter iter;
|
||||
int code, index;
|
||||
|
||||
g_at_result_iter_init(&iter, result);
|
||||
|
||||
if (!g_at_result_iter_next(&iter, "+CSSI:"))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &code))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &index))
|
||||
index = 0;
|
||||
|
||||
ofono_voicecall_ssn_mo_notify(vc, 0, code, index);
|
||||
}
|
||||
|
||||
static void cssu_notify(GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_voicecall *vc = user_data;
|
||||
GAtResultIter iter;
|
||||
int code;
|
||||
int index;
|
||||
const char *num;
|
||||
struct ofono_phone_number ph;
|
||||
|
||||
ph.number[0] = '\0';
|
||||
ph.type = 129;
|
||||
|
||||
g_at_result_iter_init(&iter, result);
|
||||
|
||||
if (!g_at_result_iter_next(&iter, "+CSSU:"))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &code))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number_default(&iter, -1, &index))
|
||||
goto out;
|
||||
|
||||
if (!g_at_result_iter_next_string(&iter, &num))
|
||||
goto out;
|
||||
|
||||
strncpy(ph.number, num, OFONO_MAX_PHONE_NUMBER_LENGTH);
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &ph.type))
|
||||
return;
|
||||
|
||||
out:
|
||||
ofono_voicecall_ssn_mt_notify(vc, 0, code, index, &ph);
|
||||
}
|
||||
|
||||
static void gemalto_voicecall_initialized(gboolean ok, GAtResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct ofono_voicecall *vc = user_data;
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||
|
||||
DBG("voicecall_init: registering to notifications");
|
||||
|
||||
/* NO CARRIER, NO ANSWER, BUSY, NO DIALTONE are handled through SLCC */
|
||||
g_at_chat_register(vd->chat, "^SLCC:", slcc_notify, FALSE, vc, NULL);
|
||||
g_at_chat_register(vd->chat, "+CSSI:", cssi_notify, FALSE, vc, NULL);
|
||||
g_at_chat_register(vd->chat, "+CSSU:", cssu_notify, FALSE, vc, NULL);
|
||||
|
||||
ofono_voicecall_register(vc);
|
||||
|
||||
/* Populate the call list */
|
||||
g_at_chat_send(vd->chat, "AT+CLCC", clcc_prefix, clcc_cb, vc, NULL);
|
||||
}
|
||||
|
||||
static int gemalto_voicecall_probe(struct ofono_voicecall *vc,
|
||||
unsigned int vendor, void *data)
|
||||
{
|
||||
GAtChat *chat = data;
|
||||
struct voicecall_data *vd;
|
||||
|
||||
vd = g_new0(struct voicecall_data, 1);
|
||||
vd->chat = g_at_chat_clone(chat);
|
||||
ofono_voicecall_set_data(vc, vd);
|
||||
g_at_chat_send(vd->chat, "AT+CSSN=1,1", NULL, NULL, NULL, NULL);
|
||||
g_at_chat_send(vd->chat, "AT^SLCC=1", NULL,
|
||||
gemalto_voicecall_initialized, vc, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gemalto_voicecall_remove(struct ofono_voicecall *vc)
|
||||
{
|
||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||
|
||||
ofono_voicecall_set_data(vc, NULL);
|
||||
|
||||
g_at_chat_unref(vd->chat);
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "gemaltomodem",
|
||||
.probe = gemalto_voicecall_probe,
|
||||
.remove = gemalto_voicecall_remove,
|
||||
.dial = gemalto_dial,
|
||||
.answer = gemalto_answer,
|
||||
.hangup_all = gemalto_hangup_all,
|
||||
.hangup_active = gemalto_hangup,
|
||||
.hold_all_active = gemalto_hold_all_active,
|
||||
.release_all_held = gemalto_release_all_held,
|
||||
.set_udub = gemalto_set_udub,
|
||||
.release_all_active = gemalto_release_all_active,
|
||||
.release_specific = gemalto_release_specific,
|
||||
.private_chat = gemalto_private_chat,
|
||||
.create_multiparty = gemalto_create_multiparty,
|
||||
.transfer = gemalto_transfer,
|
||||
.send_tones = gemalto_send_dtmf
|
||||
};
|
||||
|
||||
void gemalto_voicecall_init(void)
|
||||
{
|
||||
ofono_voicecall_driver_register(&driver);
|
||||
}
|
||||
|
||||
void gemalto_voicecall_exit(void)
|
||||
{
|
||||
ofono_voicecall_driver_unregister(&driver);
|
||||
}
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -218,7 +217,7 @@ static void hfp_call_volume_remove(struct ofono_call_volume *cv)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_call_volume_driver driver = {
|
||||
static const struct ofono_call_volume_driver driver = {
|
||||
.name = "hfpmodem",
|
||||
.probe = hfp_call_volume_probe,
|
||||
.remove = hfp_call_volume_remove,
|
||||
|
||||
@@ -91,7 +91,7 @@ static void hfp_devinfo_remove(struct ofono_devinfo *info)
|
||||
g_free(dd);
|
||||
}
|
||||
|
||||
static struct ofono_devinfo_driver driver = {
|
||||
static const struct ofono_devinfo_driver driver = {
|
||||
.name = "hfpmodem",
|
||||
.probe = hfp_devinfo_probe,
|
||||
.remove = hfp_devinfo_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -411,7 +410,7 @@ static void hfp_hf_indicator(struct ofono_handsfree *hf,
|
||||
CALLBACK_WITH_FAILURE(cb, data);
|
||||
}
|
||||
|
||||
static struct ofono_handsfree_driver driver = {
|
||||
static const struct ofono_handsfree_driver driver = {
|
||||
.name = "hfpmodem",
|
||||
.probe = hfp_handsfree_probe,
|
||||
.remove = hfp_handsfree_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -343,7 +342,7 @@ static void hfp_netreg_remove(struct ofono_netreg *netreg)
|
||||
g_free(nd);
|
||||
}
|
||||
|
||||
static struct ofono_netreg_driver driver = {
|
||||
static const struct ofono_netreg_driver driver = {
|
||||
.name = "hfpmodem",
|
||||
.probe = hfp_netreg_probe,
|
||||
.remove = hfp_netreg_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -196,7 +195,7 @@ static void hfp_siri_set_eyes_free_mode(struct ofono_siri *siri,
|
||||
CALLBACK_WITH_FAILURE(cb, NULL);
|
||||
}
|
||||
|
||||
static struct ofono_siri_driver driver = {
|
||||
static const struct ofono_siri_driver driver = {
|
||||
.name = "hfpmodem",
|
||||
.probe = hfp_siri_probe,
|
||||
.remove = hfp_siri_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -1303,7 +1302,7 @@ static void hfp_voicecall_remove(struct ofono_voicecall *vc)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_voicecall_driver driver = {
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "hfpmodem",
|
||||
.probe = hfp_voicecall_probe,
|
||||
.remove = hfp_voicecall_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -379,7 +378,7 @@ static void hso_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "hsomodem",
|
||||
.probe = hso_gprs_context_probe,
|
||||
.remove = hso_gprs_context_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -199,7 +198,7 @@ static void hso_radio_settings_remove(struct ofono_radio_settings *rs)
|
||||
g_free(rsd);
|
||||
}
|
||||
|
||||
static struct ofono_radio_settings_driver driver = {
|
||||
static const struct ofono_radio_settings_driver driver = {
|
||||
.name = "hsomodem",
|
||||
.probe = hso_radio_settings_probe,
|
||||
.remove = hso_radio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -113,7 +112,7 @@ static void huawei_audio_settings_remove(struct ofono_audio_settings *as)
|
||||
g_free(asd);
|
||||
}
|
||||
|
||||
static struct ofono_audio_settings_driver driver = {
|
||||
static const struct ofono_audio_settings_driver driver = {
|
||||
.name = "huaweimodem",
|
||||
.probe = huawei_audio_settings_probe,
|
||||
.remove = huawei_audio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <glib.h>
|
||||
#include <errno.h>
|
||||
|
||||
@@ -210,7 +209,7 @@ static void huawei_cdma_netreg_remove(struct ofono_cdma_netreg *netreg)
|
||||
g_at_chat_unref(chat);
|
||||
}
|
||||
|
||||
static struct ofono_cdma_netreg_driver driver = {
|
||||
static const struct ofono_cdma_netreg_driver driver = {
|
||||
.name = "huaweimodem",
|
||||
.probe = huawei_cdma_netreg_probe,
|
||||
.remove = huawei_cdma_netreg_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -339,7 +338,7 @@ static void huawei_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "huaweimodem",
|
||||
.probe = huawei_gprs_context_probe,
|
||||
.remove = huawei_gprs_context_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -569,7 +568,7 @@ static void huawei_radio_settings_remove(struct ofono_radio_settings *rs)
|
||||
g_free(rsd);
|
||||
}
|
||||
|
||||
static struct ofono_radio_settings_driver driver = {
|
||||
static const struct ofono_radio_settings_driver driver = {
|
||||
.name = "huaweimodem",
|
||||
.probe = huawei_radio_settings_probe,
|
||||
.remove = huawei_radio_settings_remove,
|
||||
|
||||
@@ -204,7 +204,7 @@ static void huawei_ussd_remove(struct ofono_ussd *ussd)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_ussd_driver driver = {
|
||||
static const struct ofono_ussd_driver driver = {
|
||||
.name = "huaweimodem",
|
||||
.probe = huawei_ussd_probe,
|
||||
.remove = huawei_ussd_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -497,7 +496,7 @@ static void huawei_voicecall_remove(struct ofono_voicecall *vc)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_voicecall_driver driver = {
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "huaweimodem",
|
||||
.probe = huawei_voicecall_probe,
|
||||
.remove = huawei_voicecall_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -403,7 +402,7 @@ static void icera_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "iceramodem",
|
||||
.probe = icera_gprs_context_probe,
|
||||
.remove = icera_gprs_context_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -212,7 +211,7 @@ static void icera_radio_settings_remove(struct ofono_radio_settings *rs)
|
||||
g_free(rsd);
|
||||
}
|
||||
|
||||
static struct ofono_radio_settings_driver driver = {
|
||||
static const struct ofono_radio_settings_driver driver = {
|
||||
.name = "iceramodem",
|
||||
.probe = icera_radio_settings_probe,
|
||||
.remove = icera_radio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -382,7 +381,7 @@ static void ifx_audio_settings_remove(struct ofono_audio_settings *as)
|
||||
g_free(asd);
|
||||
}
|
||||
|
||||
static struct ofono_audio_settings_driver driver = {
|
||||
static const struct ofono_audio_settings_driver driver = {
|
||||
.name = "ifxmodem",
|
||||
.probe = ifx_audio_settings_probe,
|
||||
.remove = ifx_audio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -167,7 +166,7 @@ static void ifx_ctm_remove(struct ofono_ctm *ctm)
|
||||
g_free(ctmd);
|
||||
}
|
||||
|
||||
static struct ofono_ctm_driver driver = {
|
||||
static const struct ofono_ctm_driver driver = {
|
||||
.name = "ifxmodem",
|
||||
.probe = ifx_ctm_probe,
|
||||
.remove = ifx_ctm_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -261,6 +260,45 @@ error:
|
||||
failed_setup(gc, NULL, TRUE);
|
||||
}
|
||||
|
||||
static void cgdata_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_gprs_context *gc = user_data;
|
||||
struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
|
||||
|
||||
DBG("ok %d", ok);
|
||||
|
||||
if (!ok) {
|
||||
ofono_error("Failed to establish session");
|
||||
failed_setup(gc, result, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
|
||||
}
|
||||
|
||||
static const char *get_datapath(struct ofono_modem *modem,
|
||||
const char *interface)
|
||||
{
|
||||
static char datapath[256];
|
||||
char n;
|
||||
|
||||
if (!strcmp(interface,
|
||||
ofono_modem_get_string(modem, "NetworkInterface")))
|
||||
n = '0';
|
||||
else if (!strcmp(interface,
|
||||
ofono_modem_get_string(modem, "NetworkInterface2")))
|
||||
n = '1';
|
||||
else if (!strcmp(interface,
|
||||
ofono_modem_get_string(modem, "NetworkInterface3")))
|
||||
n = '2';
|
||||
else
|
||||
return NULL;
|
||||
|
||||
snprintf(datapath, sizeof(datapath), "%s%c",
|
||||
ofono_modem_get_string(modem, "DataPath"), n);
|
||||
return datapath;
|
||||
}
|
||||
|
||||
static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_gprs_context *gc = user_data;
|
||||
@@ -270,8 +308,11 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
|
||||
const char *laddrnetmask = NULL;
|
||||
const char *gw = NULL;
|
||||
const char *interface;
|
||||
const char *dns[3];
|
||||
const char *ctrlpath;
|
||||
const char *datapath;
|
||||
char buf[512];
|
||||
const char *interface;
|
||||
|
||||
DBG("ok %d", ok);
|
||||
|
||||
@@ -328,9 +369,10 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
DBG("DNS2: %s\n", gcd->dns2);
|
||||
DBG("Gateway: %s\n", gcd->gateway);
|
||||
|
||||
interface = ofono_modem_get_string(modem, "NetworkInterface");
|
||||
ctrlpath = ofono_modem_get_string(modem, "CtrlPath");
|
||||
interface = ofono_gprs_context_get_interface(gc);
|
||||
datapath = get_datapath(modem, interface);
|
||||
|
||||
ofono_gprs_context_set_interface(gc, interface);
|
||||
ofono_gprs_context_set_ipv4_address(gc, gcd->address, TRUE);
|
||||
|
||||
if (gcd->netmask[0])
|
||||
@@ -341,7 +383,17 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
|
||||
ofono_gprs_context_set_ipv4_dns_servers(gc, dns);
|
||||
|
||||
CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
|
||||
snprintf(buf, sizeof(buf), "AT+XDATACHANNEL=1,1,\"%s\",\"%s\",2,%u",
|
||||
ctrlpath, datapath, gcd->active_context);
|
||||
g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
|
||||
snprintf(buf, sizeof(buf), "AT+CGDATA=\"M-RAW_IP\",%u",
|
||||
gcd->active_context);
|
||||
|
||||
if (g_at_chat_send(gcd->chat, buf, none_prefix, cgdata_cb,
|
||||
gc, NULL) > 0)
|
||||
return;
|
||||
|
||||
CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
|
||||
}
|
||||
|
||||
static void ifx_read_settings(struct ofono_gprs_context *gc)
|
||||
@@ -514,6 +566,9 @@ static void deactivate_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||
if (gcd->vendor != OFONO_VENDOR_XMM)
|
||||
g_at_chat_resume(gcd->chat);
|
||||
|
||||
if (!gcd->cb)
|
||||
return;
|
||||
|
||||
CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
|
||||
}
|
||||
|
||||
@@ -608,9 +663,11 @@ static int ifx_gprs_context_probe(struct ofono_gprs_context *gc,
|
||||
|
||||
DBG("");
|
||||
|
||||
if (stat(TUN_DEV, &st) < 0) {
|
||||
ofono_error("Missing support for TUN/TAP devices");
|
||||
return -ENODEV;
|
||||
if (vendor != OFONO_VENDOR_XMM) {
|
||||
if (stat(TUN_DEV, &st) < 0) {
|
||||
ofono_error("Missing support for TUN/TAP devices");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
if (vendor != OFONO_VENDOR_XMM) {
|
||||
@@ -652,7 +709,7 @@ static void ifx_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "ifxmodem",
|
||||
.probe = ifx_gprs_context_probe,
|
||||
.remove = ifx_gprs_context_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -201,7 +200,7 @@ static void ifx_radio_settings_remove(struct ofono_radio_settings *rs)
|
||||
g_free(rsd);
|
||||
}
|
||||
|
||||
static struct ofono_radio_settings_driver driver = {
|
||||
static const struct ofono_radio_settings_driver driver = {
|
||||
.name = "ifxmodem",
|
||||
.probe = ifx_radio_settings_probe,
|
||||
.remove = ifx_radio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -307,7 +306,7 @@ static void ifx_stk_remove(struct ofono_stk *stk)
|
||||
g_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_stk_driver driver = {
|
||||
static const struct ofono_stk_driver driver = {
|
||||
.name = "ifxmodem",
|
||||
.probe = ifx_stk_probe,
|
||||
.remove = ifx_stk_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -1019,7 +1018,7 @@ static void ifx_voicecall_remove(struct ofono_voicecall *vc)
|
||||
g_free(vd);
|
||||
}
|
||||
|
||||
static struct ofono_voicecall_driver driver = {
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "ifxmodem",
|
||||
.probe = ifx_voicecall_probe,
|
||||
.remove = ifx_voicecall_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -117,7 +116,7 @@ static void isi_audio_settings_remove(struct ofono_audio_settings *as)
|
||||
g_free(asd);
|
||||
}
|
||||
|
||||
static struct ofono_audio_settings_driver driver = {
|
||||
static const struct ofono_audio_settings_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_audio_settings_probe,
|
||||
.remove = isi_audio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -429,7 +428,7 @@ static void isi_call_barring_remove(struct ofono_call_barring *barr)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_call_barring_driver driver = {
|
||||
static const struct ofono_call_barring_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_call_barring_probe,
|
||||
.remove = isi_call_barring_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -457,7 +456,7 @@ static void isi_call_forwarding_remove(struct ofono_call_forwarding *cf)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_call_forwarding_driver driver = {
|
||||
static const struct ofono_call_forwarding_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_call_forwarding_probe,
|
||||
.remove = isi_call_forwarding_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -118,7 +117,7 @@ static void isi_call_meter_remove(struct ofono_call_meter *cm)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_call_meter_driver driver = {
|
||||
static const struct ofono_call_meter_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_call_meter_probe,
|
||||
.remove = isi_call_meter_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -405,7 +404,7 @@ static void isi_call_settings_remove(struct ofono_call_settings *cs)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_call_settings_driver driver = {
|
||||
static const struct ofono_call_settings_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_call_settings_probe,
|
||||
.remove = isi_call_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -229,7 +228,7 @@ static void isi_cbs_remove(struct ofono_cbs *cbs)
|
||||
g_free(cd);
|
||||
}
|
||||
|
||||
static struct ofono_cbs_driver driver = {
|
||||
static const struct ofono_cbs_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_cbs_probe,
|
||||
.remove = isi_cbs_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -252,7 +251,7 @@ static void isi_devinfo_remove(struct ofono_devinfo *info)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_devinfo_driver driver = {
|
||||
static const struct ofono_devinfo_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_devinfo_probe,
|
||||
.remove = isi_devinfo_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -659,7 +658,7 @@ static void isi_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(cd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_gprs_context_probe,
|
||||
.remove = isi_gprs_context_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -490,7 +489,7 @@ error:
|
||||
g_free(cbd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_driver driver = {
|
||||
static const struct ofono_gprs_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_gprs_probe,
|
||||
.remove = isi_gprs_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -1165,7 +1164,7 @@ static void isi_netreg_remove(struct ofono_netreg *netreg)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_netreg_driver isimodem = {
|
||||
static const struct ofono_netreg_driver isimodem = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_netreg_probe,
|
||||
.remove = isi_netreg_remove,
|
||||
|
||||
@@ -340,7 +340,7 @@ static void isi_phonebook_remove(struct ofono_phonebook *pb)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_phonebook_driver driver = {
|
||||
static const struct ofono_phonebook_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_phonebook_probe,
|
||||
.remove = isi_phonebook_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -365,7 +364,7 @@ static void isi_radio_settings_remove(struct ofono_radio_settings *rs)
|
||||
g_free(rd);
|
||||
}
|
||||
|
||||
static struct ofono_radio_settings_driver driver = {
|
||||
static const struct ofono_radio_settings_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_radio_settings_probe,
|
||||
.remove = isi_radio_settings_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -969,7 +968,7 @@ static void isi_sim_remove(struct ofono_sim *sim)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_sim_driver driver = {
|
||||
static const struct ofono_sim_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_sim_probe,
|
||||
.remove = isi_sim_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -1121,7 +1120,7 @@ static void isi_sms_remove(struct ofono_sms *sms)
|
||||
g_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_sms_driver driver = {
|
||||
static const struct ofono_sms_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_sms_probe,
|
||||
.remove = isi_sms_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -1651,7 +1650,7 @@ static void uicc_sim_remove(struct ofono_sim *sim)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_sim_driver driver = {
|
||||
static const struct ofono_sim_driver driver = {
|
||||
.name = "wgmodem2.5",
|
||||
.probe = uicc_sim_probe,
|
||||
.remove = uicc_sim_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -276,7 +275,7 @@ static void isi_ussd_remove(struct ofono_ussd *ussd)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_ussd_driver driver = {
|
||||
static const struct ofono_ussd_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_ussd_probe,
|
||||
.remove = isi_ussd_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -1935,7 +1934,7 @@ static void isi_remove(struct ofono_voicecall *call)
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
static struct ofono_voicecall_driver driver = {
|
||||
static const struct ofono_voicecall_driver driver = {
|
||||
.name = "isimodem",
|
||||
.probe = isi_probe,
|
||||
.remove = isi_remove,
|
||||
|
||||
@@ -88,7 +88,7 @@ static void mbim_devinfo_remove(struct ofono_devinfo *info)
|
||||
l_free(dd);
|
||||
}
|
||||
|
||||
static struct ofono_devinfo_driver driver = {
|
||||
static const struct ofono_devinfo_driver driver = {
|
||||
.name = "mbim",
|
||||
.probe = mbim_devinfo_probe,
|
||||
.remove = mbim_devinfo_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
@@ -444,7 +443,7 @@ static void mbim_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
l_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "mbim",
|
||||
.probe = mbim_gprs_context_probe,
|
||||
.remove = mbim_gprs_context_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
@@ -280,7 +279,7 @@ static void mbim_gprs_remove(struct ofono_gprs *gprs)
|
||||
l_free(gd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_driver driver = {
|
||||
static const struct ofono_gprs_driver driver = {
|
||||
.name = "mbim",
|
||||
.probe = mbim_gprs_probe,
|
||||
.remove = mbim_gprs_remove,
|
||||
|
||||
@@ -197,7 +197,7 @@ static bool _iter_copy_string(struct mbim_message_iter *iter,
|
||||
if (L_CPU_TO_LE16(0x8000) != 0x8000) {
|
||||
uint16_t *le = (uint16_t *) buf;
|
||||
|
||||
for (i = 0; i < len; i+= 2)
|
||||
for (i = 0; i < len / 2; i++)
|
||||
le[i] = __builtin_bswap16(le[i]);
|
||||
}
|
||||
|
||||
@@ -1131,7 +1131,7 @@ bool mbim_message_builder_append_basic(struct mbim_message_builder *builder,
|
||||
if (L_CPU_TO_LE16(0x8000) != 0x8000) {
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len - 2; i += 2)
|
||||
for (i = 0; i < len / 2; i++)
|
||||
utf16[i] = __builtin_bswap16(utf16[i]);
|
||||
}
|
||||
|
||||
|
||||
@@ -487,7 +487,7 @@ static bool command_write_handler(struct l_io *io, void *user_data)
|
||||
|
||||
written = TEMP_FAILURE_RETRY(write(fd, buf, pos));
|
||||
|
||||
l_info("n_iov: %lu, %lu", n_iov + 1, (size_t) written);
|
||||
l_info("n_iov: %zu, %zu", n_iov + 1, (size_t) written);
|
||||
|
||||
if (written < 0)
|
||||
return false;
|
||||
@@ -646,8 +646,8 @@ static bool command_read_handler(struct l_io *io, void *user_data)
|
||||
|
||||
l_info("hdr->len: %u", L_LE32_TO_CPU(hdr->len));
|
||||
l_info("header_size: %u", header_size);
|
||||
l_info("header_offset: %lu", device->header_offset);
|
||||
l_info("segment_bytes_remaining: %lu", device->segment_bytes_remaining);
|
||||
l_info("header_offset: %zu", device->header_offset);
|
||||
l_info("segment_bytes_remaining: %zu", device->segment_bytes_remaining);
|
||||
|
||||
iov[n_iov].iov_base = device->segment + L_LE32_TO_CPU(hdr->len) -
|
||||
device->header_offset -
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@@ -395,7 +394,7 @@ static void mbim_netreg_remove(struct ofono_netreg *netreg)
|
||||
l_free(nd);
|
||||
}
|
||||
|
||||
static struct ofono_netreg_driver driver = {
|
||||
static const struct ofono_netreg_driver driver = {
|
||||
.name = "mbim",
|
||||
.probe = mbim_netreg_probe,
|
||||
.remove = mbim_netreg_remove,
|
||||
|
||||
@@ -509,7 +509,7 @@ static void mbim_sim_remove(struct ofono_sim *sim)
|
||||
l_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_sim_driver driver = {
|
||||
static const struct ofono_sim_driver driver = {
|
||||
.name = "mbim",
|
||||
.probe = mbim_sim_probe,
|
||||
.remove = mbim_sim_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
@@ -496,7 +495,7 @@ static void mbim_sms_remove(struct ofono_sms *sms)
|
||||
l_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_sms_driver driver = {
|
||||
static const struct ofono_sms_driver driver = {
|
||||
.name = "mbim",
|
||||
.probe = mbim_sms_probe,
|
||||
.remove = mbim_sms_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -511,7 +510,7 @@ static void mbm_gprs_context_remove(struct ofono_gprs_context *gc)
|
||||
g_free(gcd);
|
||||
}
|
||||
|
||||
static struct ofono_gprs_context_driver driver = {
|
||||
static const struct ofono_gprs_context_driver driver = {
|
||||
.name = "mbmmodem",
|
||||
.probe = mbm_gprs_context_probe,
|
||||
.remove = mbm_gprs_context_remove,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -231,7 +230,7 @@ static void mbm_location_reporting_remove(struct ofono_location_reporting *lr)
|
||||
g_free(gd);
|
||||
}
|
||||
|
||||
static struct ofono_location_reporting_driver driver = {
|
||||
static const struct ofono_location_reporting_driver driver = {
|
||||
.name = "mbmmodem",
|
||||
.type = OFONO_LOCATION_REPORTING_TYPE_NMEA,
|
||||
.probe = mbm_location_reporting_probe,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -262,7 +261,7 @@ static void mbm_stk_remove(struct ofono_stk *stk)
|
||||
g_free(sd);
|
||||
}
|
||||
|
||||
static struct ofono_stk_driver driver = {
|
||||
static const struct ofono_stk_driver driver = {
|
||||
.name = "mbmmodem",
|
||||
.probe = mbm_stk_probe,
|
||||
.remove = mbm_stk_remove,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -195,7 +194,7 @@ static void nw_radio_settings_remove(struct ofono_radio_settings *rs)
|
||||
g_free(rsd);
|
||||
}
|
||||
|
||||
static struct ofono_radio_settings_driver driver = {
|
||||
static const struct ofono_radio_settings_driver driver = {
|
||||
.name = "nwmodem",
|
||||
.probe = nw_radio_settings_probe,
|
||||
.remove = nw_radio_settings_remove,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user