summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWu zheng <wu.zheng@intel.com>2013-10-23 11:16:52 +0800
committerWu Zheng <wu.zheng@intel.com>2013-12-12 04:51:35 -0500
commita15897e21c7d09e72d1a23cac71917bf0781b74b (patch)
treef683b86faac634f9a1f739eafafe9d189d8adaca
parenteaf8d7486aca214a8b58375d6da5075b351546b5 (diff)
downloadbluez-a15897e21c7d09e72d1a23cac71917bf0781b74b.tar.gz
bluez-a15897e21c7d09e72d1a23cac71917bf0781b74b.tar.bz2
bluez-a15897e21c7d09e72d1a23cac71917bf0781b74b.zip
Add the BT network patches to Bluez5.X
Following the idea of Bluez4.X to implement BT network server in Bluez5.X. The BT network server matches the Bluez4.X BT network server idea. Therefore, we don't need to modify Bluetooth-frwk. We can use the implementing in Bluetooth-frwk to deal with the event of BT network server. Change-Id: I1709a018ac9527aab8acaef0ffe4bf0dc5222aa7
-rw-r--r--profiles/network/bnep.c9
-rw-r--r--profiles/network/server.c129
2 files changed, 136 insertions, 2 deletions
diff --git a/profiles/network/bnep.c b/profiles/network/bnep.c
index 0a719a2e..153046e4 100644
--- a/profiles/network/bnep.c
+++ b/profiles/network/bnep.c
@@ -421,6 +421,15 @@ int bnep_add_to_bridge(const char *devname, const char *bridge)
if (sk < 0)
return -1;
+#ifdef __TIZEN_PATCH__
+ err = ioctl(sk, SIOCBRADDBR, bridge);
+ if (err < 0)
+ {
+ info("bridge create err: %d", err);
+ close(sk);
+ return -errno;
+ }
+#endif
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, bridge, IFNAMSIZ - 1);
ifr.ifr_ifindex = ifindex;
diff --git a/profiles/network/server.c b/profiles/network/server.c
index b3aab118..598d9b4a 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -84,6 +84,11 @@ struct network_server {
static GSList *adapters = NULL;
static gboolean security = TRUE;
+#ifdef __TIZEN_PATCH__
+static gboolean server_disconnected_cb(GIOChannel *chan,
+ GIOCondition cond, gpointer user_data);
+#endif
+
static struct network_adapter *find_adapter(GSList *list,
struct btd_adapter *adapter)
{
@@ -125,6 +130,22 @@ static struct network_server *find_server_by_uuid(GSList *list,
return NULL;
}
+#ifdef __TIZEN_PATCH__
+static struct network_session *find_session(GSList *list, GIOChannel *io)
+{
+ GSList *l;
+
+ for (l = list; l; l = l->next) {
+ struct network_session *session = l->data;
+
+ if (session->io == io)
+ return session;
+ }
+
+ return NULL;
+}
+#endif
+
static sdp_record_t *server_record_new(const char *name, uint16_t id)
{
sdp_list_t *svclass, *pfseq, *apseq, *root, *aproto;
@@ -276,6 +297,17 @@ static int server_connadd(struct network_server *ns,
info("Added new connection: %s", devname);
+#ifdef __TIZEN_PATCH__
+ {
+ guint watch = 0;
+
+ bnep_if_up(devname);
+
+ watch = g_io_add_watch_full(session->io, G_PRIORITY_DEFAULT,
+ G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+ server_disconnected_cb, ns, NULL);
+ }
+#else
if (bnep_add_to_bridge(devname, ns->bridge) < 0) {
error("Can't add %s to the bridge %s: %s(%d)",
devname, ns->bridge, strerror(errno), errno);
@@ -283,7 +315,7 @@ static int server_connadd(struct network_server *ns,
}
bnep_if_up(devname);
-
+#endif
strncpy(session->dev, devname, sizeof(devname));
ns->sessions = g_slist_append(ns->sessions, session);
@@ -383,6 +415,54 @@ static void setup_destroy(void *user_data)
session_free(setup);
}
+#ifdef __TIZEN_PATCH__
+static gboolean server_disconnected_cb(GIOChannel *chan,
+ GIOCondition cond, gpointer user_data)
+{
+ struct network_server *ns = NULL;
+ struct network_session *session = NULL;
+ char address[20] = {0};
+ GError *gerr = NULL;
+ const char* paddr = address;
+ char *name_str = NULL;
+
+ info("server_disconnected_cb");
+
+ if (!user_data)
+ return FALSE;
+
+ ns = (struct network_server *) user_data;
+
+ session = find_session(ns->sessions, chan);
+ if (session) {
+ name_str = session->dev;
+ }else{
+ info("Session is not exist!");
+ }
+
+ bt_io_get(chan, &gerr, BT_IO_OPT_DEST, &address,
+ BT_IO_OPT_INVALID);
+
+ g_dbus_emit_signal(btd_get_dbus_connection(),
+ adapter_get_path(ns->na->adapter),
+ NETWORK_SERVER_INTERFACE, "PeerDisconnected",
+ DBUS_TYPE_STRING, &name_str,
+ DBUS_TYPE_STRING, &paddr,
+ DBUS_TYPE_INVALID);
+
+ if (session) {
+ ns->sessions = g_slist_remove(ns->sessions, session);
+ session_free(session);
+ }
+
+ if (g_slist_length(ns->sessions) == 0 &&
+ name_str != NULL)
+ bnep_if_down(name_str);
+
+ return FALSE;
+}
+#endif
+
static gboolean bnep_setup(GIOChannel *chan,
GIOCondition cond, gpointer user_data)
{
@@ -457,10 +537,32 @@ static gboolean bnep_setup(GIOChannel *chan,
if (server_connadd(ns, na->setup, dst_role) < 0)
goto reply;
+#ifndef __TIZEN_PATCH__
na->setup = NULL;
+#endif
rsp = BNEP_SUCCESS;
+#ifdef __TIZEN_PATCH__
+{
+ // Emit connected signal to BT application
+ const gchar* adapter_path = adapter_get_path(na->adapter);
+ const char* pdev = na->setup->dev;
+ char address[24] = {0};
+ char* paddr = address;
+
+ ba2str(&na->setup->dst,paddr);
+
+ na->setup = NULL;
+
+ g_dbus_emit_signal(btd_get_dbus_connection(), adapter_path,
+ NETWORK_SERVER_INTERFACE, "PeerConnected",
+ DBUS_TYPE_STRING, &pdev,
+ DBUS_TYPE_STRING, &paddr,
+ DBUS_TYPE_INVALID);
+}
+#endif
+
reply:
send_bnep_ctrl_rsp(sk, rsp);
@@ -741,6 +843,16 @@ static void path_unregister(void *data)
adapter_free(na);
}
+#ifdef __TIZEN_PATCH__
+static GDBusSignalTable server_signals[] = {
+ { GDBUS_SIGNAL("PeerConnected",
+ GDBUS_ARGS({ "device", "s" }, { "address", "s" })) },
+ { GDBUS_SIGNAL("PeerDisconnected",
+ GDBUS_ARGS({ "device", "s" }, { "address", "s" })) },
+ { }
+};
+#endif
+
static const GDBusMethodTable server_methods[] = {
{ GDBUS_METHOD("Register",
GDBUS_ARGS({ "uuid", "s" }, { "bridge", "s" }), NULL,
@@ -806,15 +918,28 @@ int server_register(struct btd_adapter *adapter, uint16_t id)
if (g_slist_length(na->servers) > 0)
goto done;
+#ifndef __TIZEN_PATCH__
if (!g_dbus_register_interface(btd_get_dbus_connection(),
path, NETWORK_SERVER_INTERFACE,
server_methods, NULL, NULL,
na, path_unregister)) {
error("D-Bus failed to register %s interface",
- NETWORK_SERVER_INTERFACE);
+ NETWORK_SERVER_INTERFACE);
+ server_free(ns);
+ return -1;
+ }
+#else
+ if (!g_dbus_register_interface(btd_get_dbus_connection(),
+ path, NETWORK_SERVER_INTERFACE,
+ server_methods, server_signals,
+ NULL,
+ na, path_unregister)) {
+ error("D-Bus failed to register %s interface",
+ NETWORK_SERVER_INTERFACE);
server_free(ns);
return -1;
}
+#endif
DBG("Registered interface %s on path %s", NETWORK_SERVER_INTERFACE,
path);