28
28
#include <bluetooth/bluetooth.h>
29
#include <bluetooth/hci.h>
30
29
#include <bluetooth/bnep.h>
31
30
#include <bluetooth/sdp.h>
38
37
#include "adapter.h"
39
38
#include "device.h"
41
39
#include "manager.h"
42
40
#include "common.h"
43
41
#include "connection.h"
44
42
#include "server.h"
46
#define IFACE_PREFIX "bnep%d"
47
#define GN_IFACE "pan0"
48
#define NAP_IFACE "pan1"
50
static struct btd_adapter_driver network_panu_server_driver;
51
static struct btd_adapter_driver network_gn_server_driver;
52
static struct btd_adapter_driver network_nap_server_driver;
54
44
static DBusConnection *connection = NULL;
56
static struct network_conf {
57
gboolean connection_enabled;
58
gboolean server_enabled;
67
.connection_enabled = TRUE,
68
.server_enabled = TRUE,
78
static void conf_cleanup(void)
80
g_free(conf.iface_prefix);
81
g_free(conf.panu_script);
82
g_free(conf.gn_script);
83
g_free(conf.nap_script);
84
g_free(conf.gn_iface);
85
g_free(conf.nap_iface);
46
static gboolean conf_security = TRUE;
88
48
static void read_config(const char *file)
91
51
GError *err = NULL;
94
53
keyfile = g_key_file_new();
96
55
if (!g_key_file_load_from_file(keyfile, file, 0, &err)) {
97
error("Parsing %s failed: %s", file, err->message);
98
56
g_clear_error(&err);
102
disabled = g_key_file_get_string_list(keyfile, "General",
103
"Disable", NULL, &err);
105
debug("%s: %s", file, err->message);
109
for (i = 0; disabled[i] != NULL; i++) {
110
if (g_str_equal(disabled[i], "Connection"))
111
conf.connection_enabled = FALSE;
112
else if (g_str_equal(disabled[i], "Server"))
113
conf.server_enabled = FALSE;
115
g_strfreev(disabled);
118
conf.security = !g_key_file_get_boolean(keyfile, "General",
60
conf_security = !g_key_file_get_boolean(keyfile, "General",
119
61
"DisableSecurity", &err);
121
debug("%s: %s", file, err->message);
126
conf.panu_script = g_key_file_get_string(keyfile, "PANU Role",
129
debug("%s: %s", file, err->message);
133
conf.gn_script = g_key_file_get_string(keyfile, "GN Role",
136
debug("%s: %s", file, err->message);
140
conf.nap_script = g_key_file_get_string(keyfile, "NAP Role",
143
debug("%s: %s", file, err->message);
148
conf.iface_prefix = g_key_file_get_string(keyfile, "PANU Role",
151
debug("%s: %s", file, err->message);
155
conf.gn_iface = g_key_file_get_string(keyfile, "GN Role",
158
debug("%s: %s", file, err->message);
162
conf.nap_iface = g_key_file_get_string(keyfile, "NAP Role",
165
debug("%s: %s", file, err->message);
63
DBG("%s: %s", file, err->message);
166
64
g_clear_error(&err);
170
68
g_key_file_free(keyfile);
172
if (!conf.iface_prefix)
173
conf.iface_prefix = g_strdup(IFACE_PREFIX);
176
conf.gn_iface = g_strdup(GN_IFACE);
178
conf.nap_iface = g_strdup(NAP_IFACE);
180
debug("Config options: InterfacePrefix=%s, PANU_Script=%s, "
181
"GN_Script=%s, NAP_Script=%s, GN_Interface=%s, "
182
"NAP_Interface=%s, Security=%s",
183
conf.iface_prefix, conf.panu_script, conf.gn_script,
184
conf.nap_script, conf.gn_iface, conf.nap_iface,
185
conf.security ? "true" : "false");
70
DBG("Config options: Security=%s",
71
conf_security ? "true" : "false");
188
74
static int network_probe(struct btd_device *device, GSList *uuids, uint16_t id)
238
124
network_remove(device, BNEP_SVC_NAP);
241
static int network_server_probe(struct btd_adapter *adapter, uint16_t id)
243
const gchar *path = adapter_get_path(adapter);
246
DBG("path %s", path);
248
if (!conf.server_enabled)
251
adapter_get_address(adapter, &src);
253
return server_register(path, &src, id);
256
static void network_server_remove(struct btd_adapter *adapter, uint16_t id)
258
const gchar *path = adapter_get_path(adapter);
260
DBG("path %s", path);
262
server_unregister(path, id);
265
static int panu_server_probe(struct btd_adapter *adapter)
267
return network_server_probe(adapter, BNEP_SVC_PANU);
270
static int gn_server_probe(struct btd_adapter *adapter)
272
return network_server_probe(adapter, BNEP_SVC_GN);
275
static int nap_server_probe(struct btd_adapter *adapter)
277
return network_server_probe(adapter, BNEP_SVC_NAP);
280
static void panu_server_remove(struct btd_adapter *adapter)
282
network_server_remove(adapter, BNEP_SVC_PANU);
285
static void gn_server_remove(struct btd_adapter *adapter)
287
network_server_remove(adapter, BNEP_SVC_GN);
290
static void nap_server_remove(struct btd_adapter *adapter)
292
network_server_remove(adapter, BNEP_SVC_NAP);
127
static int network_server_probe(struct btd_adapter *adapter)
129
const gchar *path = adapter_get_path(adapter);
131
DBG("path %s", path);
133
return server_register(adapter);
136
static void network_server_remove(struct btd_adapter *adapter)
138
const gchar *path = adapter_get_path(adapter);
140
DBG("path %s", path);
142
server_unregister(adapter);
295
145
static struct btd_device_driver network_panu_driver = {
313
163
.remove = nap_remove,
316
static struct btd_adapter_driver network_panu_server_driver = {
317
.name = "network-panu-server",
318
.probe = panu_server_probe,
319
.remove = panu_server_remove,
322
static struct btd_adapter_driver network_gn_server_driver = {
323
.name = "network-gn-server",
324
.probe = gn_server_probe,
325
.remove = gn_server_remove,
328
static struct btd_adapter_driver network_nap_server_driver = {
329
.name = "network-nap-server",
330
.probe = nap_server_probe,
331
.remove = nap_server_remove,
166
static struct btd_adapter_driver network_server_driver = {
167
.name = "network-server",
168
.probe = network_server_probe,
169
.remove = network_server_remove,
334
172
int network_manager_init(DBusConnection *conn)
336
174
read_config(CONFIGDIR "/network.conf");
338
if (bnep_init(conf.panu_script, conf.gn_script, conf.nap_script)) {
339
177
error("Can't init bnep module");
346
184
* (setup connection request) contains the destination service
347
185
* field that defines which service the source is connecting to.
349
if (bridge_init(conf.gn_iface, conf.nap_iface) < 0) {
350
error("Can't init bridge module");
354
if (server_init(conn, conf.iface_prefix, conf.security) < 0)
357
/* Register PANU, GN and NAP servers if they don't exist */
358
btd_register_adapter_driver(&network_panu_server_driver);
359
btd_register_adapter_driver(&network_gn_server_driver);
360
btd_register_adapter_driver(&network_nap_server_driver);
362
if (connection_init(conn, conf.iface_prefix) < 0)
188
if (server_init(conn, conf_security) < 0)
191
/* Register network server if it doesn't exist */
192
btd_register_adapter_driver(&network_server_driver);
194
if (connection_init(conn) < 0)
365
197
btd_register_device_driver(&network_panu_driver);
374
206
void network_manager_exit(void)
376
if (conf.server_enabled)
379
if (conf.connection_enabled) {
380
btd_unregister_device_driver(&network_panu_driver);
381
btd_unregister_device_driver(&network_gn_driver);
382
btd_unregister_device_driver(&network_nap_driver);
386
btd_unregister_adapter_driver(&network_panu_server_driver);
387
btd_unregister_adapter_driver(&network_gn_server_driver);
388
btd_unregister_adapter_driver(&network_nap_server_driver);
210
btd_unregister_device_driver(&network_panu_driver);
211
btd_unregister_device_driver(&network_gn_driver);
212
btd_unregister_device_driver(&network_nap_driver);
216
btd_unregister_adapter_driver(&network_server_driver);
390
218
dbus_connection_unref(connection);
391
219
connection = NULL;