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-mux
|
||||||
unit/test-caif
|
unit/test-caif
|
||||||
unit/test-cell-info
|
unit/test-cell-info
|
||||||
|
unit/test-cell-info-control
|
||||||
unit/test-cell-info-dbus
|
unit/test-cell-info-dbus
|
||||||
unit/test-stkutil
|
unit/test-stkutil
|
||||||
unit/test-cdmasms
|
unit/test-cdmasms
|
||||||
|
|||||||
@@ -137,3 +137,7 @@ Varun Gargi <varun.gargi@intel.com>
|
|||||||
Florent Beillonnet <florent.beillonnet@gmail.com>
|
Florent Beillonnet <florent.beillonnet@gmail.com>
|
||||||
Martin Hundebøll <martin@geanix.com>
|
Martin Hundebøll <martin@geanix.com>
|
||||||
Julien Tournier <tournier.julien@gmail.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:
|
ver 1.25:
|
||||||
Fix issue with handling GPRS context release.
|
Fix issue with handling GPRS context release.
|
||||||
Fix issue with GPRS context shutdown and Huawei modems.
|
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
|
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
|
if UDEV
|
||||||
builtin_cflags += @UDEV_CFLAGS@
|
builtin_cflags += @UDEV_CFLAGS@
|
||||||
builtin_libadd += @UDEV_LIBS@
|
builtin_libadd += @UDEV_LIBS@
|
||||||
@@ -409,14 +412,16 @@ builtin_modules += gemaltomodem
|
|||||||
builtin_sources += drivers/atmodem/atutil.h \
|
builtin_sources += drivers/atmodem/atutil.h \
|
||||||
drivers/gemaltomodem/gemaltomodem.h \
|
drivers/gemaltomodem/gemaltomodem.h \
|
||||||
drivers/gemaltomodem/gemaltomodem.c \
|
drivers/gemaltomodem/gemaltomodem.c \
|
||||||
drivers/gemaltomodem/location-reporting.c
|
drivers/gemaltomodem/location-reporting.c \
|
||||||
|
drivers/gemaltomodem/voicecall.c
|
||||||
|
|
||||||
builtin_modules += xmm7modem
|
builtin_modules += xmm7modem
|
||||||
builtin_sources += drivers/atmodem/atutil.h \
|
builtin_sources += drivers/atmodem/atutil.h \
|
||||||
drivers/xmm7modem/xmm7modem.h \
|
drivers/xmm7modem/xmm7modem.h \
|
||||||
drivers/xmm7modem/xmm7modem.c \
|
drivers/xmm7modem/xmm7modem.c \
|
||||||
drivers/xmm7modem/radio-settings.c \
|
drivers/xmm7modem/radio-settings.c \
|
||||||
drivers/xmm7modem/ims.c
|
drivers/xmm7modem/ims.c \
|
||||||
|
drivers/xmm7modem/netmon.c
|
||||||
|
|
||||||
if PHONESIM
|
if PHONESIM
|
||||||
builtin_modules += phonesim
|
builtin_modules += phonesim
|
||||||
@@ -664,6 +669,7 @@ builtin_libadd += @ELL_LIBS@
|
|||||||
if MBIMMODEM
|
if MBIMMODEM
|
||||||
mbim_sources = drivers/mbimmodem/mbim.h \
|
mbim_sources = drivers/mbimmodem/mbim.h \
|
||||||
drivers/mbimmodem/mbim.c \
|
drivers/mbimmodem/mbim.c \
|
||||||
|
drivers/mbimmodem/mbim-private.h \
|
||||||
drivers/mbimmodem/mbim-desc.h \
|
drivers/mbimmodem/mbim-desc.h \
|
||||||
drivers/mbimmodem/mbim-desc.c \
|
drivers/mbimmodem/mbim-desc.c \
|
||||||
drivers/mbimmodem/mbim-message.h \
|
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/netmonagent.c src/netmonagent.h \
|
||||||
src/slot-manager.c src/slot-manager-dbus.c \
|
src/slot-manager.c src/slot-manager-dbus.c \
|
||||||
src/cell-info.c src/cell-info-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/sim-info.c src/sim-info-dbus.c \
|
||||||
src/conf.c src/mtu-limit.c
|
src/conf.c src/mtu-limit.c
|
||||||
|
|
||||||
@@ -888,7 +895,8 @@ test_scripts = test/backtrace \
|
|||||||
test/test-serving-cell-info \
|
test/test-serving-cell-info \
|
||||||
test/ims-register \
|
test/ims-register \
|
||||||
test/ims-unregister \
|
test/ims-unregister \
|
||||||
test/list-applications
|
test/list-applications \
|
||||||
|
test/set-sms-alphabet
|
||||||
|
|
||||||
|
|
||||||
if TEST
|
if TEST
|
||||||
@@ -923,11 +931,19 @@ unit_test_cell_info_LDADD = @GLIB_LIBS@ -ldl
|
|||||||
unit_objects += $(unit_test_cell_info_OBJECTS)
|
unit_objects += $(unit_test_cell_info_OBJECTS)
|
||||||
unit_tests += unit/test-cell-info
|
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_SOURCES = unit/test-dbus.c \
|
||||||
unit/test-cell-info-dbus.c unit/fake_cell_info.c \
|
unit/test-cell-info-dbus.c unit/fake_cell_info.c \
|
||||||
src/cell-info.c src/cell-info-dbus.c \
|
src/cell-info.c src/cell-info-dbus.c \
|
||||||
gdbus/object.c src/dbus-clients.c \
|
src/cell-info-control.c gdbus/object.c \
|
||||||
src/dbus.c src/log.c
|
src/dbus-clients.c src/dbus.c src/log.c
|
||||||
unit_test_cell_info_dbus_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
unit_test_cell_info_dbus_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
||||||
@DBUS_GLIB_CFLAGS@
|
@DBUS_GLIB_CFLAGS@
|
||||||
unit_test_cell_info_dbus_LDADD = @DBUS_GLIB_LIBS@ @GLIB_LIBS@ -ldl
|
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_tests += unit/test-sim-info-dbus
|
||||||
|
|
||||||
unit_test_slot_manager_SOURCES = unit/test-slot-manager.c unit/fake_watch.c \
|
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 \
|
unit/fake_cell_info.c src/slot-manager.c \
|
||||||
src/storage.c src/log.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) \
|
unit_test_slot_manager_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
||||||
-DSTORAGEDIR='"/tmp/ofono"'
|
-DSTORAGEDIR='"/tmp/ofono"'
|
||||||
unit_test_slot_manager_LDADD = @GLIB_LIBS@ -ldl
|
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_tests += unit/test-slot-manager
|
||||||
|
|
||||||
unit_test_watch_SOURCES = unit/test-watch.c src/watch.c \
|
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
|
src/log.c src/watchlist.c
|
||||||
unit_test_watch_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
unit_test_watch_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
||||||
-DSTORAGEDIR='"/tmp/ofono"'
|
-DSTORAGEDIR='"/tmp/ofono"'
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ AC_DEFUN([AC_PROG_CC_PIE], [
|
|||||||
|
|
||||||
AC_DEFUN([COMPILER_FLAGS], [
|
AC_DEFUN([COMPILER_FLAGS], [
|
||||||
if (test "${CFLAGS}" = ""); then
|
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
|
fi
|
||||||
if (test "$USE_MAINTAINER_MODE" = "yes"); then
|
if (test "$USE_MAINTAINER_MODE" = "yes"); then
|
||||||
CFLAGS="$CFLAGS -Werror -Wextra"
|
CFLAGS="$CFLAGS -Werror -Wextra"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.60)
|
||||||
AC_INIT(ofono, 1.25)
|
AC_INIT(ofono, 1.29)
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([foreign subdir-objects color-tests])
|
AM_INIT_AUTOMAKE([foreign subdir-objects color-tests])
|
||||||
AC_CONFIG_HEADERS(config.h)
|
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]
|
string AuthenticationMethod [readwrite]
|
||||||
Holds the PPP authentication method to use. Valid
|
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]
|
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
|
Setting this property to an empty string clears the
|
||||||
default APN from the modem.
|
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
|
"turkish" - Turkish alphabet
|
||||||
"spanish" - Spanish alphabet
|
"spanish" - Spanish alphabet
|
||||||
"portuguese" - Portuguese 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
|
The standard, language-specific alphabets are defined
|
||||||
in 3GPP TS23.038, Annex A. By default, oFono uses
|
in 3GPP TS23.038, Annex A. By default, oFono uses
|
||||||
|
|||||||
@@ -82,7 +82,9 @@ Properties string Mode [readonly]
|
|||||||
|
|
||||||
string Status [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:
|
The possible values are:
|
||||||
"unregistered" Not registered to any network
|
"unregistered" Not registered to any network
|
||||||
|
|||||||
@@ -205,3 +205,15 @@ Properties boolean Present [readonly]
|
|||||||
|
|
||||||
Contains the SIM's ImsPrivateIdentity, read from the
|
Contains the SIM's ImsPrivateIdentity, read from the
|
||||||
ISIM.
|
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
|
via N_GSM mux device. We use ofono as SMS message
|
||||||
service and incoming voice calls service, so we
|
service and incoming voice calls service, so we
|
||||||
use /dev/gsmtty1 provided by N_GSM mux.
|
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
|
* oFono - Open Source Telephony
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
* 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
|
* 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
|
* 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;
|
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
|
* oFono - Open Source Telephony
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
* 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
|
* 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
|
* 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,
|
int at_util_get_ipv4_address_and_netmask(const char *addrnetmask,
|
||||||
char *address, char *netmask);
|
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 {
|
struct cb_data {
|
||||||
|
gint ref_count;
|
||||||
void *cb;
|
void *cb;
|
||||||
void *data;
|
void *data;
|
||||||
void *user;
|
void *user;
|
||||||
@@ -97,12 +115,29 @@ static inline struct cb_data *cb_data_new(void *cb, void *data)
|
|||||||
struct cb_data *ret;
|
struct cb_data *ret;
|
||||||
|
|
||||||
ret = g_new0(struct cb_data, 1);
|
ret = g_new0(struct cb_data, 1);
|
||||||
|
ret->ref_count = 1;
|
||||||
ret->cb = cb;
|
ret->cb = cb;
|
||||||
ret->data = data;
|
ret->data = data;
|
||||||
|
|
||||||
return ret;
|
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)
|
static inline int at_util_convert_signal_strength(int strength)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.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);
|
ofono_call_barring_set_data(cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_barring_driver driver = {
|
static const struct ofono_call_barring_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_call_barring_probe,
|
.probe = at_call_barring_probe,
|
||||||
.remove = at_call_barring_remove,
|
.remove = at_call_barring_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.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);
|
ofono_call_forwarding_set_data(cf, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_forwarding_driver driver = {
|
static const struct ofono_call_forwarding_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_ccfc_probe,
|
.probe = at_ccfc_probe,
|
||||||
.remove = at_ccfc_remove,
|
.remove = at_ccfc_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.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);
|
ofono_call_meter_set_data(cm, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_meter_driver driver = {
|
static const struct ofono_call_meter_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_caoc_probe,
|
.probe = at_caoc_probe,
|
||||||
.remove = at_caoc_remove,
|
.remove = at_caoc_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.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);
|
ofono_call_settings_set_data(cs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_settings_driver driver = {
|
static const struct ofono_call_settings_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_call_settings_probe,
|
.probe = at_call_settings_probe,
|
||||||
.remove = at_call_settings_remove,
|
.remove = at_call_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@@ -207,7 +206,7 @@ static void at_call_volume_remove(struct ofono_call_volume *cv)
|
|||||||
g_free(cvd);
|
g_free(cvd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_volume_driver driver = {
|
static const struct ofono_call_volume_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_call_volume_probe,
|
.probe = at_call_volume_probe,
|
||||||
.remove = at_call_volume_remove,
|
.remove = at_call_volume_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@@ -304,7 +303,7 @@ static void at_cbs_remove(struct ofono_cbs *cbs)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_cbs_driver driver = {
|
static const struct ofono_cbs_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_cbs_probe,
|
.probe = at_cbs_probe,
|
||||||
.remove = at_cbs_remove,
|
.remove = at_cbs_remove,
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ static void at_devinfo_remove(struct ofono_devinfo *info)
|
|||||||
g_at_chat_unref(chat);
|
g_at_chat_unref(chat);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_devinfo_driver driver = {
|
static const struct ofono_devinfo_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_devinfo_probe,
|
.probe = at_devinfo_probe,
|
||||||
.remove = at_devinfo_remove,
|
.remove = at_devinfo_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -263,7 +262,7 @@ static void at_gnss_remove(struct ofono_gnss *gnss)
|
|||||||
g_free(gd);
|
g_free(gd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gnss_driver driver = {
|
static const struct ofono_gnss_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_gnss_probe,
|
.probe = at_gnss_probe,
|
||||||
.remove = at_gnss_remove,
|
.remove = at_gnss_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -488,7 +487,7 @@ static void at_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(gcd);
|
g_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_gprs_context_probe,
|
.probe = at_gprs_context_probe,
|
||||||
.remove = at_gprs_context_remove,
|
.remove = at_gprs_context_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -456,7 +455,6 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
|
|||||||
FALSE, gprs, NULL);
|
FALSE, gprs, NULL);
|
||||||
break;
|
break;
|
||||||
case OFONO_VENDOR_UBLOX:
|
case OFONO_VENDOR_UBLOX:
|
||||||
case OFONO_VENDOR_UBLOX_TOBY_L2:
|
|
||||||
g_at_chat_register(gd->chat, "+UREG:", ublox_ureg_notify,
|
g_at_chat_register(gd->chat, "+UREG:", ublox_ureg_notify,
|
||||||
FALSE, gprs, NULL);
|
FALSE, gprs, NULL);
|
||||||
g_at_chat_send(gd->chat, "AT+UREG=1", none_prefix,
|
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);
|
g_free(gd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_driver driver = {
|
static const struct ofono_gprs_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_gprs_probe,
|
.probe = at_gprs_probe,
|
||||||
.remove = at_gprs_remove,
|
.remove = at_gprs_remove,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
* oFono - Open Source Telephony
|
* oFono - Open Source Telephony
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 Intel Corporation. All rights reserved.
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
@@ -23,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -41,45 +41,88 @@
|
|||||||
|
|
||||||
#include "atmodem.h"
|
#include "atmodem.h"
|
||||||
|
|
||||||
|
static const char *none_prefix[] = { NULL };
|
||||||
|
|
||||||
struct lte_driver_data {
|
struct lte_driver_data {
|
||||||
GAtChat *chat;
|
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)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
struct cb_data *cbd = user_data;
|
struct cb_data *cbd = user_data;
|
||||||
ofono_lte_cb_t cb = cbd->cb;
|
ofono_lte_cb_t cb = cbd->cb;
|
||||||
struct ofono_error error;
|
struct ofono_error error;
|
||||||
|
|
||||||
DBG("ok %d", ok);
|
|
||||||
|
|
||||||
decode_at_error(&error, g_at_result_final_response(result));
|
decode_at_error(&error, g_at_result_final_response(result));
|
||||||
cb(&error, cbd->data);
|
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,
|
static void at_lte_set_default_attach_info(const struct ofono_lte *lte,
|
||||||
const struct ofono_lte_default_attach_info *info,
|
const struct ofono_lte_default_attach_info *info,
|
||||||
ofono_lte_cb_t cb, void *data)
|
ofono_lte_cb_t cb, void *data)
|
||||||
{
|
{
|
||||||
struct lte_driver_data *ldd = ofono_lte_get_data(lte);
|
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);
|
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)
|
if (g_at_chat_send(ldd->chat, buf, none_prefix,
|
||||||
snprintf(buf, sizeof(buf), "AT+CGDCONT=0,\"IP\",\"%s\"",
|
at_lte_set_default_attach_info_cb,
|
||||||
info->apn);
|
cbd, cb_data_unref) > 0)
|
||||||
else
|
goto end;
|
||||||
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;
|
|
||||||
|
|
||||||
|
cb_data_unref(cbd);
|
||||||
CALLBACK_WITH_FAILURE(cb, data);
|
CALLBACK_WITH_FAILURE(cb, data);
|
||||||
|
end:
|
||||||
|
g_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean lte_delayed_register(gpointer user_data)
|
static gboolean lte_delayed_register(gpointer user_data)
|
||||||
@@ -124,7 +167,7 @@ static void at_lte_remove(struct ofono_lte *lte)
|
|||||||
g_free(ldd);
|
g_free(ldd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_lte_driver driver = {
|
static const struct ofono_lte_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_lte_probe,
|
.probe = at_lte_probe,
|
||||||
.remove = at_lte_remove,
|
.remove = at_lte_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -179,7 +178,7 @@ static int option_parse_tech(GAtResult *result)
|
|||||||
return tech;
|
return tech;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cinterion_parse_tech(GAtResult *result)
|
static int gemalto_parse_tech(GAtResult *result)
|
||||||
{
|
{
|
||||||
int tech = -1;
|
int tech = -1;
|
||||||
GAtResultIter iter;
|
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);
|
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)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
struct tech_query *tq = user_data;
|
struct tech_query *tq = user_data;
|
||||||
int tech;
|
int tech;
|
||||||
|
|
||||||
tech = cinterion_parse_tech(result);
|
tech = gemalto_parse_tech(result);
|
||||||
|
|
||||||
ofono_netreg_status_notify(tq->netreg,
|
ofono_netreg_status_notify(tq->netreg,
|
||||||
tq->status, tq->lac, tq->ci, tech);
|
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);
|
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 ofono_netreg *netreg = user_data;
|
||||||
struct netreg_data *nd = ofono_netreg_get_data(netreg);
|
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)
|
option_query_tech_cb, tq, g_free) > 0)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case OFONO_VENDOR_CINTERION:
|
case OFONO_VENDOR_GEMALTO:
|
||||||
if (g_at_chat_send(nd->chat, "AT^SMONI",
|
if (g_at_chat_send(nd->chat, "AT^SMONI",
|
||||||
smoni_prefix,
|
smoni_prefix,
|
||||||
cinterion_query_tech_cb, tq, g_free) > 0)
|
gemalto_query_tech_cb, tq, g_free) > 0)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(tq);
|
g_free(tq);
|
||||||
@@ -1656,8 +1655,11 @@ static ofono_bool_t build_cmer_string(char *buf, int *cmer_opts,
|
|||||||
DBG("");
|
DBG("");
|
||||||
|
|
||||||
switch (nd->vendor) {
|
switch (nd->vendor) {
|
||||||
case OFONO_VENDOR_UBLOX_TOBY_L2:
|
case OFONO_VENDOR_UBLOX:
|
||||||
/* UBX-13002752 R33: TOBY L2 doesn't support mode 2 and 3 */
|
/* 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";
|
mode = "1";
|
||||||
break;
|
break;
|
||||||
default:
|
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,
|
g_at_chat_send(nd->chat, "AT*TLTS=1", none_prefix,
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
break;
|
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
|
* so set them up to specified values here
|
||||||
*
|
*
|
||||||
* Cinterion rssi signal strength specified as:
|
* Gemalto rssi signal strength specified as:
|
||||||
* 0 <= -112dBm
|
* 0 <= -112dBm
|
||||||
* 1 - 4 signal strengh in 15 dB steps
|
* 1 - 4 signal strengh in 15 dB steps
|
||||||
* 5 >= -51 dBm
|
* 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,
|
g_at_chat_send(nd->chat, "AT^SIND=\"rssi\",1", none_prefix,
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
g_at_chat_register(nd->chat, "+CIEV:",
|
g_at_chat_register(nd->chat, "+CIEV:",
|
||||||
cinterion_ciev_notify, FALSE, netreg, NULL);
|
gemalto_ciev_notify, FALSE, netreg, NULL);
|
||||||
break;
|
break;
|
||||||
case OFONO_VENDOR_NOKIA:
|
case OFONO_VENDOR_NOKIA:
|
||||||
case OFONO_VENDOR_SAMSUNG:
|
case OFONO_VENDOR_SAMSUNG:
|
||||||
@@ -2155,7 +2157,7 @@ static void at_netreg_remove(struct ofono_netreg *netreg)
|
|||||||
g_free(nd);
|
g_free(nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_netreg_driver driver = {
|
static const struct ofono_netreg_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_netreg_probe,
|
.probe = at_netreg_probe,
|
||||||
.remove = at_netreg_remove,
|
.remove = at_netreg_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -593,7 +592,7 @@ static void at_phonebook_remove(struct ofono_phonebook *pb)
|
|||||||
g_free(pbd);
|
g_free(pbd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_phonebook_driver driver = {
|
static const struct ofono_phonebook_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_phonebook_probe,
|
.probe = at_phonebook_probe,
|
||||||
.remove = at_phonebook_remove,
|
.remove = at_phonebook_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.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 *ccho_prefix[] = { "+CCHO:", NULL };
|
||||||
static const char *crla_prefix[] = { "+CRLA:", NULL };
|
static const char *crla_prefix[] = { "+CRLA:", NULL };
|
||||||
static const char *cgla_prefix[] = { "+CGLA:", NULL };
|
static const char *cgla_prefix[] = { "+CGLA:", NULL };
|
||||||
|
static const char *xcmscsc_prefix[] = { "+XCMSCSC:", NULL};
|
||||||
static const char *none_prefix[] = { NULL };
|
static const char *none_prefix[] = { NULL };
|
||||||
|
|
||||||
static void append_file_path(char *buf, const unsigned char *path,
|
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("");
|
DBG("");
|
||||||
|
|
||||||
switch (sd->vendor) {
|
switch (sd->vendor) {
|
||||||
|
case OFONO_VENDOR_XMM:
|
||||||
case OFONO_VENDOR_IFX:
|
case OFONO_VENDOR_IFX:
|
||||||
if (g_at_chat_send(sd->chat, "AT+XPINCNT", xpincnt_prefix,
|
if (g_at_chat_send(sd->chat, "AT+XPINCNT", xpincnt_prefix,
|
||||||
xpincnt_cb, cbd, g_free) > 0)
|
xpincnt_cb, cbd, g_free) > 0)
|
||||||
@@ -1222,7 +1223,6 @@ static void at_pin_retries_query(struct ofono_sim *sim,
|
|||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case OFONO_VENDOR_UBLOX:
|
case OFONO_VENDOR_UBLOX:
|
||||||
case OFONO_VENDOR_UBLOX_TOBY_L2:
|
|
||||||
if (g_at_chat_send(sd->chat, "AT+UPINCNT", upincnt_prefix,
|
if (g_at_chat_send(sd->chat, "AT+UPINCNT", upincnt_prefix,
|
||||||
upincnt_cb, cbd, g_free) > 0)
|
upincnt_cb, cbd, g_free) > 0)
|
||||||
return;
|
return;
|
||||||
@@ -1922,6 +1922,83 @@ static void at_logical_access(struct ofono_sim *sim, int session_id,
|
|||||||
CALLBACK_WITH_FAILURE(cb, NULL, 0, data);
|
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,
|
static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
@@ -1940,6 +2017,10 @@ static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
|
|||||||
if (at_clck_cpwd_fac[i])
|
if (at_clck_cpwd_fac[i])
|
||||||
sd->passwd_type_mask |= (1 << 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 */
|
/* Query supported <fac>s */
|
||||||
return g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
|
return g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
|
||||||
at_clck_query_cb, sim, NULL) ? 0 : -1;
|
at_clck_query_cb, sim, NULL) ? 0 : -1;
|
||||||
@@ -1959,7 +2040,47 @@ static void at_sim_remove(struct ofono_sim *sim)
|
|||||||
g_free(sd);
|
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",
|
.name = "atmodem",
|
||||||
.probe = at_sim_probe,
|
.probe = at_sim_probe,
|
||||||
.remove = at_sim_remove,
|
.remove = at_sim_remove,
|
||||||
@@ -1984,10 +2105,11 @@ static struct ofono_sim_driver driver = {
|
|||||||
.session_read_binary = at_session_read_binary,
|
.session_read_binary = at_session_read_binary,
|
||||||
.session_read_record = at_session_read_record,
|
.session_read_record = at_session_read_record,
|
||||||
.session_read_info = at_session_read_info,
|
.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",
|
.name = "atmodem-noef",
|
||||||
.probe = at_sim_probe,
|
.probe = at_sim_probe,
|
||||||
.remove = at_sim_remove,
|
.remove = at_sim_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -859,8 +858,18 @@ static gboolean build_cnmi_string(char *buf, int *cnmi_opts,
|
|||||||
data->cnma_enabled ? "21" : "1", FALSE))
|
data->cnma_enabled ? "21" : "1", FALSE))
|
||||||
return 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 */
|
/* 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;
|
return FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1320,7 +1329,7 @@ static void at_sms_remove(struct ofono_sms *sms)
|
|||||||
ofono_sms_set_data(sms, NULL);
|
ofono_sms_set_data(sms, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_sms_driver driver = {
|
static const struct ofono_sms_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_sms_probe,
|
.probe = at_sms_probe,
|
||||||
.remove = at_sms_remove,
|
.remove = at_sms_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -223,7 +222,7 @@ static void at_stk_remove(struct ofono_stk *stk)
|
|||||||
g_free(sd);
|
g_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_stk_driver driver = {
|
static const struct ofono_stk_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_stk_probe,
|
.probe = at_stk_probe,
|
||||||
.remove = at_stk_remove,
|
.remove = at_stk_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -92,7 +91,7 @@ static const unsigned char *ucs2_gsm_to_packed(const char *content,
|
|||||||
return NULL;
|
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);
|
g_free(gsm);
|
||||||
|
|
||||||
return packed;
|
return packed;
|
||||||
@@ -137,7 +136,7 @@ static void cusd_parse(GAtResult *result, struct ofono_ussd *ussd)
|
|||||||
switch (data->charset) {
|
switch (data->charset) {
|
||||||
case AT_UTIL_CHARSET_GSM:
|
case AT_UTIL_CHARSET_GSM:
|
||||||
msg_ptr = pack_7bit_own_buf((const guint8 *) content,
|
msg_ptr = pack_7bit_own_buf((const guint8 *) content,
|
||||||
-1, 0, TRUE, &msg_len,
|
-1, 0, true, &msg_len,
|
||||||
0, msg);
|
0, msg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -201,7 +200,7 @@ static void at_ussd_request(struct ofono_ussd *ussd, int dcs,
|
|||||||
unsigned char unpacked_buf[182];
|
unsigned char unpacked_buf[182];
|
||||||
long written;
|
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);
|
&written, 0, unpacked_buf);
|
||||||
|
|
||||||
if (written < 1)
|
if (written < 1)
|
||||||
@@ -327,7 +326,7 @@ static void at_ussd_remove(struct ofono_ussd *ussd)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_ussd_driver driver = {
|
static const struct ofono_ussd_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_ussd_probe,
|
.probe = at_ussd_probe,
|
||||||
.remove = at_ussd_remove,
|
.remove = at_ussd_remove,
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ enum ofono_vendor {
|
|||||||
OFONO_VENDOR_QUECTEL,
|
OFONO_VENDOR_QUECTEL,
|
||||||
OFONO_VENDOR_QUECTEL_M95,
|
OFONO_VENDOR_QUECTEL_M95,
|
||||||
OFONO_VENDOR_UBLOX,
|
OFONO_VENDOR_UBLOX,
|
||||||
OFONO_VENDOR_UBLOX_TOBY_L2,
|
|
||||||
OFONO_VENDOR_CINTERION,
|
|
||||||
OFONO_VENDOR_XMM,
|
OFONO_VENDOR_XMM,
|
||||||
OFONO_VENDOR_GEMALTO,
|
OFONO_VENDOR_GEMALTO,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -1155,7 +1154,7 @@ static void at_voicecall_remove(struct ofono_voicecall *vc)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_voicecall_driver driver = {
|
static const struct ofono_voicecall_driver driver = {
|
||||||
.name = "atmodem",
|
.name = "atmodem",
|
||||||
.probe = at_voicecall_probe,
|
.probe = at_voicecall_probe,
|
||||||
.remove = at_voicecall_remove,
|
.remove = at_voicecall_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -292,7 +291,7 @@ static void calypso_stk_remove(struct ofono_stk *stk)
|
|||||||
g_free(sd);
|
g_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_stk_driver driver = {
|
static const struct ofono_stk_driver driver = {
|
||||||
.name = "calypsomodem",
|
.name = "calypsomodem",
|
||||||
.probe = calypso_stk_probe,
|
.probe = calypso_stk_probe,
|
||||||
.remove = calypso_stk_remove,
|
.remove = calypso_stk_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -402,7 +401,7 @@ static void calypso_voicecall_remove(struct ofono_voicecall *vc)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_voicecall_driver driver = {
|
static const struct ofono_voicecall_driver driver = {
|
||||||
.name = "calypsomodem",
|
.name = "calypsomodem",
|
||||||
.probe = calypso_voicecall_probe,
|
.probe = calypso_voicecall_probe,
|
||||||
.remove = calypso_voicecall_remove,
|
.remove = calypso_voicecall_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -323,7 +322,7 @@ static void cdma_connman_remove(struct ofono_cdma_connman *cm)
|
|||||||
g_free(cd);
|
g_free(cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_cdma_connman_driver driver = {
|
static const struct ofono_cdma_connman_driver driver = {
|
||||||
.name = "cdmamodem",
|
.name = "cdmamodem",
|
||||||
.probe = cdma_connman_probe,
|
.probe = cdma_connman_probe,
|
||||||
.remove = cdma_connman_remove,
|
.remove = cdma_connman_remove,
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ static void cdma_devinfo_remove(struct ofono_devinfo *info)
|
|||||||
ofono_devinfo_set_data(info, NULL);
|
ofono_devinfo_set_data(info, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_devinfo_driver driver = {
|
static const struct ofono_devinfo_driver driver = {
|
||||||
.name = "cdmamodem",
|
.name = "cdmamodem",
|
||||||
.probe = cdma_devinfo_probe,
|
.probe = cdma_devinfo_probe,
|
||||||
.remove = cdma_devinfo_remove,
|
.remove = cdma_devinfo_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -143,7 +142,7 @@ static void cdma_voicecall_remove(struct ofono_cdma_voicecall *vc)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_cdma_voicecall_driver driver = {
|
static const struct ofono_cdma_voicecall_driver driver = {
|
||||||
.name = "cdmamodem",
|
.name = "cdmamodem",
|
||||||
.probe = cdma_voicecall_probe,
|
.probe = cdma_voicecall_probe,
|
||||||
.remove = cdma_voicecall_remove,
|
.remove = cdma_voicecall_remove,
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ static void dun_gprs_attached_status(struct ofono_gprs *gprs,
|
|||||||
CALLBACK_WITH_SUCCESS(cb, 1, data);
|
CALLBACK_WITH_SUCCESS(cb, 1, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_driver driver = {
|
static const struct ofono_gprs_driver driver = {
|
||||||
.name = "dunmodem",
|
.name = "dunmodem",
|
||||||
.probe = dun_gprs_probe,
|
.probe = dun_gprs_probe,
|
||||||
.remove = dun_gprs_remove,
|
.remove = dun_gprs_remove,
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ static void dun_netreg_remove(struct ofono_netreg *netreg)
|
|||||||
g_free(nd);
|
g_free(nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_netreg_driver driver = {
|
static const struct ofono_netreg_driver driver = {
|
||||||
.name = "dunmodem",
|
.name = "dunmodem",
|
||||||
.probe = dun_netreg_probe,
|
.probe = dun_netreg_probe,
|
||||||
.remove = dun_netreg_remove,
|
.remove = dun_netreg_remove,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
* oFono - Open Source Telephony
|
* oFono - Open Source Telephony
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 Vincent Cesson. All rights reserved.
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
@@ -35,12 +36,14 @@
|
|||||||
static int gemaltomodem_init(void)
|
static int gemaltomodem_init(void)
|
||||||
{
|
{
|
||||||
gemalto_location_reporting_init();
|
gemalto_location_reporting_init();
|
||||||
|
gemalto_voicecall_init();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gemaltomodem_exit(void)
|
static void gemaltomodem_exit(void)
|
||||||
{
|
{
|
||||||
|
gemalto_voicecall_exit();
|
||||||
gemalto_location_reporting_exit();
|
gemalto_location_reporting_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
* oFono - Open Source Telephony
|
* oFono - Open Source Telephony
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 Vincent Cesson. All rights reserved.
|
* 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
|
* 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
|
* 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_init();
|
||||||
extern void gemalto_location_reporting_exit();
|
extern void gemalto_location_reporting_exit();
|
||||||
|
|
||||||
|
extern void gemalto_voicecall_init();
|
||||||
|
extern void gemalto_voicecall_exit();
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -217,7 +216,7 @@ static void gemalto_location_reporting_remove(struct ofono_location_reporting *l
|
|||||||
g_free(gd);
|
g_free(gd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_location_reporting_driver driver = {
|
static const struct ofono_location_reporting_driver driver = {
|
||||||
.name = "gemaltomodem",
|
.name = "gemaltomodem",
|
||||||
.type = OFONO_LOCATION_REPORTING_TYPE_NMEA,
|
.type = OFONO_LOCATION_REPORTING_TYPE_NMEA,
|
||||||
.probe = gemalto_location_reporting_probe,
|
.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>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -218,7 +217,7 @@ static void hfp_call_volume_remove(struct ofono_call_volume *cv)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_volume_driver driver = {
|
static const struct ofono_call_volume_driver driver = {
|
||||||
.name = "hfpmodem",
|
.name = "hfpmodem",
|
||||||
.probe = hfp_call_volume_probe,
|
.probe = hfp_call_volume_probe,
|
||||||
.remove = hfp_call_volume_remove,
|
.remove = hfp_call_volume_remove,
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ static void hfp_devinfo_remove(struct ofono_devinfo *info)
|
|||||||
g_free(dd);
|
g_free(dd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_devinfo_driver driver = {
|
static const struct ofono_devinfo_driver driver = {
|
||||||
.name = "hfpmodem",
|
.name = "hfpmodem",
|
||||||
.probe = hfp_devinfo_probe,
|
.probe = hfp_devinfo_probe,
|
||||||
.remove = hfp_devinfo_remove,
|
.remove = hfp_devinfo_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -411,7 +410,7 @@ static void hfp_hf_indicator(struct ofono_handsfree *hf,
|
|||||||
CALLBACK_WITH_FAILURE(cb, data);
|
CALLBACK_WITH_FAILURE(cb, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_handsfree_driver driver = {
|
static const struct ofono_handsfree_driver driver = {
|
||||||
.name = "hfpmodem",
|
.name = "hfpmodem",
|
||||||
.probe = hfp_handsfree_probe,
|
.probe = hfp_handsfree_probe,
|
||||||
.remove = hfp_handsfree_remove,
|
.remove = hfp_handsfree_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -343,7 +342,7 @@ static void hfp_netreg_remove(struct ofono_netreg *netreg)
|
|||||||
g_free(nd);
|
g_free(nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_netreg_driver driver = {
|
static const struct ofono_netreg_driver driver = {
|
||||||
.name = "hfpmodem",
|
.name = "hfpmodem",
|
||||||
.probe = hfp_netreg_probe,
|
.probe = hfp_netreg_probe,
|
||||||
.remove = hfp_netreg_remove,
|
.remove = hfp_netreg_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.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);
|
CALLBACK_WITH_FAILURE(cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_siri_driver driver = {
|
static const struct ofono_siri_driver driver = {
|
||||||
.name = "hfpmodem",
|
.name = "hfpmodem",
|
||||||
.probe = hfp_siri_probe,
|
.probe = hfp_siri_probe,
|
||||||
.remove = hfp_siri_remove,
|
.remove = hfp_siri_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -1303,7 +1302,7 @@ static void hfp_voicecall_remove(struct ofono_voicecall *vc)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_voicecall_driver driver = {
|
static const struct ofono_voicecall_driver driver = {
|
||||||
.name = "hfpmodem",
|
.name = "hfpmodem",
|
||||||
.probe = hfp_voicecall_probe,
|
.probe = hfp_voicecall_probe,
|
||||||
.remove = hfp_voicecall_remove,
|
.remove = hfp_voicecall_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -379,7 +378,7 @@ static void hso_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(gcd);
|
g_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "hsomodem",
|
.name = "hsomodem",
|
||||||
.probe = hso_gprs_context_probe,
|
.probe = hso_gprs_context_probe,
|
||||||
.remove = hso_gprs_context_remove,
|
.remove = hso_gprs_context_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -199,7 +198,7 @@ static void hso_radio_settings_remove(struct ofono_radio_settings *rs)
|
|||||||
g_free(rsd);
|
g_free(rsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_radio_settings_driver driver = {
|
static const struct ofono_radio_settings_driver driver = {
|
||||||
.name = "hsomodem",
|
.name = "hsomodem",
|
||||||
.probe = hso_radio_settings_probe,
|
.probe = hso_radio_settings_probe,
|
||||||
.remove = hso_radio_settings_remove,
|
.remove = hso_radio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -113,7 +112,7 @@ static void huawei_audio_settings_remove(struct ofono_audio_settings *as)
|
|||||||
g_free(asd);
|
g_free(asd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_audio_settings_driver driver = {
|
static const struct ofono_audio_settings_driver driver = {
|
||||||
.name = "huaweimodem",
|
.name = "huaweimodem",
|
||||||
.probe = huawei_audio_settings_probe,
|
.probe = huawei_audio_settings_probe,
|
||||||
.remove = huawei_audio_settings_remove,
|
.remove = huawei_audio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@@ -210,7 +209,7 @@ static void huawei_cdma_netreg_remove(struct ofono_cdma_netreg *netreg)
|
|||||||
g_at_chat_unref(chat);
|
g_at_chat_unref(chat);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_cdma_netreg_driver driver = {
|
static const struct ofono_cdma_netreg_driver driver = {
|
||||||
.name = "huaweimodem",
|
.name = "huaweimodem",
|
||||||
.probe = huawei_cdma_netreg_probe,
|
.probe = huawei_cdma_netreg_probe,
|
||||||
.remove = huawei_cdma_netreg_remove,
|
.remove = huawei_cdma_netreg_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -339,7 +338,7 @@ static void huawei_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(gcd);
|
g_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "huaweimodem",
|
.name = "huaweimodem",
|
||||||
.probe = huawei_gprs_context_probe,
|
.probe = huawei_gprs_context_probe,
|
||||||
.remove = huawei_gprs_context_remove,
|
.remove = huawei_gprs_context_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -569,7 +568,7 @@ static void huawei_radio_settings_remove(struct ofono_radio_settings *rs)
|
|||||||
g_free(rsd);
|
g_free(rsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_radio_settings_driver driver = {
|
static const struct ofono_radio_settings_driver driver = {
|
||||||
.name = "huaweimodem",
|
.name = "huaweimodem",
|
||||||
.probe = huawei_radio_settings_probe,
|
.probe = huawei_radio_settings_probe,
|
||||||
.remove = huawei_radio_settings_remove,
|
.remove = huawei_radio_settings_remove,
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ static void huawei_ussd_remove(struct ofono_ussd *ussd)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_ussd_driver driver = {
|
static const struct ofono_ussd_driver driver = {
|
||||||
.name = "huaweimodem",
|
.name = "huaweimodem",
|
||||||
.probe = huawei_ussd_probe,
|
.probe = huawei_ussd_probe,
|
||||||
.remove = huawei_ussd_remove,
|
.remove = huawei_ussd_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -497,7 +496,7 @@ static void huawei_voicecall_remove(struct ofono_voicecall *vc)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_voicecall_driver driver = {
|
static const struct ofono_voicecall_driver driver = {
|
||||||
.name = "huaweimodem",
|
.name = "huaweimodem",
|
||||||
.probe = huawei_voicecall_probe,
|
.probe = huawei_voicecall_probe,
|
||||||
.remove = huawei_voicecall_remove,
|
.remove = huawei_voicecall_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -403,7 +402,7 @@ static void icera_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(gcd);
|
g_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "iceramodem",
|
.name = "iceramodem",
|
||||||
.probe = icera_gprs_context_probe,
|
.probe = icera_gprs_context_probe,
|
||||||
.remove = icera_gprs_context_remove,
|
.remove = icera_gprs_context_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -212,7 +211,7 @@ static void icera_radio_settings_remove(struct ofono_radio_settings *rs)
|
|||||||
g_free(rsd);
|
g_free(rsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_radio_settings_driver driver = {
|
static const struct ofono_radio_settings_driver driver = {
|
||||||
.name = "iceramodem",
|
.name = "iceramodem",
|
||||||
.probe = icera_radio_settings_probe,
|
.probe = icera_radio_settings_probe,
|
||||||
.remove = icera_radio_settings_remove,
|
.remove = icera_radio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -382,7 +381,7 @@ static void ifx_audio_settings_remove(struct ofono_audio_settings *as)
|
|||||||
g_free(asd);
|
g_free(asd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_audio_settings_driver driver = {
|
static const struct ofono_audio_settings_driver driver = {
|
||||||
.name = "ifxmodem",
|
.name = "ifxmodem",
|
||||||
.probe = ifx_audio_settings_probe,
|
.probe = ifx_audio_settings_probe,
|
||||||
.remove = ifx_audio_settings_remove,
|
.remove = ifx_audio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -167,7 +166,7 @@ static void ifx_ctm_remove(struct ofono_ctm *ctm)
|
|||||||
g_free(ctmd);
|
g_free(ctmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_ctm_driver driver = {
|
static const struct ofono_ctm_driver driver = {
|
||||||
.name = "ifxmodem",
|
.name = "ifxmodem",
|
||||||
.probe = ifx_ctm_probe,
|
.probe = ifx_ctm_probe,
|
||||||
.remove = ifx_ctm_remove,
|
.remove = ifx_ctm_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -261,6 +260,45 @@ error:
|
|||||||
failed_setup(gc, NULL, TRUE);
|
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)
|
static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||||
{
|
{
|
||||||
struct ofono_gprs_context *gc = 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 *laddrnetmask = NULL;
|
||||||
const char *gw = NULL;
|
const char *gw = NULL;
|
||||||
const char *interface;
|
|
||||||
const char *dns[3];
|
const char *dns[3];
|
||||||
|
const char *ctrlpath;
|
||||||
|
const char *datapath;
|
||||||
|
char buf[512];
|
||||||
|
const char *interface;
|
||||||
|
|
||||||
DBG("ok %d", ok);
|
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("DNS2: %s\n", gcd->dns2);
|
||||||
DBG("Gateway: %s\n", gcd->gateway);
|
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);
|
ofono_gprs_context_set_ipv4_address(gc, gcd->address, TRUE);
|
||||||
|
|
||||||
if (gcd->netmask[0])
|
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);
|
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)
|
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)
|
if (gcd->vendor != OFONO_VENDOR_XMM)
|
||||||
g_at_chat_resume(gcd->chat);
|
g_at_chat_resume(gcd->chat);
|
||||||
|
|
||||||
|
if (!gcd->cb)
|
||||||
|
return;
|
||||||
|
|
||||||
CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
|
CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -608,9 +663,11 @@ static int ifx_gprs_context_probe(struct ofono_gprs_context *gc,
|
|||||||
|
|
||||||
DBG("");
|
DBG("");
|
||||||
|
|
||||||
if (stat(TUN_DEV, &st) < 0) {
|
if (vendor != OFONO_VENDOR_XMM) {
|
||||||
ofono_error("Missing support for TUN/TAP devices");
|
if (stat(TUN_DEV, &st) < 0) {
|
||||||
return -ENODEV;
|
ofono_error("Missing support for TUN/TAP devices");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vendor != OFONO_VENDOR_XMM) {
|
if (vendor != OFONO_VENDOR_XMM) {
|
||||||
@@ -652,7 +709,7 @@ static void ifx_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(gcd);
|
g_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "ifxmodem",
|
.name = "ifxmodem",
|
||||||
.probe = ifx_gprs_context_probe,
|
.probe = ifx_gprs_context_probe,
|
||||||
.remove = ifx_gprs_context_remove,
|
.remove = ifx_gprs_context_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -201,7 +200,7 @@ static void ifx_radio_settings_remove(struct ofono_radio_settings *rs)
|
|||||||
g_free(rsd);
|
g_free(rsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_radio_settings_driver driver = {
|
static const struct ofono_radio_settings_driver driver = {
|
||||||
.name = "ifxmodem",
|
.name = "ifxmodem",
|
||||||
.probe = ifx_radio_settings_probe,
|
.probe = ifx_radio_settings_probe,
|
||||||
.remove = ifx_radio_settings_remove,
|
.remove = ifx_radio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -307,7 +306,7 @@ static void ifx_stk_remove(struct ofono_stk *stk)
|
|||||||
g_free(sd);
|
g_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_stk_driver driver = {
|
static const struct ofono_stk_driver driver = {
|
||||||
.name = "ifxmodem",
|
.name = "ifxmodem",
|
||||||
.probe = ifx_stk_probe,
|
.probe = ifx_stk_probe,
|
||||||
.remove = ifx_stk_remove,
|
.remove = ifx_stk_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -1019,7 +1018,7 @@ static void ifx_voicecall_remove(struct ofono_voicecall *vc)
|
|||||||
g_free(vd);
|
g_free(vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_voicecall_driver driver = {
|
static const struct ofono_voicecall_driver driver = {
|
||||||
.name = "ifxmodem",
|
.name = "ifxmodem",
|
||||||
.probe = ifx_voicecall_probe,
|
.probe = ifx_voicecall_probe,
|
||||||
.remove = ifx_voicecall_remove,
|
.remove = ifx_voicecall_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -117,7 +116,7 @@ static void isi_audio_settings_remove(struct ofono_audio_settings *as)
|
|||||||
g_free(asd);
|
g_free(asd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_audio_settings_driver driver = {
|
static const struct ofono_audio_settings_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_audio_settings_probe,
|
.probe = isi_audio_settings_probe,
|
||||||
.remove = isi_audio_settings_remove,
|
.remove = isi_audio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -429,7 +428,7 @@ static void isi_call_barring_remove(struct ofono_call_barring *barr)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_barring_driver driver = {
|
static const struct ofono_call_barring_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_call_barring_probe,
|
.probe = isi_call_barring_probe,
|
||||||
.remove = isi_call_barring_remove,
|
.remove = isi_call_barring_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -457,7 +456,7 @@ static void isi_call_forwarding_remove(struct ofono_call_forwarding *cf)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_forwarding_driver driver = {
|
static const struct ofono_call_forwarding_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_call_forwarding_probe,
|
.probe = isi_call_forwarding_probe,
|
||||||
.remove = isi_call_forwarding_remove,
|
.remove = isi_call_forwarding_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -118,7 +117,7 @@ static void isi_call_meter_remove(struct ofono_call_meter *cm)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_meter_driver driver = {
|
static const struct ofono_call_meter_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_call_meter_probe,
|
.probe = isi_call_meter_probe,
|
||||||
.remove = isi_call_meter_remove,
|
.remove = isi_call_meter_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -405,7 +404,7 @@ static void isi_call_settings_remove(struct ofono_call_settings *cs)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_call_settings_driver driver = {
|
static const struct ofono_call_settings_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_call_settings_probe,
|
.probe = isi_call_settings_probe,
|
||||||
.remove = isi_call_settings_remove,
|
.remove = isi_call_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -229,7 +228,7 @@ static void isi_cbs_remove(struct ofono_cbs *cbs)
|
|||||||
g_free(cd);
|
g_free(cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_cbs_driver driver = {
|
static const struct ofono_cbs_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_cbs_probe,
|
.probe = isi_cbs_probe,
|
||||||
.remove = isi_cbs_remove,
|
.remove = isi_cbs_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -252,7 +251,7 @@ static void isi_devinfo_remove(struct ofono_devinfo *info)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_devinfo_driver driver = {
|
static const struct ofono_devinfo_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_devinfo_probe,
|
.probe = isi_devinfo_probe,
|
||||||
.remove = isi_devinfo_remove,
|
.remove = isi_devinfo_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -659,7 +658,7 @@ static void isi_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(cd);
|
g_free(cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_gprs_context_probe,
|
.probe = isi_gprs_context_probe,
|
||||||
.remove = isi_gprs_context_remove,
|
.remove = isi_gprs_context_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -490,7 +489,7 @@ error:
|
|||||||
g_free(cbd);
|
g_free(cbd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_driver driver = {
|
static const struct ofono_gprs_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_gprs_probe,
|
.probe = isi_gprs_probe,
|
||||||
.remove = isi_gprs_remove,
|
.remove = isi_gprs_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -1165,7 +1164,7 @@ static void isi_netreg_remove(struct ofono_netreg *netreg)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_netreg_driver isimodem = {
|
static const struct ofono_netreg_driver isimodem = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_netreg_probe,
|
.probe = isi_netreg_probe,
|
||||||
.remove = isi_netreg_remove,
|
.remove = isi_netreg_remove,
|
||||||
|
|||||||
@@ -340,7 +340,7 @@ static void isi_phonebook_remove(struct ofono_phonebook *pb)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_phonebook_driver driver = {
|
static const struct ofono_phonebook_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_phonebook_probe,
|
.probe = isi_phonebook_probe,
|
||||||
.remove = isi_phonebook_remove,
|
.remove = isi_phonebook_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -365,7 +364,7 @@ static void isi_radio_settings_remove(struct ofono_radio_settings *rs)
|
|||||||
g_free(rd);
|
g_free(rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_radio_settings_driver driver = {
|
static const struct ofono_radio_settings_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_radio_settings_probe,
|
.probe = isi_radio_settings_probe,
|
||||||
.remove = isi_radio_settings_remove,
|
.remove = isi_radio_settings_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -969,7 +968,7 @@ static void isi_sim_remove(struct ofono_sim *sim)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_sim_driver driver = {
|
static const struct ofono_sim_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_sim_probe,
|
.probe = isi_sim_probe,
|
||||||
.remove = isi_sim_remove,
|
.remove = isi_sim_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -1121,7 +1120,7 @@ static void isi_sms_remove(struct ofono_sms *sms)
|
|||||||
g_free(sd);
|
g_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_sms_driver driver = {
|
static const struct ofono_sms_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_sms_probe,
|
.probe = isi_sms_probe,
|
||||||
.remove = isi_sms_remove,
|
.remove = isi_sms_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -1651,7 +1650,7 @@ static void uicc_sim_remove(struct ofono_sim *sim)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_sim_driver driver = {
|
static const struct ofono_sim_driver driver = {
|
||||||
.name = "wgmodem2.5",
|
.name = "wgmodem2.5",
|
||||||
.probe = uicc_sim_probe,
|
.probe = uicc_sim_probe,
|
||||||
.remove = uicc_sim_remove,
|
.remove = uicc_sim_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -276,7 +275,7 @@ static void isi_ussd_remove(struct ofono_ussd *ussd)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_ussd_driver driver = {
|
static const struct ofono_ussd_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_ussd_probe,
|
.probe = isi_ussd_probe,
|
||||||
.remove = isi_ussd_remove,
|
.remove = isi_ussd_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -1935,7 +1934,7 @@ static void isi_remove(struct ofono_voicecall *call)
|
|||||||
g_free(data);
|
g_free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_voicecall_driver driver = {
|
static const struct ofono_voicecall_driver driver = {
|
||||||
.name = "isimodem",
|
.name = "isimodem",
|
||||||
.probe = isi_probe,
|
.probe = isi_probe,
|
||||||
.remove = isi_remove,
|
.remove = isi_remove,
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ static void mbim_devinfo_remove(struct ofono_devinfo *info)
|
|||||||
l_free(dd);
|
l_free(dd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_devinfo_driver driver = {
|
static const struct ofono_devinfo_driver driver = {
|
||||||
.name = "mbim",
|
.name = "mbim",
|
||||||
.probe = mbim_devinfo_probe,
|
.probe = mbim_devinfo_probe,
|
||||||
.remove = mbim_devinfo_remove,
|
.remove = mbim_devinfo_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -444,7 +443,7 @@ static void mbim_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
l_free(gcd);
|
l_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "mbim",
|
.name = "mbim",
|
||||||
.probe = mbim_gprs_context_probe,
|
.probe = mbim_gprs_context_probe,
|
||||||
.remove = mbim_gprs_context_remove,
|
.remove = mbim_gprs_context_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
@@ -280,7 +279,7 @@ static void mbim_gprs_remove(struct ofono_gprs *gprs)
|
|||||||
l_free(gd);
|
l_free(gd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_driver driver = {
|
static const struct ofono_gprs_driver driver = {
|
||||||
.name = "mbim",
|
.name = "mbim",
|
||||||
.probe = mbim_gprs_probe,
|
.probe = mbim_gprs_probe,
|
||||||
.remove = mbim_gprs_remove,
|
.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) {
|
if (L_CPU_TO_LE16(0x8000) != 0x8000) {
|
||||||
uint16_t *le = (uint16_t *) buf;
|
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]);
|
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) {
|
if (L_CPU_TO_LE16(0x8000) != 0x8000) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < len - 2; i += 2)
|
for (i = 0; i < len / 2; i++)
|
||||||
utf16[i] = __builtin_bswap16(utf16[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));
|
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)
|
if (written < 0)
|
||||||
return false;
|
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("hdr->len: %u", L_LE32_TO_CPU(hdr->len));
|
||||||
l_info("header_size: %u", header_size);
|
l_info("header_size: %u", header_size);
|
||||||
l_info("header_offset: %lu", device->header_offset);
|
l_info("header_offset: %zu", device->header_offset);
|
||||||
l_info("segment_bytes_remaining: %lu", device->segment_bytes_remaining);
|
l_info("segment_bytes_remaining: %zu", device->segment_bytes_remaining);
|
||||||
|
|
||||||
iov[n_iov].iov_base = device->segment + L_LE32_TO_CPU(hdr->len) -
|
iov[n_iov].iov_base = device->segment + L_LE32_TO_CPU(hdr->len) -
|
||||||
device->header_offset -
|
device->header_offset -
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -395,7 +394,7 @@ static void mbim_netreg_remove(struct ofono_netreg *netreg)
|
|||||||
l_free(nd);
|
l_free(nd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_netreg_driver driver = {
|
static const struct ofono_netreg_driver driver = {
|
||||||
.name = "mbim",
|
.name = "mbim",
|
||||||
.probe = mbim_netreg_probe,
|
.probe = mbim_netreg_probe,
|
||||||
.remove = mbim_netreg_remove,
|
.remove = mbim_netreg_remove,
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ static void mbim_sim_remove(struct ofono_sim *sim)
|
|||||||
l_free(sd);
|
l_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_sim_driver driver = {
|
static const struct ofono_sim_driver driver = {
|
||||||
.name = "mbim",
|
.name = "mbim",
|
||||||
.probe = mbim_sim_probe,
|
.probe = mbim_sim_probe,
|
||||||
.remove = mbim_sim_remove,
|
.remove = mbim_sim_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -496,7 +495,7 @@ static void mbim_sms_remove(struct ofono_sms *sms)
|
|||||||
l_free(sd);
|
l_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_sms_driver driver = {
|
static const struct ofono_sms_driver driver = {
|
||||||
.name = "mbim",
|
.name = "mbim",
|
||||||
.probe = mbim_sms_probe,
|
.probe = mbim_sms_probe,
|
||||||
.remove = mbim_sms_remove,
|
.remove = mbim_sms_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -511,7 +510,7 @@ static void mbm_gprs_context_remove(struct ofono_gprs_context *gc)
|
|||||||
g_free(gcd);
|
g_free(gcd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_gprs_context_driver driver = {
|
static const struct ofono_gprs_context_driver driver = {
|
||||||
.name = "mbmmodem",
|
.name = "mbmmodem",
|
||||||
.probe = mbm_gprs_context_probe,
|
.probe = mbm_gprs_context_probe,
|
||||||
.remove = mbm_gprs_context_remove,
|
.remove = mbm_gprs_context_remove,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -231,7 +230,7 @@ static void mbm_location_reporting_remove(struct ofono_location_reporting *lr)
|
|||||||
g_free(gd);
|
g_free(gd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_location_reporting_driver driver = {
|
static const struct ofono_location_reporting_driver driver = {
|
||||||
.name = "mbmmodem",
|
.name = "mbmmodem",
|
||||||
.type = OFONO_LOCATION_REPORTING_TYPE_NMEA,
|
.type = OFONO_LOCATION_REPORTING_TYPE_NMEA,
|
||||||
.probe = mbm_location_reporting_probe,
|
.probe = mbm_location_reporting_probe,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -262,7 +261,7 @@ static void mbm_stk_remove(struct ofono_stk *stk)
|
|||||||
g_free(sd);
|
g_free(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_stk_driver driver = {
|
static const struct ofono_stk_driver driver = {
|
||||||
.name = "mbmmodem",
|
.name = "mbmmodem",
|
||||||
.probe = mbm_stk_probe,
|
.probe = mbm_stk_probe,
|
||||||
.remove = mbm_stk_remove,
|
.remove = mbm_stk_remove,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -195,7 +194,7 @@ static void nw_radio_settings_remove(struct ofono_radio_settings *rs)
|
|||||||
g_free(rsd);
|
g_free(rsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_radio_settings_driver driver = {
|
static const struct ofono_radio_settings_driver driver = {
|
||||||
.name = "nwmodem",
|
.name = "nwmodem",
|
||||||
.probe = nw_radio_settings_probe,
|
.probe = nw_radio_settings_probe,
|
||||||
.remove = nw_radio_settings_remove,
|
.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