5 * Copyright (C) 2007-2008 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32 #define CONNMAN_API_SUBJECT_TO_CHANGE
33 #include <connman/plugin.h>
34 #include <connman/device.h>
35 #include <connman/resolver.h>
36 #include <connman/log.h>
43 struct modem_data *modem;
46 static void owandata_callback(const char *buf, void *user_data)
48 //struct hso_data *data = user_data;
49 char *str, ip[16], nm[16], ns1[16], ns2[16], ns3[16], ns4[16], val[20];
52 str = g_strrstr(buf, "_OWANDATA");
53 if (str == NULL || strstr(buf, "ERROR") != NULL)
56 err = sscanf(str, "_OWANDATA: %d, %[^,], %[^,], "
57 "%[^,], %[^,], %[^,], %[^,], %s",
58 &num, ip, nm, ns1, ns2, ns3, ns4, val);
61 DBG("parsed %d arguments", err);
65 DBG("ip %s dns %s %s val %s", ip, ns1, ns2, val);
67 //connman_resolver_append(data->iface, NULL, ns1);
68 //connman_resolver_append(data->iface, NULL, ns2);
71 static void owancall_callback(const char *buf, void *user_data)
73 struct hso_data *data = user_data;
77 if (g_strrstr(buf, "_OWANCALL: 1, 3") != NULL) {
79 //modem_command(modem, owancall_callback, data,
80 // "_OWANCALL", "%d,%d,%d", 1, 1, 1);
83 if (g_strrstr(buf, "_OWANCALL: 1, 1") != NULL) {
85 modem_command(data->modem, owandata_callback, data,
86 "_OWANDATA", "%d", 1);
89 if (g_strrstr(buf, "\r\nOK\r\n") != NULL) {
90 modem_command(data->modem, owandata_callback, data,
91 "_OWANDATA", "%d", 1);
95 static int network_probe(struct connman_network *network)
97 DBG("network %p", network);
102 static void network_remove(struct connman_network *network)
104 DBG("network %p", network);
107 static int network_connect(struct connman_network *network)
109 DBG("network %p", network);
114 static int network_disconnect(struct connman_network *network)
116 DBG("network %p", network);
121 static struct connman_network_driver network_driver = {
122 .name = "hso-network",
123 .type = CONNMAN_NETWORK_TYPE_HSO,
124 .probe = network_probe,
125 .remove = network_remove,
126 .connect = network_connect,
127 .disconnect = network_disconnect,
130 static int hso_probe(struct connman_device *device)
132 struct hso_data *data;
134 DBG("device %p", device);
136 data = g_try_new0(struct hso_data, 1);
140 data->index = connman_device_get_index(device);
142 data->modem = modem_create("/dev/ttyHS0");
143 if (data->modem == NULL) {
148 connman_device_set_data(device, data);
150 modem_add_callback(data->modem, "_OWANCALL",
151 owancall_callback, data);
156 static void hso_remove(struct connman_device *device)
158 struct hso_data *data = connman_device_get_data(device);
160 DBG("device %p", device);
162 connman_device_set_data(device, NULL);
164 modem_destroy(data->modem);
169 static int hso_enable(struct connman_device *device)
171 struct hso_data *data = connman_device_get_data(device);
172 struct connman_network *network;
175 DBG("device %p", device);
177 err = modem_open(data->modem);
181 connman_device_set_powered(device, TRUE);
183 modem_command(data->modem, NULL, NULL, "Z", NULL);
184 modem_command(data->modem, NULL, NULL, "I", NULL);
186 modem_command(data->modem, owancall_callback, data,
187 "_OWANCALL", "%d,%d,%d", 1, 1, 1);
189 network = connman_network_create("internet", CONNMAN_NETWORK_TYPE_HSO);
190 connman_device_add_network(device, network);
195 static int hso_disable(struct connman_device *device)
197 struct hso_data *data = connman_device_get_data(device);
198 //const char *iface = connman_device_get_interface(device);
200 DBG("device %p", device);
202 //connman_resolver_remove_all(iface);
204 modem_command(data->modem, owancall_callback, data,
205 "_OWANCALL", "%d,%d,%d", 1, 0, 0);
207 connman_device_set_powered(device, FALSE);
209 modem_close(data->modem);
211 g_io_channel_shutdown(data->channel, TRUE, NULL);
212 g_io_channel_unref(data->channel);
217 static struct connman_device_driver hso_driver = {
218 .name = "hso-device",
219 .type = CONNMAN_DEVICE_TYPE_HSO,
221 .remove = hso_remove,
222 .enable = hso_enable,
223 .disable = hso_disable,
226 static int hso_init(void)
230 err = connman_network_driver_register(&network_driver);
234 err = connman_device_driver_register(&hso_driver);
236 connman_network_driver_unregister(&network_driver);
243 static void hso_exit(void)
245 connman_device_driver_unregister(&hso_driver);
246 connman_network_driver_register(&network_driver);
249 CONNMAN_PLUGIN_DEFINE(hso, "Option HSO device plugin", VERSION,