* [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask
@ 2017-12-21 16:47 Grzegorz Kolodziejczyk
2017-12-21 16:47 ` [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper Grzegorz Kolodziejczyk
` (5 more replies)
0 siblings, 6 replies; 15+ messages in thread
From: Grzegorz Kolodziejczyk @ 2017-12-21 16:47 UTC (permalink / raw)
To: linux-bluetooth
This patch modifies gap device found flags to be bit masks as in other
defined flags groups in btp.
---
src/shared/btp.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/shared/btp.h b/src/shared/btp.h
index 5044de822..7b1f48817 100644
--- a/src/shared/btp.h
+++ b/src/shared/btp.h
@@ -241,9 +241,9 @@ struct btp_new_settings_ev {
uint32_t current_settings;
} __packed;
-#define BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI 0x00
-#define BTP_EV_GAP_DEVICE_FOUND_FLAG_AD 0x01
-#define BTP_EV_GAP_DEVICE_FOUND_FLAG_SR 0x02
+#define BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI 0x01
+#define BTP_EV_GAP_DEVICE_FOUND_FLAG_AD 0x02
+#define BTP_EV_GAP_DEVICE_FOUND_FLAG_SR 0x04
#define BTP_EV_GAP_DEVICE_FOUND 0x81
struct btp_device_found_ev {
--
2.13.6
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk @ 2017-12-21 16:47 ` Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-21 16:47 ` [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter Grzegorz Kolodziejczyk ` (4 subsequent siblings) 5 siblings, 1 reply; 15+ messages in thread From: Grzegorz Kolodziejczyk @ 2017-12-21 16:47 UTC (permalink / raw) To: linux-bluetooth This patch makes local helper with string to address conversion. --- tools/btpclient.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/btpclient.c b/tools/btpclient.c index 9ea624995..27e5a498e 100644 --- a/tools/btpclient.c +++ b/tools/btpclient.c @@ -52,6 +52,12 @@ static struct btp *btp; static bool gap_service_registered; +static inline uint8_t str2addr(const char *str, uint8_t *addr) +{ + return sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &addr[5], &addr[4], + &addr[3], &addr[2], &addr[1], &addr[0]); +} + static struct btp_adapter *find_adapter_by_proxy(struct l_dbus_proxy *proxy) { const struct l_queue_entry *entry; @@ -171,9 +177,7 @@ static void btp_gap_read_info(uint8_t index, const void *param, uint16_t length, if (!l_dbus_proxy_get_property(adapter->proxy, "Address", "s", &str)) goto failed; - if (sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", - &rp.address[5], &rp.address[4], &rp.address[3], - &rp.address[2], &rp.address[1], &rp.address[0]) != 6) + if (str2addr(str, rp.address) != 6) goto failed; if (!l_dbus_proxy_get_property(adapter->proxy, "Name", "s", &str)) { -- 2.13.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper 2017-12-21 16:47 ` [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper Grzegorz Kolodziejczyk @ 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:49 ` Grzegorz Kołodziejczyk 0 siblings, 1 reply; 15+ messages in thread From: Szymon Janc @ 2017-12-22 10:48 UTC (permalink / raw) To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth Hi Grzegorz, On Thursday, 21 December 2017 17:47:16 CET Grzegorz Kolodziejczyk wrote: > This patch makes local helper with string to address conversion. > --- > tools/btpclient.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/tools/btpclient.c b/tools/btpclient.c > index 9ea624995..27e5a498e 100644 > --- a/tools/btpclient.c > +++ b/tools/btpclient.c > @@ -52,6 +52,12 @@ static struct btp *btp; > > static bool gap_service_registered; > > +static inline uint8_t str2addr(const char *str, uint8_t *addr) Just static, no need for inline in .c file. Also make this return bool and verify sscanf return value in helper. > +{ > + return sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &addr[5], &addr[4], > + &addr[3], &addr[2], &addr[1], &addr[0]); > +} > + > static struct btp_adapter *find_adapter_by_proxy(struct l_dbus_proxy > *proxy) { > const struct l_queue_entry *entry; > @@ -171,9 +177,7 @@ static void btp_gap_read_info(uint8_t index, const void > *param, uint16_t length, if (!l_dbus_proxy_get_property(adapter->proxy, > "Address", "s", &str)) goto failed; > > - if (sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", > - &rp.address[5], &rp.address[4], &rp.address[3], > - &rp.address[2], &rp.address[1], &rp.address[0]) != 6) > + if (str2addr(str, rp.address) != 6) > goto failed; > > if (!l_dbus_proxy_get_property(adapter->proxy, "Name", "s", &str)) { -- pozdrawiam Szymon Janc ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper 2017-12-22 10:48 ` Szymon Janc @ 2017-12-22 13:49 ` Grzegorz Kołodziejczyk 0 siblings, 0 replies; 15+ messages in thread From: Grzegorz Kołodziejczyk @ 2017-12-22 13:49 UTC (permalink / raw) To: Szymon Janc; +Cc: linux-bluetooth Hi, 2017-12-22 11:48 GMT+01:00 Szymon Janc <szymon.janc@codecoup.pl>: > Hi Grzegorz, > > On Thursday, 21 December 2017 17:47:16 CET Grzegorz Kolodziejczyk wrote: >> This patch makes local helper with string to address conversion. >> --- >> tools/btpclient.c | 10 +++++++--- >> 1 file changed, 7 insertions(+), 3 deletions(-) >> >> diff --git a/tools/btpclient.c b/tools/btpclient.c >> index 9ea624995..27e5a498e 100644 >> --- a/tools/btpclient.c >> +++ b/tools/btpclient.c >> @@ -52,6 +52,12 @@ static struct btp *btp; >> >> static bool gap_service_registered; >> >> +static inline uint8_t str2addr(const char *str, uint8_t *addr) > > Just static, no need for inline in .c file. > Also make this return bool and verify sscanf return value in helper. OK > >> +{ >> + return sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &addr[5], &addr= [4], >> + &addr[3], &addr[2], &addr[1], &add= r[0]); >> +} >> + >> static struct btp_adapter *find_adapter_by_proxy(struct l_dbus_proxy >> *proxy) { >> const struct l_queue_entry *entry; >> @@ -171,9 +177,7 @@ static void btp_gap_read_info(uint8_t index, const v= oid >> *param, uint16_t length, if (!l_dbus_proxy_get_property(adapter->proxy, >> "Address", "s", &str)) goto failed; >> >> - if (sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", >> - &rp.address[5], &rp.address[4], &rp.address[3], >> - &rp.address[2], &rp.address[1], &rp.address[0]) != =3D 6) >> + if (str2addr(str, rp.address) !=3D 6) >> goto failed; >> >> if (!l_dbus_proxy_get_property(adapter->proxy, "Name", "s", &str))= { > > > -- > pozdrawiam > Szymon Janc pozdrawiam, Grzegorz Ko=C5=82odziejczyk ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper Grzegorz Kolodziejczyk @ 2017-12-21 16:47 ` Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-21 16:47 ` [PATCH BlueZ 4/6] tools/btpclient: Add device found event Grzegorz Kolodziejczyk ` (3 subsequent siblings) 5 siblings, 1 reply; 15+ messages in thread From: Grzegorz Kolodziejczyk @ 2017-12-21 16:47 UTC (permalink / raw) To: linux-bluetooth Advertising manager proxy is required to handle advertise related operations in adapter context. --- tools/btpclient.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/btpclient.c b/tools/btpclient.c index 27e5a498e..095c5ea3e 100644 --- a/tools/btpclient.c +++ b/tools/btpclient.c @@ -36,6 +36,7 @@ struct btp_adapter { struct l_dbus_proxy *proxy; + struct l_dbus_proxy *ad_proxy; uint8_t index; uint32_t supported_settings; uint32_t current_settings; @@ -659,6 +660,17 @@ static void proxy_added(struct l_dbus_proxy *proxy, void *user_data) device->proxy = proxy; l_queue_push_tail(adapter->devices, device); + + return; + } + + if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) { + struct btp_adapter *adapter; + + adapter = find_adapter_by_path(path); + + adapter->ad_proxy = proxy; + return; } } -- 2.13.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter 2017-12-21 16:47 ` [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter Grzegorz Kolodziejczyk @ 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:50 ` Grzegorz Kołodziejczyk 0 siblings, 1 reply; 15+ messages in thread From: Szymon Janc @ 2017-12-22 10:48 UTC (permalink / raw) To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth Hi Grzegorz, On Thursday, 21 December 2017 17:47:17 CET Grzegorz Kolodziejczyk wrote: > Advertising manager proxy is required to handle advertise related > operations in adapter context. > --- > tools/btpclient.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/tools/btpclient.c b/tools/btpclient.c > index 27e5a498e..095c5ea3e 100644 > --- a/tools/btpclient.c > +++ b/tools/btpclient.c > @@ -36,6 +36,7 @@ > > struct btp_adapter { > struct l_dbus_proxy *proxy; > + struct l_dbus_proxy *ad_proxy; > uint8_t index; > uint32_t supported_settings; > uint32_t current_settings; > @@ -659,6 +660,17 @@ static void proxy_added(struct l_dbus_proxy *proxy, > void *user_data) device->proxy = proxy; > > l_queue_push_tail(adapter->devices, device); > + > + return; > + } > + > + if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) { > + struct btp_adapter *adapter; > + > + adapter = find_adapter_by_path(path); This may return NULL if we failed to add proxy of adapter or due to invalid message. Please check that. > + > + adapter->ad_proxy = proxy; > + > return; > } > } -- pozdrawiam Szymon Janc ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter 2017-12-22 10:48 ` Szymon Janc @ 2017-12-22 13:50 ` Grzegorz Kołodziejczyk 0 siblings, 0 replies; 15+ messages in thread From: Grzegorz Kołodziejczyk @ 2017-12-22 13:50 UTC (permalink / raw) To: Szymon Janc; +Cc: linux-bluetooth Hi, 2017-12-22 11:48 GMT+01:00 Szymon Janc <szymon.janc@codecoup.pl>: > Hi Grzegorz, > > On Thursday, 21 December 2017 17:47:17 CET Grzegorz Kolodziejczyk wrote: >> Advertising manager proxy is required to handle advertise related >> operations in adapter context. >> --- >> tools/btpclient.c | 12 ++++++++++++ >> 1 file changed, 12 insertions(+) >> >> diff --git a/tools/btpclient.c b/tools/btpclient.c >> index 27e5a498e..095c5ea3e 100644 >> --- a/tools/btpclient.c >> +++ b/tools/btpclient.c >> @@ -36,6 +36,7 @@ >> >> struct btp_adapter { >> struct l_dbus_proxy *proxy; >> + struct l_dbus_proxy *ad_proxy; >> uint8_t index; >> uint32_t supported_settings; >> uint32_t current_settings; >> @@ -659,6 +660,17 @@ static void proxy_added(struct l_dbus_proxy *proxy, >> void *user_data) device->proxy =3D proxy; >> >> l_queue_push_tail(adapter->devices, device); >> + >> + return; >> + } >> + >> + if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) { >> + struct btp_adapter *adapter; >> + >> + adapter =3D find_adapter_by_path(path); > > This may return NULL if we failed to add proxy of adapter or due to inval= id > message. Please check that. OK > >> + >> + adapter->ad_proxy =3D proxy; >> + >> return; >> } >> } > > > -- > pozdrawiam > Szymon Janc pozdrawiam Grzegorz Ko=C5=82odziejczyk ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH BlueZ 4/6] tools/btpclient: Add device found event 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper Grzegorz Kolodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter Grzegorz Kolodziejczyk @ 2017-12-21 16:47 ` Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-21 16:47 ` [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands Grzegorz Kolodziejczyk ` (2 subsequent siblings) 5 siblings, 1 reply; 15+ messages in thread From: Grzegorz Kolodziejczyk @ 2017-12-21 16:47 UTC (permalink / raw) To: linux-bluetooth This patch adds device found event handler. It's called when rssi property of device changes and new device interface is added. --- tools/btpclient.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tools/btpclient.c b/tools/btpclient.c index 095c5ea3e..c0ad03b68 100644 --- a/tools/btpclient.c +++ b/tools/btpclient.c @@ -399,6 +399,37 @@ failed: btp_send_error(btp, BTP_GAP_SERVICE, index, status); } +static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy) +{ + struct btp_device_found_ev ev; + const char *str; + + if (!l_dbus_proxy_get_property(proxy, "Address", "s", &str) || + (str2addr(str, ev.address) != 6)) + return; + + if (!l_dbus_proxy_get_property(proxy, "AddressType", "s", &str)) + return; + + ev.address_type = strcmp(str, "public") ? BTP_GAP_ADDR_RANDOM : + BTP_GAP_ADDR_PUBLIC; + + if (!l_dbus_proxy_get_property(proxy, "RSSI", "n", &ev.rssi)) + return; + + /* TODO Temporary set all flags */ + ev.flags = (BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI | + BTP_EV_GAP_DEVICE_FOUND_FLAG_AD | + BTP_EV_GAP_DEVICE_FOUND_FLAG_SR); + + /* TODO Add eir to device found event */ + ev.eir_len = 0; + + btp_send(btp, BTP_GAP_SERVICE, BTP_EV_GAP_DEVICE_FOUND, + BTP_INDEX_NON_CONTROLLER, + sizeof(ev) + ev.eir_len, &ev); +} + static void register_gap_service(void) { btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_READ_SUPPORTED_COMMANDS, @@ -661,6 +692,8 @@ static void proxy_added(struct l_dbus_proxy *proxy, void *user_data) l_queue_push_tail(adapter->devices, device); + btp_gap_device_found_ev(proxy); + return; } @@ -782,6 +815,15 @@ static void property_changed(struct l_dbus_proxy *proxy, const char *name, update_current_settings(adapter, new_settings); return; + } else if (!strcmp(interface, "org.bluez.Device1")) { + if (!strcmp(name, "RSSI")) { + uint16_t rssi; + + if (!l_dbus_message_get_arguments(msg, "n", &rssi)) + return; + + btp_gap_device_found_ev(proxy); + } } } -- 2.13.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 4/6] tools/btpclient: Add device found event 2017-12-21 16:47 ` [PATCH BlueZ 4/6] tools/btpclient: Add device found event Grzegorz Kolodziejczyk @ 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:51 ` Grzegorz Kołodziejczyk 0 siblings, 1 reply; 15+ messages in thread From: Szymon Janc @ 2017-12-22 10:48 UTC (permalink / raw) To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth Hi Grzegorz, On Thursday, 21 December 2017 17:47:18 CET Grzegorz Kolodziejczyk wrote: > This patch adds device found event handler. It's called when rssi > property of device changes and new device interface is added. > --- > tools/btpclient.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/tools/btpclient.c b/tools/btpclient.c > index 095c5ea3e..c0ad03b68 100644 > --- a/tools/btpclient.c > +++ b/tools/btpclient.c > @@ -399,6 +399,37 @@ failed: > btp_send_error(btp, BTP_GAP_SERVICE, index, status); > } > > +static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy) > +{ > + struct btp_device_found_ev ev; > + const char *str; > + > + if (!l_dbus_proxy_get_property(proxy, "Address", "s", &str) || > + (str2addr(str, ev.address) != 6)) > + return; > + > + if (!l_dbus_proxy_get_property(proxy, "AddressType", "s", &str)) > + return; > + > + ev.address_type = strcmp(str, "public") ? BTP_GAP_ADDR_RANDOM : > + BTP_GAP_ADDR_PUBLIC; > + > + if (!l_dbus_proxy_get_property(proxy, "RSSI", "n", &ev.rssi)) "n" expects pointer to int16_t so you need to use local tmp for this. (this is due to no signed int8_t on D-Bus, only byte type) > + return; > + > + /* TODO Temporary set all flags */ > + ev.flags = (BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI | > + BTP_EV_GAP_DEVICE_FOUND_FLAG_AD | > + BTP_EV_GAP_DEVICE_FOUND_FLAG_SR); > + > + /* TODO Add eir to device found event */ > + ev.eir_len = 0; > + > + btp_send(btp, BTP_GAP_SERVICE, BTP_EV_GAP_DEVICE_FOUND, > + BTP_INDEX_NON_CONTROLLER, > + sizeof(ev) + ev.eir_len, &ev); > +} > + > static void register_gap_service(void) > { > btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_READ_SUPPORTED_COMMANDS, > @@ -661,6 +692,8 @@ static void proxy_added(struct l_dbus_proxy *proxy, void > *user_data) > > l_queue_push_tail(adapter->devices, device); > > + btp_gap_device_found_ev(proxy); > + > return; > } > > @@ -782,6 +815,15 @@ static void property_changed(struct l_dbus_proxy > *proxy, const char *name, update_current_settings(adapter, new_settings); > > return; > + } else if (!strcmp(interface, "org.bluez.Device1")) { > + if (!strcmp(name, "RSSI")) { > + uint16_t rssi; Should be int16_t. > + > + if (!l_dbus_message_get_arguments(msg, "n", &rssi)) > + return; > + > + btp_gap_device_found_ev(proxy); > + } > } > } -- pozdrawiam Szymon Janc ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 4/6] tools/btpclient: Add device found event 2017-12-22 10:48 ` Szymon Janc @ 2017-12-22 13:51 ` Grzegorz Kołodziejczyk 0 siblings, 0 replies; 15+ messages in thread From: Grzegorz Kołodziejczyk @ 2017-12-22 13:51 UTC (permalink / raw) To: Szymon Janc; +Cc: linux-bluetooth Hi, 2017-12-22 11:48 GMT+01:00 Szymon Janc <szymon.janc@codecoup.pl>: > Hi Grzegorz, > > On Thursday, 21 December 2017 17:47:18 CET Grzegorz Kolodziejczyk wrote: >> This patch adds device found event handler. It's called when rssi >> property of device changes and new device interface is added. >> --- >> tools/btpclient.c | 42 ++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 42 insertions(+) >> >> diff --git a/tools/btpclient.c b/tools/btpclient.c >> index 095c5ea3e..c0ad03b68 100644 >> --- a/tools/btpclient.c >> +++ b/tools/btpclient.c >> @@ -399,6 +399,37 @@ failed: >> btp_send_error(btp, BTP_GAP_SERVICE, index, status); >> } >> >> +static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy) >> +{ >> + struct btp_device_found_ev ev; >> + const char *str; >> + >> + if (!l_dbus_proxy_get_property(proxy, "Address", "s", &str) || >> + (str2addr(str, ev.address) !=3D 6)= ) >> + return; >> + >> + if (!l_dbus_proxy_get_property(proxy, "AddressType", "s", &str)) >> + return; >> + >> + ev.address_type =3D strcmp(str, "public") ? BTP_GAP_ADDR_RANDOM : >> + BTP_GAP_ADDR_PUBLI= C; >> + >> + if (!l_dbus_proxy_get_property(proxy, "RSSI", "n", &ev.rssi)) > > "n" expects pointer to int16_t so you need to use local tmp for this. > (this is due to no signed int8_t on D-Bus, only byte type) Ok > >> + return; >> + >> + /* TODO Temporary set all flags */ >> + ev.flags =3D (BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI | >> + BTP_EV_GAP_DEVICE_FOUND_FLAG_AD | >> + BTP_EV_GAP_DEVICE_FOUND_FLAG_SR); >> + >> + /* TODO Add eir to device found event */ >> + ev.eir_len =3D 0; >> + >> + btp_send(btp, BTP_GAP_SERVICE, BTP_EV_GAP_DEVICE_FOUND, >> + BTP_INDEX_NON_CONTROLLER, >> + sizeof(ev) + ev.eir_len, &= ev); >> +} >> + >> static void register_gap_service(void) >> { >> btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_READ_SUPPORTED_COMMA= NDS, >> @@ -661,6 +692,8 @@ static void proxy_added(struct l_dbus_proxy *proxy, = void >> *user_data) >> >> l_queue_push_tail(adapter->devices, device); >> >> + btp_gap_device_found_ev(proxy); >> + >> return; >> } >> >> @@ -782,6 +815,15 @@ static void property_changed(struct l_dbus_proxy >> *proxy, const char *name, update_current_settings(adapter, new_settings)= ; >> >> return; >> + } else if (!strcmp(interface, "org.bluez.Device1")) { >> + if (!strcmp(name, "RSSI")) { >> + uint16_t rssi; > > Should be int16_t. Right, I've made typo > >> + >> + if (!l_dbus_message_get_arguments(msg, "n", &rssi)= ) >> + return; >> + >> + btp_gap_device_found_ev(proxy); >> + } >> } >> } > > > -- > pozdrawiam > Szymon Janc pozdrawiam, Grzegorz Ko=C5=82odziejczyk ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk ` (2 preceding siblings ...) 2017-12-21 16:47 ` [PATCH BlueZ 4/6] tools/btpclient: Add device found event Grzegorz Kolodziejczyk @ 2017-12-21 16:47 ` Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-21 16:47 ` [PATCH BlueZ 6/6] tools/btpclient: Add set connectable command Grzegorz Kolodziejczyk 2017-12-22 10:49 ` [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Szymon Janc 5 siblings, 1 reply; 15+ messages in thread From: Grzegorz Kolodziejczyk @ 2017-12-21 16:47 UTC (permalink / raw) To: linux-bluetooth This patch adds start and stop discovery command for btp client. --- tools/btpclient.c | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) diff --git a/tools/btpclient.c b/tools/btpclient.c index c0ad03b68..f4b930a51 100644 --- a/tools/btpclient.c +++ b/tools/btpclient.c @@ -122,6 +122,8 @@ static void btp_gap_read_commands(uint8_t index, const void *param, commands |= (1 << BTP_OP_GAP_SET_POWERED); commands |= (1 << BTP_OP_GAP_SET_DISCOVERABLE); commands |= (1 << BTP_OP_GAP_SET_BONDABLE); + commands |= (1 << BTP_OP_GAP_START_DISCOVERY); + commands |= (1 << BTP_OP_GAP_STOP_DISCOVERY); commands = L_CPU_TO_LE16(commands); @@ -399,6 +401,218 @@ failed: btp_send_error(btp, BTP_GAP_SERVICE, index, status); } +static void start_discovery_reply(struct l_dbus_proxy *proxy, + struct l_dbus_message *result, + void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); + + if (!adapter) { + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, + BTP_ERROR_FAIL); + return; + } + + if (l_dbus_message_is_error(result)) { + const char *name, *desc; + + l_dbus_message_get_error(result, &name, &desc); + l_error("Failed to start discovery (%s), %s", name, desc); + + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, + BTP_ERROR_FAIL); + return; + } + + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_START_DISCOVERY, + adapter->index, 0, NULL); +} + +static void set_start_discovery_filter_setup(struct l_dbus_message *message, + void *user_data) +{ + uint8_t flags = L_PTR_TO_UINT(user_data); + struct l_dbus_message_builder *builder; + + builder = l_dbus_message_builder_new(message); + + l_dbus_message_builder_enter_array(builder, "{sv}"); + l_dbus_message_builder_enter_dict(builder, "sv"); + + /* Be in observer mode or in general mode (default in Bluez) */ + if (flags & BTP_GAP_DISCOVERY_FLAG_OBSERVATION) { + l_dbus_message_builder_append_basic(builder, 's', "Transport"); + l_dbus_message_builder_enter_variant(builder, "s"); + + if (flags & (BTP_GAP_DISCOVERY_FLAG_LE | + BTP_GAP_DISCOVERY_FLAG_BREDR)) + l_dbus_message_builder_append_basic(builder, 's', + "auto"); + else if (flags & BTP_GAP_DISCOVERY_FLAG_LE) + l_dbus_message_builder_append_basic(builder, 's', "le"); + else if (flags & BTP_GAP_DISCOVERY_FLAG_BREDR) + l_dbus_message_builder_append_basic(builder, 's', + "bredr"); + + l_dbus_message_builder_leave_variant(builder); + } + + l_dbus_message_builder_leave_dict(builder); + l_dbus_message_builder_leave_array(builder); + + /* TODO add passive, limited discovery */ + l_dbus_message_builder_finalize(builder); + l_dbus_message_builder_destroy(builder); +} + +static void set_start_discovery_filter_reply(struct l_dbus_proxy *proxy, + struct l_dbus_message *result, + void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); + + if (!adapter) { + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, + BTP_ERROR_FAIL); + return; + } + + if (l_dbus_message_is_error(result)) { + const char *name, *desc; + + l_dbus_message_get_error(result, &name, &desc); + l_error("Failed to set discovery filter (%s), %s", name, desc); + + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, + BTP_ERROR_FAIL); + return; + } + + l_dbus_proxy_method_call(adapter->proxy, "StartDiscovery", NULL, + start_discovery_reply, NULL, NULL); +} + +static void btp_gap_start_discovery(uint8_t index, const void *param, + uint16_t length, void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_index(index); + const struct btp_gap_start_discovery_cp *cp = param; + bool prop; + + if (!adapter) { + btp_send_error(btp, BTP_GAP_SERVICE, index, + BTP_ERROR_INVALID_INDEX); + return; + } + + /* Adapter needs to be powered to start discovery */ + if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &prop) || + !prop) { + btp_send_error(btp, BTP_GAP_SERVICE, index, BTP_ERROR_FAIL); + return; + } + + l_dbus_proxy_method_call(adapter->proxy, "SetDiscoveryFilter", + set_start_discovery_filter_setup, + set_start_discovery_filter_reply, + L_UINT_TO_PTR(cp->flags), NULL); +} + +static void set_stop_discovery_filter_setup(struct l_dbus_message *message, + void *user_data) +{ + struct l_dbus_message_builder *builder; + + builder = l_dbus_message_builder_new(message); + + /* Clear discovery filter setup */ + l_dbus_message_builder_enter_array(builder, "{sv}"); + l_dbus_message_builder_enter_dict(builder, "sv"); + l_dbus_message_builder_leave_dict(builder); + l_dbus_message_builder_leave_array(builder); + l_dbus_message_builder_finalize(builder); + l_dbus_message_builder_destroy(builder); +} + +static void set_stop_discovery_filter_reply(struct l_dbus_proxy *proxy, + struct l_dbus_message *result, + void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); + + if (!adapter) { + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, + BTP_ERROR_FAIL); + return; + } + + if (l_dbus_message_is_error(result)) { + const char *name, *desc; + + l_dbus_message_get_error(result, &name, &desc); + l_error("Failed to set discovery filter (%s), %s", name, desc); + + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, + BTP_ERROR_FAIL); + return; + } + + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_STOP_DISCOVERY, + adapter->index, 0, NULL); +} + +static void stop_discovery_reply(struct l_dbus_proxy *proxy, + struct l_dbus_message *result, + void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); + + if (!adapter) { + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, + BTP_ERROR_FAIL); + return; + } + + if (l_dbus_message_is_error(result)) { + const char *name; + + l_dbus_message_get_error(result, &name, NULL); + l_error("Failed to stop discovery (%s)", name); + + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, + BTP_ERROR_FAIL); + return; + } + + l_dbus_proxy_method_call(adapter->proxy, "SetDiscoveryFilter", + set_stop_discovery_filter_setup, + set_stop_discovery_filter_reply, + NULL, NULL); +} + +static void btp_gap_stop_discovery(uint8_t index, const void *param, + uint16_t length, void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_index(index); + bool prop; + + if (!adapter) { + btp_send_error(btp, BTP_GAP_SERVICE, index, + BTP_ERROR_INVALID_INDEX); + return; + } + + /* Adapter needs to be powered to be able to remove devices */ + if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &prop) || + !prop) { + btp_send_error(btp, BTP_GAP_SERVICE, index, BTP_ERROR_FAIL); + return; + } + + l_dbus_proxy_method_call(adapter->proxy, "StopDiscovery", NULL, + stop_discovery_reply, NULL, NULL); +} + static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy) { struct btp_device_found_ev ev; @@ -453,6 +667,12 @@ static void register_gap_service(void) btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_BONDABLE, btp_gap_set_bondable, NULL, NULL); + + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_START_DISCOVERY, + btp_gap_start_discovery, NULL, NULL); + + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_STOP_DISCOVERY, + btp_gap_stop_discovery, NULL, NULL); } static void btp_core_read_commands(uint8_t index, const void *param, -- 2.13.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands 2017-12-21 16:47 ` [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands Grzegorz Kolodziejczyk @ 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:53 ` Grzegorz Kołodziejczyk 0 siblings, 1 reply; 15+ messages in thread From: Szymon Janc @ 2017-12-22 10:48 UTC (permalink / raw) To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth On Thursday, 21 December 2017 17:47:19 CET Grzegorz Kolodziejczyk wrote: > This patch adds start and stop discovery command for btp client. > --- > tools/btpclient.c | 220 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 > insertions(+) > > diff --git a/tools/btpclient.c b/tools/btpclient.c > index c0ad03b68..f4b930a51 100644 > --- a/tools/btpclient.c > +++ b/tools/btpclient.c > @@ -122,6 +122,8 @@ static void btp_gap_read_commands(uint8_t index, const > void *param, commands |= (1 << BTP_OP_GAP_SET_POWERED); > commands |= (1 << BTP_OP_GAP_SET_DISCOVERABLE); > commands |= (1 << BTP_OP_GAP_SET_BONDABLE); > + commands |= (1 << BTP_OP_GAP_START_DISCOVERY); > + commands |= (1 << BTP_OP_GAP_STOP_DISCOVERY); > > commands = L_CPU_TO_LE16(commands); > > @@ -399,6 +401,218 @@ failed: > btp_send_error(btp, BTP_GAP_SERVICE, index, status); > } > > +static void start_discovery_reply(struct l_dbus_proxy *proxy, > + struct l_dbus_message *result, > + void *user_data) > +{ > + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); > + > + if (!adapter) { > + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, > + BTP_ERROR_FAIL); > + return; > + } > + > + if (l_dbus_message_is_error(result)) { > + const char *name, *desc; > + > + l_dbus_message_get_error(result, &name, &desc); > + l_error("Failed to start discovery (%s), %s", name, desc); > + > + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, > + BTP_ERROR_FAIL); > + return; > + } > + > + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_START_DISCOVERY, > + adapter->index, 0, NULL); > +} > + > +static void set_start_discovery_filter_setup(struct l_dbus_message > *message, + void *user_data) > +{ > + uint8_t flags = L_PTR_TO_UINT(user_data); > + struct l_dbus_message_builder *builder; Add basic sanity check here for flags ie at least one of LE or BR should be set. > + > + builder = l_dbus_message_builder_new(message); > + > + l_dbus_message_builder_enter_array(builder, "{sv}"); > + l_dbus_message_builder_enter_dict(builder, "sv"); > + > + /* Be in observer mode or in general mode (default in Bluez) */ > + if (flags & BTP_GAP_DISCOVERY_FLAG_OBSERVATION) { > + l_dbus_message_builder_append_basic(builder, 's', "Transport"); > + l_dbus_message_builder_enter_variant(builder, "s"); > + > + if (flags & (BTP_GAP_DISCOVERY_FLAG_LE | > + BTP_GAP_DISCOVERY_FLAG_BREDR)) > + l_dbus_message_builder_append_basic(builder, 's', > + "auto"); > + else if (flags & BTP_GAP_DISCOVERY_FLAG_LE) > + l_dbus_message_builder_append_basic(builder, 's', "le"); > + else if (flags & BTP_GAP_DISCOVERY_FLAG_BREDR) > + l_dbus_message_builder_append_basic(builder, 's', > + "bredr"); > + > + l_dbus_message_builder_leave_variant(builder); > + } > + > + l_dbus_message_builder_leave_dict(builder); > + l_dbus_message_builder_leave_array(builder); > + > + /* TODO add passive, limited discovery */ > + l_dbus_message_builder_finalize(builder); > + l_dbus_message_builder_destroy(builder); > +} > + > +static void set_start_discovery_filter_reply(struct l_dbus_proxy *proxy, > + struct l_dbus_message *result, > + void *user_data) > +{ > + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); > + > + if (!adapter) { > + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, > + BTP_ERROR_FAIL); > + return; > + } > + > + if (l_dbus_message_is_error(result)) { > + const char *name, *desc; > + > + l_dbus_message_get_error(result, &name, &desc); > + l_error("Failed to set discovery filter (%s), %s", name, desc); > + > + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, > + BTP_ERROR_FAIL); > + return; > + } > + > + l_dbus_proxy_method_call(adapter->proxy, "StartDiscovery", NULL, > + start_discovery_reply, NULL, NULL); > +} > + > +static void btp_gap_start_discovery(uint8_t index, const void *param, > + uint16_t length, void *user_data) > +{ > + struct btp_adapter *adapter = find_adapter_by_index(index); > + const struct btp_gap_start_discovery_cp *cp = param; > + bool prop; > + > + if (!adapter) { > + btp_send_error(btp, BTP_GAP_SERVICE, index, > + BTP_ERROR_INVALID_INDEX); > + return; > + } > + > + /* Adapter needs to be powered to start discovery */ > + if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &prop) || > + !prop) { > + btp_send_error(btp, BTP_GAP_SERVICE, index, BTP_ERROR_FAIL); > + return; > + } > + > + l_dbus_proxy_method_call(adapter->proxy, "SetDiscoveryFilter", > + set_start_discovery_filter_setup, > + set_start_discovery_filter_reply, nitpick: Name it set_discovery_filer_setup/reply. > + L_UINT_TO_PTR(cp->flags), NULL); > +} > + > +static void set_stop_discovery_filter_setup(struct l_dbus_message *message, > + void *user_data) > +{ > + struct l_dbus_message_builder *builder; > + > + builder = l_dbus_message_builder_new(message); > + > + /* Clear discovery filter setup */ > + l_dbus_message_builder_enter_array(builder, "{sv}"); > + l_dbus_message_builder_enter_dict(builder, "sv"); > + l_dbus_message_builder_leave_dict(builder); > + l_dbus_message_builder_leave_array(builder); > + l_dbus_message_builder_finalize(builder); > + l_dbus_message_builder_destroy(builder); > +} > + > +static void set_stop_discovery_filter_reply(struct l_dbus_proxy *proxy, > + struct l_dbus_message *result, > + void *user_data) > +{ > + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); > + > + if (!adapter) { > + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, > + BTP_ERROR_FAIL); > + return; > + } > + > + if (l_dbus_message_is_error(result)) { > + const char *name, *desc; > + > + l_dbus_message_get_error(result, &name, &desc); > + l_error("Failed to set discovery filter (%s), %s", name, desc); > + > + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, > + BTP_ERROR_FAIL); > + return; > + } > + > + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_STOP_DISCOVERY, > + adapter->index, 0, NULL); > +} > + > +static void stop_discovery_reply(struct l_dbus_proxy *proxy, > + struct l_dbus_message *result, > + void *user_data) > +{ > + struct btp_adapter *adapter = find_adapter_by_proxy(proxy); > + > + if (!adapter) { > + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER, > + BTP_ERROR_FAIL); > + return; > + } > + > + if (l_dbus_message_is_error(result)) { > + const char *name; > + > + l_dbus_message_get_error(result, &name, NULL); > + l_error("Failed to stop discovery (%s)", name); > + > + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, > + BTP_ERROR_FAIL); > + return; > + } > + > + l_dbus_proxy_method_call(adapter->proxy, "SetDiscoveryFilter", > + set_stop_discovery_filter_setup, > + set_stop_discovery_filter_reply, Name those clear_discovery_filter_setup/reply. > + NULL, NULL); > +} > + > +static void btp_gap_stop_discovery(uint8_t index, const void *param, > + uint16_t length, void *user_data) > +{ > + struct btp_adapter *adapter = find_adapter_by_index(index); > + bool prop; > + > + if (!adapter) { > + btp_send_error(btp, BTP_GAP_SERVICE, index, > + BTP_ERROR_INVALID_INDEX); > + return; > + } > + > + /* Adapter needs to be powered to be able to remove devices */ > + if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &prop) || > + !prop) { > + btp_send_error(btp, BTP_GAP_SERVICE, index, BTP_ERROR_FAIL); > + return; > + } > + > + l_dbus_proxy_method_call(adapter->proxy, "StopDiscovery", NULL, > + stop_discovery_reply, NULL, NULL); > +} > + > static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy) > { > struct btp_device_found_ev ev; > @@ -453,6 +667,12 @@ static void register_gap_service(void) > > btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_BONDABLE, > btp_gap_set_bondable, NULL, NULL); > + > + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_START_DISCOVERY, > + btp_gap_start_discovery, NULL, NULL); > + > + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_STOP_DISCOVERY, > + btp_gap_stop_discovery, NULL, NULL); > } > > static void btp_core_read_commands(uint8_t index, const void *param, -- pozdrawiam Szymon Janc ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands 2017-12-22 10:48 ` Szymon Janc @ 2017-12-22 13:53 ` Grzegorz Kołodziejczyk 0 siblings, 0 replies; 15+ messages in thread From: Grzegorz Kołodziejczyk @ 2017-12-22 13:53 UTC (permalink / raw) To: Szymon Janc; +Cc: linux-bluetooth Hi, 2017-12-22 11:48 GMT+01:00 Szymon Janc <szymon.janc@codecoup.pl>: > On Thursday, 21 December 2017 17:47:19 CET Grzegorz Kolodziejczyk wrote: >> This patch adds start and stop discovery command for btp client. >> --- >> tools/btpclient.c | 220 >> ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2= 20 >> insertions(+) >> >> diff --git a/tools/btpclient.c b/tools/btpclient.c >> index c0ad03b68..f4b930a51 100644 >> --- a/tools/btpclient.c >> +++ b/tools/btpclient.c >> @@ -122,6 +122,8 @@ static void btp_gap_read_commands(uint8_t index, con= st >> void *param, commands |=3D (1 << BTP_OP_GAP_SET_POWERED); >> commands |=3D (1 << BTP_OP_GAP_SET_DISCOVERABLE); >> commands |=3D (1 << BTP_OP_GAP_SET_BONDABLE); >> + commands |=3D (1 << BTP_OP_GAP_START_DISCOVERY); >> + commands |=3D (1 << BTP_OP_GAP_STOP_DISCOVERY); >> >> commands =3D L_CPU_TO_LE16(commands); >> >> @@ -399,6 +401,218 @@ failed: >> btp_send_error(btp, BTP_GAP_SERVICE, index, status); >> } >> >> +static void start_discovery_reply(struct l_dbus_proxy *proxy, >> + struct l_dbus_message *res= ult, >> + void *user_data) >> +{ >> + struct btp_adapter *adapter =3D find_adapter_by_proxy(proxy); >> + >> + if (!adapter) { >> + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROL= LER, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + if (l_dbus_message_is_error(result)) { >> + const char *name, *desc; >> + >> + l_dbus_message_get_error(result, &name, &desc); >> + l_error("Failed to start discovery (%s), %s", name, desc); >> + >> + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_START_DISCOVERY, >> + adapter->index, 0, NULL); >> +} >> + >> +static void set_start_discovery_filter_setup(struct l_dbus_message >> *message, + void *user= _data) >> +{ >> + uint8_t flags =3D L_PTR_TO_UINT(user_data); >> + struct l_dbus_message_builder *builder; > > Add basic sanity check here for flags ie at least one of LE or BR should = be > set. Ok > >> + >> + builder =3D l_dbus_message_builder_new(message); >> + >> + l_dbus_message_builder_enter_array(builder, "{sv}"); >> + l_dbus_message_builder_enter_dict(builder, "sv"); >> + >> + /* Be in observer mode or in general mode (default in Bluez) */ >> + if (flags & BTP_GAP_DISCOVERY_FLAG_OBSERVATION) { >> + l_dbus_message_builder_append_basic(builder, 's', "Transpo= rt"); >> + l_dbus_message_builder_enter_variant(builder, "s"); >> + >> + if (flags & (BTP_GAP_DISCOVERY_FLAG_LE | >> + BTP_GAP_DISCOVERY_FLAG_BRE= DR)) >> + l_dbus_message_builder_append_basic(builder, 's', >> + "a= uto"); >> + else if (flags & BTP_GAP_DISCOVERY_FLAG_LE) >> + l_dbus_message_builder_append_basic(builder, 's', = "le"); >> + else if (flags & BTP_GAP_DISCOVERY_FLAG_BREDR) >> + l_dbus_message_builder_append_basic(builder, 's', >> + "bredr"); >> + >> + l_dbus_message_builder_leave_variant(builder); >> + } >> + >> + l_dbus_message_builder_leave_dict(builder); >> + l_dbus_message_builder_leave_array(builder); >> + >> + /* TODO add passive, limited discovery */ >> + l_dbus_message_builder_finalize(builder); >> + l_dbus_message_builder_destroy(builder); >> +} >> + >> +static void set_start_discovery_filter_reply(struct l_dbus_proxy *proxy= , >> + struct l_dbus_message *res= ult, >> + void *user_data) >> +{ >> + struct btp_adapter *adapter =3D find_adapter_by_proxy(proxy); >> + >> + if (!adapter) { >> + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROL= LER, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + if (l_dbus_message_is_error(result)) { >> + const char *name, *desc; >> + >> + l_dbus_message_get_error(result, &name, &desc); >> + l_error("Failed to set discovery filter (%s), %s", name, d= esc); >> + >> + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + l_dbus_proxy_method_call(adapter->proxy, "StartDiscovery", NULL, >> + start_discovery_reply, NULL, NULL)= ; >> +} >> + >> +static void btp_gap_start_discovery(uint8_t index, const void *param, >> + uint16_t length, void *user_data) >> +{ >> + struct btp_adapter *adapter =3D find_adapter_by_index(index); >> + const struct btp_gap_start_discovery_cp *cp =3D param; >> + bool prop; >> + >> + if (!adapter) { >> + btp_send_error(btp, BTP_GAP_SERVICE, index, >> + BTP_ERROR_INVALID_INDEX); >> + return; >> + } >> + >> + /* Adapter needs to be powered to start discovery */ >> + if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &pr= op) || >> + !p= rop) { >> + btp_send_error(btp, BTP_GAP_SERVICE, index, BTP_ERROR_FAIL= ); >> + return; >> + } >> + >> + l_dbus_proxy_method_call(adapter->proxy, "SetDiscoveryFilter", >> + set_start_discovery_filter_setup, >> + set_start_discovery_filter_reply, > > nitpick: Name it set_discovery_filer_setup/reply. Ok, I'll correct it > >> + L_UINT_TO_PTR(cp->flags), NULL); >> +} >> + >> +static void set_stop_discovery_filter_setup(struct l_dbus_message *mess= age, >> + void *user_data) >> +{ >> + struct l_dbus_message_builder *builder; >> + >> + builder =3D l_dbus_message_builder_new(message); >> + >> + /* Clear discovery filter setup */ >> + l_dbus_message_builder_enter_array(builder, "{sv}"); >> + l_dbus_message_builder_enter_dict(builder, "sv"); >> + l_dbus_message_builder_leave_dict(builder); >> + l_dbus_message_builder_leave_array(builder); >> + l_dbus_message_builder_finalize(builder); >> + l_dbus_message_builder_destroy(builder); >> +} >> + >> +static void set_stop_discovery_filter_reply(struct l_dbus_proxy *proxy, >> + struct l_dbus_message *res= ult, >> + void *user_data) >> +{ >> + struct btp_adapter *adapter =3D find_adapter_by_proxy(proxy); >> + >> + if (!adapter) { >> + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROL= LER, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + if (l_dbus_message_is_error(result)) { >> + const char *name, *desc; >> + >> + l_dbus_message_get_error(result, &name, &desc); >> + l_error("Failed to set discovery filter (%s), %s", name, d= esc); >> + >> + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_STOP_DISCOVERY, >> + adapter->index, 0, NULL); >> +} >> + >> +static void stop_discovery_reply(struct l_dbus_proxy *proxy, >> + struct l_dbus_message *res= ult, >> + void *user_data) >> +{ >> + struct btp_adapter *adapter =3D find_adapter_by_proxy(proxy); >> + >> + if (!adapter) { >> + btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROL= LER, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + if (l_dbus_message_is_error(result)) { >> + const char *name; >> + >> + l_dbus_message_get_error(result, &name, NULL); >> + l_error("Failed to stop discovery (%s)", name); >> + >> + btp_send_error(btp, BTP_GAP_SERVICE, adapter->index, >> + BTP_ERROR_= FAIL); >> + return; >> + } >> + >> + l_dbus_proxy_method_call(adapter->proxy, "SetDiscoveryFilter", >> + set_stop_discovery_filter_= setup, >> + set_stop_discovery_filter_= reply, > > Name those clear_discovery_filter_setup/reply. Ok, I'll correct it > >> + NULL, NULL); >> +} >> + >> +static void btp_gap_stop_discovery(uint8_t index, const void *param, >> + uint16_t length, void *user_data) >> +{ >> + struct btp_adapter *adapter =3D find_adapter_by_index(index); >> + bool prop; >> + >> + if (!adapter) { >> + btp_send_error(btp, BTP_GAP_SERVICE, index, >> + BTP_ERROR_INVALID_INDEX); >> + return; >> + } >> + >> + /* Adapter needs to be powered to be able to remove devices */ >> + if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &pr= op) || >> + !p= rop) { >> + btp_send_error(btp, BTP_GAP_SERVICE, index, BTP_ERROR_FAIL= ); >> + return; >> + } >> + >> + l_dbus_proxy_method_call(adapter->proxy, "StopDiscovery", NULL, >> + stop_discovery_reply, NULL, NULL); >> +} >> + >> static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy) >> { >> struct btp_device_found_ev ev; >> @@ -453,6 +667,12 @@ static void register_gap_service(void) >> >> btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_BONDABLE, >> btp_gap_set_bondable, NULL, NULL); >> + >> + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_START_DISCOVERY, >> + btp_gap_start_discovery, NULL, NUL= L); >> + >> + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_STOP_DISCOVERY, >> + btp_gap_stop_discovery, NULL, NULL= ); >> } >> >> static void btp_core_read_commands(uint8_t index, const void *param, > > > -- > pozdrawiam > Szymon Janc pozdrawiam, Grzegorz Ko=C5=82odziejczyk ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH BlueZ 6/6] tools/btpclient: Add set connectable command 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk ` (3 preceding siblings ...) 2017-12-21 16:47 ` [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands Grzegorz Kolodziejczyk @ 2017-12-21 16:47 ` Grzegorz Kolodziejczyk 2017-12-22 10:49 ` [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Szymon Janc 5 siblings, 0 replies; 15+ messages in thread From: Grzegorz Kolodziejczyk @ 2017-12-21 16:47 UTC (permalink / raw) To: linux-bluetooth This patch adds set connectable command for btp client. --- tools/btpclient.c | 64 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/tools/btpclient.c b/tools/btpclient.c index f4b930a51..f57550f66 100644 --- a/tools/btpclient.c +++ b/tools/btpclient.c @@ -120,6 +120,7 @@ static void btp_gap_read_commands(uint8_t index, const void *param, commands |= (1 << BTP_OP_GAP_READ_COTROLLER_INFO); commands |= (1 << BTP_OP_GAP_RESET); commands |= (1 << BTP_OP_GAP_SET_POWERED); + commands |= (1 << BTP_OP_GAP_SET_CONNECTABLE); commands |= (1 << BTP_OP_GAP_SET_DISCOVERABLE); commands |= (1 << BTP_OP_GAP_SET_BONDABLE); commands |= (1 << BTP_OP_GAP_START_DISCOVERY); @@ -335,6 +336,53 @@ failed: btp_send_error(btp, BTP_GAP_SERVICE, index, status); } +static void update_current_settings(struct btp_adapter *adapter, + uint32_t new_settings) +{ + struct btp_new_settings_ev ev; + + adapter->current_settings = new_settings; + + ev.current_settings = L_CPU_TO_LE32(adapter->current_settings); + + btp_send(btp, BTP_GAP_SERVICE, BTP_EV_GAP_NEW_SETTINGS, adapter->index, + sizeof(ev), &ev); +} + +static void btp_gap_set_connectable(uint8_t index, const void *param, + uint16_t length, void *user_data) +{ + struct btp_adapter *adapter = find_adapter_by_index(index); + const struct btp_gap_set_connectable_cp *cp = param; + uint8_t status = BTP_ERROR_FAIL; + uint32_t new_settings; + + if (length < sizeof(*cp)) + goto failed; + + if (!adapter) { + status = BTP_ERROR_INVALID_INDEX; + goto failed; + } + + new_settings = adapter->current_settings; + + if (cp->connectable) + new_settings |= 1 << BTP_GAP_SETTING_CONNECTABLE; + else + new_settings &= ~(1 << BTP_GAP_SETTING_CONNECTABLE); + + update_current_settings(adapter, new_settings); + + btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_CONNECTABLE, index, + sizeof(new_settings), &new_settings); + + return; + +failed: + btp_send_error(btp, BTP_GAP_SERVICE, index, status); +} + static void btp_gap_set_discoverable(uint8_t index, const void *param, uint16_t length, void *user_data) { @@ -662,6 +710,9 @@ static void register_gap_service(void) btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_POWERED, btp_gap_set_powered, NULL, NULL); + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_CONNECTABLE, + btp_gap_set_connectable, NULL, NULL); + btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_DISCOVERABLE, btp_gap_set_discoverable, NULL, NULL); @@ -967,19 +1018,6 @@ static void proxy_removed(struct l_dbus_proxy *proxy, void *user_data) } } -static void update_current_settings(struct btp_adapter *adapter, - uint32_t new_settings) -{ - struct btp_new_settings_ev ev; - - adapter->current_settings = new_settings; - - ev.current_settings = L_CPU_TO_LE32(adapter->current_settings); - - btp_send(btp, BTP_GAP_SERVICE, BTP_EV_GAP_NEW_SETTINGS, adapter->index, - sizeof(ev), &ev); -} - static void property_changed(struct l_dbus_proxy *proxy, const char *name, struct l_dbus_message *msg, void *user_data) { -- 2.13.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk ` (4 preceding siblings ...) 2017-12-21 16:47 ` [PATCH BlueZ 6/6] tools/btpclient: Add set connectable command Grzegorz Kolodziejczyk @ 2017-12-22 10:49 ` Szymon Janc 5 siblings, 0 replies; 15+ messages in thread From: Szymon Janc @ 2017-12-22 10:49 UTC (permalink / raw) To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth Hi Grzegorz, On Thursday, 21 December 2017 17:47:15 CET Grzegorz Kolodziejczyk wrote: > This patch modifies gap device found flags to be bit masks as in other > defined flags groups in btp. > --- > src/shared/btp.h | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/src/shared/btp.h b/src/shared/btp.h > index 5044de822..7b1f48817 100644 > --- a/src/shared/btp.h > +++ b/src/shared/btp.h > @@ -241,9 +241,9 @@ struct btp_new_settings_ev { > uint32_t current_settings; > } __packed; > > -#define BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI 0x00 > -#define BTP_EV_GAP_DEVICE_FOUND_FLAG_AD 0x01 > -#define BTP_EV_GAP_DEVICE_FOUND_FLAG_SR 0x02 > +#define BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI 0x01 > +#define BTP_EV_GAP_DEVICE_FOUND_FLAG_AD 0x02 > +#define BTP_EV_GAP_DEVICE_FOUND_FLAG_SR 0x04 > > #define BTP_EV_GAP_DEVICE_FOUND 0x81 > struct btp_device_found_ev { This patch is now applied, thanks. -- pozdrawiam Szymon Janc ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2017-12-22 13:53 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-12-21 16:47 [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Grzegorz Kolodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 2/6] tools/btpclient: Move string to address conversion to helper Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:49 ` Grzegorz Kołodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 3/6] tools/btpclient: Add advertising proxy to adapter Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:50 ` Grzegorz Kołodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 4/6] tools/btpclient: Add device found event Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:51 ` Grzegorz Kołodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 5/6] tools/btpclient: Add start, stop discovery commands Grzegorz Kolodziejczyk 2017-12-22 10:48 ` Szymon Janc 2017-12-22 13:53 ` Grzegorz Kołodziejczyk 2017-12-21 16:47 ` [PATCH BlueZ 6/6] tools/btpclient: Add set connectable command Grzegorz Kolodziejczyk 2017-12-22 10:49 ` [PATCH BlueZ 1/6] shared/btp: define gap device found flags as bit mask Szymon Janc
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).