Marcel, Renaming the hciraw plugin to hciops. Let me know if anything needs modifications. Cheers, Alok.
From cbaa48cce44e276632293659ea767bd9f9781127 Mon Sep 17 00:00:00 2001 From: Alok Barsode <alok.barsode@xxxxxxxxxx> Date: Tue, 21 Apr 2009 20:16:04 +0530 Subject: [PATCH 1/4] Initialing HCI raw socket plugin "hciops". --- plugins/Makefile.am | 6 +++++- plugins/hciops.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletions(-) create mode 100644 plugins/hciops.c diff --git a/plugins/Makefile.am b/plugins/Makefile.am index a1e933f..bbabf64 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -13,7 +13,7 @@ else service_plugins = endif -plugin_LTLIBRARIES = hal.la $(netlink_plugins) $(service_plugins) +plugin_LTLIBRARIES = hal.la hciops.la $(netlink_plugins) $(service_plugins) noinst_LTLIBRARIES = echo.la storage.la @@ -21,6 +21,8 @@ echo_la_SOURCES = echo.c storage_la_SOURCES = storage.c +hciops_la_SOURCES = hciops.c + if NETLINK netlink_la_SOURCES = netlink.c @@ -47,6 +49,7 @@ all-local: @$(LN_S) -f $(top_srcdir)/network/.libs/network.so @$(LN_S) -f .libs/service.so @$(LN_S) -f .libs/hal.so + @$(LN_S) -f .libs/hciops.so clean-local: @rm -f hal.so @@ -55,3 +58,4 @@ clean-local: @rm -f serial.so @rm -f audio.so @rm -f input.so + @rm -f hciops.so diff --git a/plugins/hciops.c b/plugins/hciops.c new file mode 100644 index 0000000..4f56443 --- /dev/null +++ b/plugins/hciops.c @@ -0,0 +1,43 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2009 Marcel Holtmann <marcel@xxxxxxxxxxxx> + * Copyright (C) 2009 Alok Barsode <alok.barsode@xxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 <bluetooth/bluetooth.h> + +#include "plugin.h" +#include "logging.h" + +static int hciops_init(void) +{ + return 0; +} + +static void hciops_exit(void) +{ +} + +BLUETOOTH_PLUGIN_DEFINE(hciops, VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, hciops_init, hciops_exit) -- 1.5.6.3
From cd24d6672b360a5d5cc78109674a6739ff317c56 Mon Sep 17 00:00:00 2001 From: Alok Barsode <alok.barsode@xxxxxxxxxx> Date: Tue, 21 Apr 2009 21:58:07 +0530 Subject: [PATCH 2/4] exporting device_event(). --- src/hcid.h | 1 + src/main.c | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/hcid.h b/src/hcid.h index 6c26157..236449d 100644 --- a/src/hcid.h +++ b/src/hcid.h @@ -68,6 +68,7 @@ struct main_opts { extern struct main_opts main_opts; +void device_event(int event, int dev_id); void hci_req_queue_remove(int dev_id, bdaddr_t *dba); void start_security_manager(int hdev); diff --git a/src/main.c b/src/main.c index f39fc11..02b4ebf 100644 --- a/src/main.c +++ b/src/main.c @@ -556,30 +556,28 @@ static void init_defaults(void) strcpy(main_opts.host_name, "noname"); } -static inline void device_event(GIOChannel *chan, evt_stack_internal *si) +void device_event(int event, int dev_id) { - evt_si_device *sd = (void *) &si->data; - - switch (sd->event) { + switch (event) { case HCI_DEV_REG: - info("HCI dev %d registered", sd->dev_id); - device_devreg_setup(sd->dev_id, FALSE); + info("HCI dev %d registered", dev_id); + device_devreg_setup(dev_id, FALSE); break; case HCI_DEV_UNREG: - info("HCI dev %d unregistered", sd->dev_id); - manager_unregister_adapter(sd->dev_id); + info("HCI dev %d unregistered", dev_id); + manager_unregister_adapter(dev_id); break; case HCI_DEV_UP: - info("HCI dev %d up", sd->dev_id); - device_devup_setup(sd->dev_id); + info("HCI dev %d up", dev_id); + device_devup_setup(dev_id); break; case HCI_DEV_DOWN: - info("HCI dev %d down", sd->dev_id); - manager_stop_adapter(sd->dev_id); - stop_security_manager(sd->dev_id); + info("HCI dev %d down", dev_id); + manager_stop_adapter(dev_id); + stop_security_manager(dev_id); break; } } @@ -589,6 +587,7 @@ static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, { unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr; evt_stack_internal *si; + evt_si_device *sd; hci_event_hdr *eh; int type; size_t len; @@ -620,7 +619,8 @@ static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, si = (evt_stack_internal *) ptr; switch (si->type) { case EVT_SI_DEVICE: - device_event(chan, si); + sd = (void *) &si->data; + device_event(sd->event, sd->dev_id); break; } -- 1.5.6.3
From e7d693a44d62c7c8b871f28a3984888e9ddb0130 Mon Sep 17 00:00:00 2001 From: Alok Barsode <alok.barsode@xxxxxxxxxx> Date: Tue, 21 Apr 2009 22:02:16 +0530 Subject: [PATCH 3/4] Using device_event to register and setup already known devices. --- src/main.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 02b4ebf..a5885fe 100644 --- a/src/main.c +++ b/src/main.c @@ -529,13 +529,10 @@ static void init_all_devices(int ctl) gboolean devup; devup = hci_test_bit(HCI_UP, &dr->dev_opt); + if (!devup) + device_event(HCI_DEV_REG, dr->dev_id); - info("HCI dev %d registered", dr->dev_id); - device_devreg_setup(dr->dev_id, devup); - if (devup) { - info("HCI dev %d already up", dr->dev_id); - device_devup_setup(dr->dev_id); - } + device_event(HCI_DEV_UP, dr->dev_id); } g_free(dl); -- 1.5.6.3
From 7fb126d187d626d796047135fe3dc9dd39ab6dcf Mon Sep 17 00:00:00 2001 From: Alok Barsode <alok.barsode@xxxxxxxxxx> Date: Wed, 22 Apr 2009 16:34:09 +0530 Subject: [PATCH 4/4] Initializing hci raw socket plugin. Adding IO event handling. --- plugins/hciops.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++- src/main.c | 122 +------------------------------------------------ 2 files changed, 135 insertions(+), 122 deletions(-) diff --git a/plugins/hciops.c b/plugins/hciops.c index 4f56443..965b1c8 100644 --- a/plugins/hciops.c +++ b/plugins/hciops.c @@ -24,17 +24,150 @@ #ifdef HAVE_CONFIG_H #include <config.h> #endif +#include <errno.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/ioctl.h> #include <bluetooth/bluetooth.h> +#include <bluetooth/hci.h> +#include <bluetooth/hci_lib.h> +#include <glib.h> + +#include "hcid.h" #include "plugin.h" #include "logging.h" -static int hciops_init(void) + +static int init_all_devices(int ctl) { + struct hci_dev_list_req *dl; + struct hci_dev_req *dr; + int i; + + dl = g_try_malloc0(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)); + if (!dl) { + info("Can't allocate devlist buffer: %s (%d)", + strerror(errno), errno); + return errno; + } + + dl->dev_num = HCI_MAX_DEV; + dr = dl->dev_req; + + if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) { + info("Can't get device list: %s (%d)", + strerror(errno), errno); + return errno; + } + + for (i = 0; i < dl->dev_num; i++, dr++) { + gboolean devup; + + devup = hci_test_bit(HCI_UP, &dr->dev_opt); + + if (!devup) + device_event(HCI_DEV_REG, dr->dev_id); + + device_event(HCI_DEV_UP, dr->dev_id); + } + + g_free(dl); return 0; } +static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, + gpointer data) +{ + unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr; + evt_stack_internal *si; + evt_si_device *sd; + hci_event_hdr *eh; + int type; + size_t len; + GIOError err; + + ptr = buf; + + err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len); + if (err) { + if (err == G_IO_ERROR_AGAIN) + return TRUE; + + error("Read from control socket failed: %s (%d)", + strerror(errno), errno); + return FALSE; + } + + type = *ptr++; + + if (type != HCI_EVENT_PKT) + return TRUE; + + eh = (hci_event_hdr *) ptr; + if (eh->evt != EVT_STACK_INTERNAL) + return TRUE; + + ptr += HCI_EVENT_HDR_SIZE; + + si = (evt_stack_internal *) ptr; + switch (si->type) { + case EVT_SI_DEVICE: + sd = (void *) &si->data; + device_event(sd->event, sd->dev_id); + break; + } + + return TRUE; +} + +static int hciops_init(void) +{ + struct sockaddr_hci addr; + struct hci_filter flt; + GIOChannel *ctl_io; + int sock; + + /* Create and bind HCI socket */ + sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); + if (sock < 0) { + error("Can't open HCI socket: %s (%d)", strerror(errno), + errno); + return errno; + } + + /* Set filter */ + hci_filter_clear(&flt); + hci_filter_set_ptype(HCI_EVENT_PKT, &flt); + hci_filter_set_event(EVT_STACK_INTERNAL, &flt); + if (setsockopt(sock, SOL_HCI, HCI_FILTER, &flt, + sizeof(flt)) < 0) { + error("Can't set filter: %s (%d)", strerror(errno), errno); + return errno; + } + + memset(&addr, 0, sizeof(addr)); + addr.hci_family = AF_BLUETOOTH; + addr.hci_dev = HCI_DEV_NONE; + if (bind(sock, (struct sockaddr *) &addr, + sizeof(addr)) < 0) { + error("Can't bind HCI socket: %s (%d)", + strerror(errno), errno); + return errno; + } + + ctl_io = g_io_channel_unix_new(sock); + g_io_channel_set_close_on_unref(ctl_io, TRUE); + + g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL); + + g_io_channel_unref(ctl_io); + + /* Initialize already connected devices */ + return init_all_devices(sock); +} + static void hciops_exit(void) { } diff --git a/src/main.c b/src/main.c index a5885fe..83e56cf 100644 --- a/src/main.c +++ b/src/main.c @@ -503,41 +503,6 @@ static void device_devup_setup(int dev_id) stop_security_manager(dev_id); } -static void init_all_devices(int ctl) -{ - struct hci_dev_list_req *dl; - struct hci_dev_req *dr; - int i; - - dl = g_try_malloc0(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)); - if (!dl) { - info("Can't allocate devlist buffer: %s (%d)", - strerror(errno), errno); - exit(1); - } - - dl->dev_num = HCI_MAX_DEV; - dr = dl->dev_req; - - if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) { - info("Can't get device list: %s (%d)", - strerror(errno), errno); - exit(1); - } - - for (i = 0; i < dl->dev_num; i++, dr++) { - gboolean devup; - - devup = hci_test_bit(HCI_UP, &dr->dev_opt); - if (!devup) - device_event(HCI_DEV_REG, dr->dev_id); - - device_event(HCI_DEV_UP, dr->dev_id); - } - - g_free(dl); -} - static void init_defaults(void) { /* Default HCId settings */ @@ -579,51 +544,6 @@ void device_event(int event, int dev_id) } } -static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, - gpointer data) -{ - unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr; - evt_stack_internal *si; - evt_si_device *sd; - hci_event_hdr *eh; - int type; - size_t len; - GIOError err; - - ptr = buf; - - err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len); - if (err) { - if (err == G_IO_ERROR_AGAIN) - return TRUE; - - error("Read from control socket failed: %s (%d)", - strerror(errno), errno); - return FALSE; - } - - type = *ptr++; - - if (type != HCI_EVENT_PKT) - return TRUE; - - eh = (hci_event_hdr *) ptr; - if (eh->evt != EVT_STACK_INTERNAL) - return TRUE; - - ptr += HCI_EVENT_HDR_SIZE; - - si = (evt_stack_internal *) ptr; - switch (si->type) { - case EVT_SI_DEVICE: - sd = (void *) &si->data; - device_event(sd->event, sd->dev_id); - break; - } - - return TRUE; -} - static GMainLoop *event_loop; static void sig_term(int sig) @@ -652,10 +572,8 @@ int main(int argc, char *argv[]) { GOptionContext *context; GError *err = NULL; - struct sockaddr_hci addr; - struct hci_filter flt; struct sigaction sa; - GIOChannel *ctl_io, *child_io; + GIOChannel *child_io; uint16_t mtu = 0; GKeyFile *config; @@ -703,34 +621,6 @@ int main(int argc, char *argv[]) enable_debug(); } - /* Create and bind HCI socket */ - main_opts.sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - if (main_opts.sock < 0) { - error("Can't open HCI socket: %s (%d)", strerror(errno), - errno); - exit(1); - } - - /* Set filter */ - hci_filter_clear(&flt); - hci_filter_set_ptype(HCI_EVENT_PKT, &flt); - hci_filter_set_event(EVT_STACK_INTERNAL, &flt); - if (setsockopt(main_opts.sock, SOL_HCI, HCI_FILTER, &flt, - sizeof(flt)) < 0) { - error("Can't set filter: %s (%d)", strerror(errno), errno); - exit(1); - } - - memset(&addr, 0, sizeof(addr)); - addr.hci_family = AF_BLUETOOTH; - addr.hci_dev = HCI_DEV_NONE; - if (bind(main_opts.sock, (struct sockaddr *) &addr, - sizeof(addr)) < 0) { - error("Can't bind HCI socket: %s (%d)", - strerror(errno), errno); - exit(1); - } - config = load_config(CONFIGDIR "/main.conf"); parse_config(config); @@ -765,16 +655,6 @@ int main(int argc, char *argv[]) event_loop = g_main_loop_new(NULL, FALSE); - ctl_io = g_io_channel_unix_new(main_opts.sock); - g_io_channel_set_close_on_unref(ctl_io, TRUE); - - g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL); - - g_io_channel_unref(ctl_io); - - /* Initialize already connected devices */ - init_all_devices(main_opts.sock); - starting = FALSE; manager_startup_complete(); -- 1.5.6.3