* Re: [PATCH 3/6] tools/rfcomm-tester: Add RFCOMM server write test case
From: Johan Hedberg @ 2014-02-17 11:28 UTC (permalink / raw)
To: Marcin Kraglak; +Cc: linux-bluetooth
In-Reply-To: <1392205301-4204-4-git-send-email-marcin.kraglak@tieto.com>
Hi Marcin,
On Wed, Feb 12, 2014, Marcin Kraglak wrote:
> This will check data write from server to client.
> ---
> tools/rfcomm-tester.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 43 insertions(+)
>
> diff --git a/tools/rfcomm-tester.c b/tools/rfcomm-tester.c
> index 80448cb..1c2563d 100644
> --- a/tools/rfcomm-tester.c
> +++ b/tools/rfcomm-tester.c
> @@ -66,6 +66,9 @@ struct rfcomm_server_data {
> uint8_t server_channel;
> uint8_t client_channel;
> bool expected_status;
> + const uint8_t *send_data;
> + const uint8_t *read_data;
> + uint16_t data_len;
> +static void server_hook_func(const void *data, uint16_t len,
> + void *user_data)
> +{
> + struct test_data *test_data = tester_get_data();
> + const struct rfcomm_server_data *server_data = test_data->test_data;
> +
> + if (memcmp(server_data->send_data, data, len))
Don't you have to first check that server_data->data_len == len?
> + if (server_data->send_data) {
> + if (server_data->data_len != write(new_sk,
> + server_data->send_data,
> + server_data->data_len))
This looks ugly. I'd create a separate ssize_t ret variable, assing the
return value from write to it and then compare with data_len.
Johan
^ permalink raw reply
* Re: [PATCH 4/6] emulator/bthost: Add function to send RFCOMM UIH frames from bthost
From: Johan Hedberg @ 2014-02-17 11:26 UTC (permalink / raw)
To: Marcin Kraglak; +Cc: linux-bluetooth
In-Reply-To: <1392205301-4204-5-git-send-email-marcin.kraglak@tieto.com>
Hi Marcin,
On Wed, Feb 12, 2014, Marcin Kraglak wrote:
> This will make RFCOMM UIH frame and fill with data passed by user.
> ---
> emulator/bthost.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> emulator/bthost.h | 3 +++
> 2 files changed, 46 insertions(+)
>
> diff --git a/emulator/bthost.c b/emulator/bthost.c
> index 92ae08a..6f3e538 100644
> --- a/emulator/bthost.c
> +++ b/emulator/bthost.c
> @@ -2174,6 +2174,49 @@ void bthost_add_channel_hook(struct bthost *bthost, uint16_t handle,
> conn->channel_hooks = hook;
> }
>
> +void bthost_send_uih(struct bthost *bthost, uint16_t handle, uint16_t cid,
> + uint8_t channel, const void *data, uint16_t len)
Could we call this something like bthost_send_rfcomm() or
bthost_send_rfcomm_data() for clarity?
I also don't like the fact that you have to pass both cid and channel to
this function. Would it not be better to store enough RFCOMM specific
context and be able to lookup the necessary info just based on the
channel?
> + hdr = (struct rfcomm_hdr *)uih_frame;
Coding style here (space before the variable name).
Johan
^ permalink raw reply
* [PATCH BlueZ 4/4] build: Move unit tests build rules to Makefile.unit
From: Luiz Augusto von Dentz @ 2014-02-17 9:47 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392630452-22411-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
Makefile.am | 99 +----------------------------------------------------------
Makefile.unit | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+), 98 deletions(-)
create mode 100644 Makefile.unit
diff --git a/Makefile.am b/Makefile.am
index f261535..12c6316 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -178,10 +178,10 @@ EXTRA_DIST += src/genbuiltin src/bluetooth.conf \
profiles/input/input.conf profiles/proximity/proximity.conf
test_scripts =
-unit_tests =
include Makefile.tools
include Makefile.obexd
+include Makefile.unit
include android/Makefile.am
if HID2HCI
@@ -223,103 +223,6 @@ AM_CFLAGS += @DBUS_CFLAGS@ @GLIB_CFLAGS@
AM_CPPFLAGS = -I$(builddir)/lib -I$(srcdir)/gdbus
-unit_tests += unit/test-eir unit/test-uuid unit/test-textfile unit/test-crc
-
-unit_test_eir_SOURCES = unit/test-eir.c src/eir.c src/uuid-helper.c
-unit_test_eir_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
-
-unit_test_uuid_SOURCES = unit/test-uuid.c
-unit_test_uuid_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
-
-unit_test_textfile_SOURCES = unit/test-textfile.c src/textfile.h src/textfile.c
-unit_test_textfile_LDADD = @GLIB_LIBS@
-
-unit_test_crc_SOURCES = unit/test-crc.c monitor/crc.h monitor/crc.c
-unit_test_crc_LDADD = @GLIB_LIBS@
-
-unit_tests += unit/test-ringbuf unit/test-queue
-
-unit_test_ringbuf_SOURCES = unit/test-ringbuf.c \
- src/shared/util.h src/shared/util.c \
- src/shared/ringbuf.h src/shared/ringbuf.c
-unit_test_ringbuf_LDADD = @GLIB_LIBS@
-
-unit_test_queue_SOURCES = unit/test-queue.c \
- src/shared/util.h src/shared/util.c \
- src/shared/queue.h src/shared/queue.c
-unit_test_queue_LDADD = @GLIB_LIBS@
-
-unit_tests += unit/test-mgmt
-
-unit_test_mgmt_SOURCES = unit/test-mgmt.c \
- src/shared/io.h src/shared/io-glib.c \
- src/shared/queue.h src/shared/queue.c \
- src/shared/util.h src/shared/util.c \
- src/shared/mgmt.h src/shared/mgmt.c
-unit_test_mgmt_LDADD = @GLIB_LIBS@
-
-unit_tests += unit/test-sdp
-
-unit_test_sdp_SOURCES = unit/test-sdp.c \
- src/shared/util.h src/shared/util.c \
- src/sdpd.h src/sdpd-database.c \
- src/sdpd-service.c src/sdpd-request.c
-unit_test_sdp_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
-
-unit_tests += unit/test-avdtp
-
-unit_test_avdtp_SOURCES = unit/test-avdtp.c \
- src/shared/util.h src/shared/util.c \
- src/log.h src/log.c \
- src/shared/avdtp.c src/shared/avdtp.h
-unit_test_avdtp_LDADD = @GLIB_LIBS@
-
-unit_tests += unit/test-avctp
-
-unit_test_avctp_SOURCES = unit/test-avctp.c \
- src/shared/util.h src/shared/util.c \
- src/log.h src/log.c \
- src/shared/avctp.c src/shared/avctp.h
-unit_test_avctp_LDADD = @GLIB_LIBS@
-
-unit_tests += unit/test-gdbus-client
-
-unit_test_gdbus_client_SOURCES = unit/test-gdbus-client.c
-unit_test_gdbus_client_LDADD = gdbus/libgdbus-internal.la \
- @GLIB_LIBS@ @DBUS_LIBS@
-
-unit_tests += unit/test-gobex-header unit/test-gobex-packet unit/test-gobex \
- unit/test-gobex-transfer unit/test-gobex-apparam
-
-unit_test_gobex_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
- unit/test-gobex.c
-unit_test_gobex_LDADD = @GLIB_LIBS@
-
-unit_test_gobex_packet_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
- unit/test-gobex-packet.c
-unit_test_gobex_packet_LDADD = @GLIB_LIBS@
-
-unit_test_gobex_header_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
- unit/test-gobex-header.c
-unit_test_gobex_header_LDADD = @GLIB_LIBS@
-
-unit_test_gobex_transfer_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
- unit/test-gobex-transfer.c
-unit_test_gobex_transfer_LDADD = @GLIB_LIBS@
-
-unit_test_gobex_apparam_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
- unit/test-gobex-apparam.c
-unit_test_gobex_apparam_LDADD = @GLIB_LIBS@
-
-unit_tests += unit/test-lib
-
-unit_test_lib_SOURCES = unit/test-lib.c
-unit_test_lib_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
-
-noinst_PROGRAMS += $(unit_tests)
-
-TESTS = $(unit_tests)
-
pkgconfigdir = $(libdir)/pkgconfig
if LIBRARY
diff --git a/Makefile.unit b/Makefile.unit
new file mode 100644
index 0000000..1d1893e
--- /dev/null
+++ b/Makefile.unit
@@ -0,0 +1,98 @@
+unit_tests =
+
+unit_tests += unit/test-eir unit/test-uuid unit/test-textfile unit/test-crc
+
+unit_test_eir_SOURCES = unit/test-eir.c src/eir.c src/uuid-helper.c
+unit_test_eir_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
+
+unit_test_uuid_SOURCES = unit/test-uuid.c
+unit_test_uuid_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
+
+unit_test_textfile_SOURCES = unit/test-textfile.c src/textfile.h src/textfile.c
+unit_test_textfile_LDADD = @GLIB_LIBS@
+
+unit_test_crc_SOURCES = unit/test-crc.c monitor/crc.h monitor/crc.c
+unit_test_crc_LDADD = @GLIB_LIBS@
+
+unit_tests += unit/test-ringbuf unit/test-queue
+
+unit_test_ringbuf_SOURCES = unit/test-ringbuf.c \
+ src/shared/util.h src/shared/util.c \
+ src/shared/ringbuf.h src/shared/ringbuf.c
+unit_test_ringbuf_LDADD = @GLIB_LIBS@
+
+unit_test_queue_SOURCES = unit/test-queue.c \
+ src/shared/util.h src/shared/util.c \
+ src/shared/queue.h src/shared/queue.c
+unit_test_queue_LDADD = @GLIB_LIBS@
+
+unit_tests += unit/test-mgmt
+
+unit_test_mgmt_SOURCES = unit/test-mgmt.c \
+ src/shared/io.h src/shared/io-glib.c \
+ src/shared/queue.h src/shared/queue.c \
+ src/shared/util.h src/shared/util.c \
+ src/shared/mgmt.h src/shared/mgmt.c
+unit_test_mgmt_LDADD = @GLIB_LIBS@
+
+unit_tests += unit/test-sdp
+
+unit_test_sdp_SOURCES = unit/test-sdp.c \
+ src/shared/util.h src/shared/util.c \
+ src/sdpd.h src/sdpd-database.c \
+ src/sdpd-service.c src/sdpd-request.c
+unit_test_sdp_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
+
+unit_tests += unit/test-avdtp
+
+unit_test_avdtp_SOURCES = unit/test-avdtp.c \
+ src/shared/util.h src/shared/util.c \
+ src/log.h src/log.c \
+ src/shared/avdtp.c src/shared/avdtp.h
+unit_test_avdtp_LDADD = @GLIB_LIBS@
+
+unit_tests += unit/test-avctp
+
+unit_test_avctp_SOURCES = unit/test-avctp.c \
+ src/shared/util.h src/shared/util.c \
+ src/log.h src/log.c \
+ src/shared/avctp.c src/shared/avctp.h
+unit_test_avctp_LDADD = @GLIB_LIBS@
+
+unit_tests += unit/test-gdbus-client
+
+unit_test_gdbus_client_SOURCES = unit/test-gdbus-client.c
+unit_test_gdbus_client_LDADD = gdbus/libgdbus-internal.la \
+ @GLIB_LIBS@ @DBUS_LIBS@
+
+unit_tests += unit/test-gobex-header unit/test-gobex-packet unit/test-gobex \
+ unit/test-gobex-transfer unit/test-gobex-apparam
+
+unit_test_gobex_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
+ unit/test-gobex.c
+unit_test_gobex_LDADD = @GLIB_LIBS@
+
+unit_test_gobex_packet_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
+ unit/test-gobex-packet.c
+unit_test_gobex_packet_LDADD = @GLIB_LIBS@
+
+unit_test_gobex_header_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
+ unit/test-gobex-header.c
+unit_test_gobex_header_LDADD = @GLIB_LIBS@
+
+unit_test_gobex_transfer_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
+ unit/test-gobex-transfer.c
+unit_test_gobex_transfer_LDADD = @GLIB_LIBS@
+
+unit_test_gobex_apparam_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
+ unit/test-gobex-apparam.c
+unit_test_gobex_apparam_LDADD = @GLIB_LIBS@
+
+unit_tests += unit/test-lib
+
+unit_test_lib_SOURCES = unit/test-lib.c
+unit_test_lib_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
+
+noinst_PROGRAMS += $(unit_tests)
+
+TESTS = $(unit_tests)
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 3/4] shared: Move AVDTP implementation
From: Luiz Augusto von Dentz @ 2014-02-17 9:47 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392630452-22411-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This moves AVDTP implementation to shared since it does already contain
some unit tests it can be reused by e.g. audio plugin.
---
Makefile.am | 2 +-
android/Makefile.am | 2 +-
android/a2dp.c | 2 +-
{android => src/shared}/avdtp.c | 0
{android => src/shared}/avdtp.h | 0
unit/test-avdtp.c | 2 +-
6 files changed, 4 insertions(+), 4 deletions(-)
rename {android => src/shared}/avdtp.c (100%)
rename {android => src/shared}/avdtp.h (100%)
diff --git a/Makefile.am b/Makefile.am
index a80c390..f261535 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -271,7 +271,7 @@ unit_tests += unit/test-avdtp
unit_test_avdtp_SOURCES = unit/test-avdtp.c \
src/shared/util.h src/shared/util.c \
src/log.h src/log.c \
- android/avdtp.c android/avdtp.h
+ src/shared/avdtp.c src/shared/avdtp.h
unit_test_avdtp_LDADD = @GLIB_LIBS@
unit_tests += unit/test-avctp
diff --git a/android/Makefile.am b/android/Makefile.am
index d1b3119..50b5a3b 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -31,11 +31,11 @@ android_bluetoothd_SOURCES = android/main.c \
src/shared/hfp.h src/shared/hfp.c \
src/shared/avctp.h src/shared/avctp.c \
src/shared/avrcp.h src/shared/avrcp.c \
+ src/shared/avdtp.h src/shared/avdtp.c \
android/bluetooth.h android/bluetooth.c \
android/hidhost.h android/hidhost.c \
android/ipc.h android/ipc.c \
android/audio-ipc.h android/audio-ipc.c \
- android/avdtp.h android/avdtp.c \
android/a2dp.h android/a2dp.c \
android/avrcp.h android/avrcp.c \
android/socket.h android/socket.c \
diff --git a/android/a2dp.c b/android/a2dp.c
index 5d7dc78..f0a28ed 100644
--- a/android/a2dp.c
+++ b/android/a2dp.c
@@ -39,12 +39,12 @@
#include "lib/sdp_lib.h"
#include "profiles/audio/a2dp-codecs.h"
#include "src/log.h"
+#include "src/shared/avdtp.h"
#include "a2dp.h"
#include "hal-msg.h"
#include "ipc.h"
#include "utils.h"
#include "bluetooth.h"
-#include "avdtp.h"
#include "avrcp.h"
#include "audio-msg.h"
#include "audio-ipc.h"
diff --git a/android/avdtp.c b/src/shared/avdtp.c
similarity index 100%
rename from android/avdtp.c
rename to src/shared/avdtp.c
diff --git a/android/avdtp.h b/src/shared/avdtp.h
similarity index 100%
rename from android/avdtp.h
rename to src/shared/avdtp.h
diff --git a/unit/test-avdtp.c b/unit/test-avdtp.c
index 8fe5ce3..d8137f2 100644
--- a/unit/test-avdtp.c
+++ b/unit/test-avdtp.c
@@ -37,7 +37,7 @@
#include "src/shared/util.h"
#include "src/log.h"
-#include "android/avdtp.h"
+#include "src/shared/avdtp.h"
struct test_pdu {
bool valid;
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 2/4] shared: Move AVCTP implementation
From: Luiz Augusto von Dentz @ 2014-02-17 9:47 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392630452-22411-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This moves AVCTP implementation to shared since it does already contain
some unit tests it can be reused by e.g. audio plugin.
---
Makefile.am | 2 +-
android/Makefile.am | 2 +-
{android => src/shared}/avctp.c | 0
{android => src/shared}/avctp.h | 0
src/shared/avrcp.c | 2 +-
unit/test-avctp.c | 2 +-
6 files changed, 4 insertions(+), 4 deletions(-)
rename {android => src/shared}/avctp.c (100%)
rename {android => src/shared}/avctp.h (100%)
diff --git a/Makefile.am b/Makefile.am
index 11f2aa1..a80c390 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -279,7 +279,7 @@ unit_tests += unit/test-avctp
unit_test_avctp_SOURCES = unit/test-avctp.c \
src/shared/util.h src/shared/util.c \
src/log.h src/log.c \
- android/avctp.c android/avctp.h
+ src/shared/avctp.c src/shared/avctp.h
unit_test_avctp_LDADD = @GLIB_LIBS@
unit_tests += unit/test-gdbus-client
diff --git a/android/Makefile.am b/android/Makefile.am
index 3cc0687..d1b3119 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -29,6 +29,7 @@ android_bluetoothd_SOURCES = android/main.c \
src/shared/mgmt.h src/shared/mgmt.c \
src/shared/ringbuf.h src/shared/ringbuf.c \
src/shared/hfp.h src/shared/hfp.c \
+ src/shared/avctp.h src/shared/avctp.c \
src/shared/avrcp.h src/shared/avrcp.c \
android/bluetooth.h android/bluetooth.c \
android/hidhost.h android/hidhost.c \
@@ -36,7 +37,6 @@ android_bluetoothd_SOURCES = android/main.c \
android/audio-ipc.h android/audio-ipc.c \
android/avdtp.h android/avdtp.c \
android/a2dp.h android/a2dp.c \
- android/avctp.h android/avctp.c \
android/avrcp.h android/avrcp.c \
android/socket.h android/socket.c \
android/pan.h android/pan.c \
diff --git a/android/avctp.c b/src/shared/avctp.c
similarity index 100%
rename from android/avctp.c
rename to src/shared/avctp.c
diff --git a/android/avctp.h b/src/shared/avctp.h
similarity index 100%
rename from android/avctp.h
rename to src/shared/avctp.h
diff --git a/src/shared/avrcp.c b/src/shared/avrcp.c
index 32bd703..1325284 100644
--- a/src/shared/avrcp.c
+++ b/src/shared/avrcp.c
@@ -32,7 +32,7 @@
#include "src/log.h"
-#include "android/avctp.h"
+#include "avctp.h"
#include "avrcp.h"
struct avrcp {
diff --git a/unit/test-avctp.c b/unit/test-avctp.c
index be1dfd7..83bf2c5 100644
--- a/unit/test-avctp.c
+++ b/unit/test-avctp.c
@@ -38,7 +38,7 @@
#include "src/shared/util.h"
#include "src/log.h"
-#include "android/avctp.h"
+#include "src/shared/avctp.h"
struct test_pdu {
bool valid;
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 1/4] shared: Add initial AVRCP code
From: Luiz Augusto von Dentz @ 2014-02-17 9:47 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
The patch makes AVRCP to be transport agnostic so that it can be used in
with socket pair to build unit tests.
The idea is that all AVRCP specific logic will stay on src/shared/avrcp
and connecting handling elsewhere.
---
android/Android.mk | 1 +
android/Makefile.am | 1 +
android/avrcp.c | 42 ++++++++++++-----------
src/shared/avrcp.c | 75 +++++++++++++++++++++++++++++++++++++++++
{android => src/shared}/avrcp.h | 13 ++++---
5 files changed, 108 insertions(+), 24 deletions(-)
create mode 100644 src/shared/avrcp.c
copy {android => src/shared}/avrcp.h (65%)
diff --git a/android/Android.mk b/android/Android.mk
index 2481a2c..eadf6d4 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -39,6 +39,7 @@ LOCAL_SRC_FILES := \
bluez/android/avdtp.c \
bluez/android/a2dp.c \
bluez/android/avctp.c \
+ bluez/android/avrcp-lib.c \
bluez/android/avrcp.c \
bluez/android/pan.c \
bluez/android/handsfree.c \
diff --git a/android/Makefile.am b/android/Makefile.am
index 1913b42..3cc0687 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -29,6 +29,7 @@ android_bluetoothd_SOURCES = android/main.c \
src/shared/mgmt.h src/shared/mgmt.c \
src/shared/ringbuf.h src/shared/ringbuf.c \
src/shared/hfp.h src/shared/hfp.c \
+ src/shared/avrcp.h src/shared/avrcp.c \
android/bluetooth.h android/bluetooth.c \
android/hidhost.h android/hidhost.c \
android/ipc.h android/ipc.c \
diff --git a/android/avrcp.c b/android/avrcp.c
index b8304f5..65b3417 100644
--- a/android/avrcp.c
+++ b/android/avrcp.c
@@ -32,12 +32,12 @@
#include "lib/bluetooth.h"
#include "lib/sdp.h"
#include "lib/sdp_lib.h"
+#include "src/shared/avrcp.h"
#include "src/log.h"
#include "bluetooth.h"
#include "avrcp.h"
#include "hal-msg.h"
#include "ipc.h"
-#include "avctp.h"
#define L2CAP_PSM_AVCTP 0x17
@@ -53,7 +53,7 @@ static GIOChannel *server = NULL;
struct avrcp_device {
bdaddr_t dst;
- struct avctp *session;
+ struct avrcp *session;
GIOChannel *io;
};
@@ -133,7 +133,7 @@ static void avrcp_device_free(void *data)
struct avrcp_device *dev = data;
if (dev->session)
- avctp_shutdown(dev->session);
+ avrcp_shutdown(dev->session);
if (dev->io) {
g_io_channel_shutdown(dev->io, FALSE, NULL);
@@ -168,6 +168,17 @@ static int device_cmp(gconstpointer s, gconstpointer user_data)
return bacmp(&dev->dst, dst);
}
+static struct avrcp_device *avrcp_device_find(const bdaddr_t *dst)
+{
+ GSList *l;
+
+ l = g_slist_find_custom(devices, dst, device_cmp);
+ if (!l)
+ return NULL;
+
+ return l->data;
+}
+
static void disconnect_cb(void *data)
{
struct avrcp_device *dev = data;
@@ -186,7 +197,6 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
char address[18];
uint16_t imtu, omtu;
GError *gerr = NULL;
- GSList *l;
int fd;
if (err) {
@@ -209,9 +219,8 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
ba2str(&dst, address);
- l = g_slist_find_custom(devices, &dst, device_cmp);
- if (l) {
- dev = l->data;
+ dev = avrcp_device_find(&dst);
+ if (dev) {
if (dev->session) {
error("Unexpected connection");
return;
@@ -222,17 +231,17 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
}
fd = g_io_channel_unix_get_fd(chan);
- dev->session = avctp_new(fd, imtu, omtu, 0x0100);
+ dev->session = avrcp_new(fd, imtu, omtu, 0x0100);
if (!dev->session) {
avrcp_device_free(dev);
return;
}
- avctp_set_destroy_cb(dev->session, disconnect_cb, dev);
+ avrcp_set_destroy_cb(dev->session, disconnect_cb, dev);
/* FIXME: get the real name of the device */
- avctp_init_uinput(dev->session, "bluetooth", address);
+ avrcp_init_uinput(dev->session, "bluetooth", address);
g_io_channel_set_close_on_unref(chan, FALSE);
@@ -331,12 +340,10 @@ void bt_avrcp_connect(const bdaddr_t *dst)
{
struct avrcp_device *dev;
char addr[18];
- GSList *l;
DBG("");
- l = g_slist_find_custom(devices, dst, device_cmp);
- if (l)
+ if (avrcp_device_find(dst))
return;
dev = avrcp_device_new(dst);
@@ -352,18 +359,15 @@ void bt_avrcp_connect(const bdaddr_t *dst)
void bt_avrcp_disconnect(const bdaddr_t *dst)
{
struct avrcp_device *dev;
- GSList *l;
DBG("");
- l = g_slist_find_custom(devices, dst, device_cmp);
- if (!l)
+ dev = avrcp_device_find(dst);
+ if (!dev)
return;
- dev = l->data;
-
if (dev->session) {
- avctp_shutdown(dev->session);
+ avrcp_shutdown(dev->session);
return;
}
diff --git a/src/shared/avrcp.c b/src/shared/avrcp.c
new file mode 100644
index 0000000..32bd703
--- /dev/null
+++ b/src/shared/avrcp.c
@@ -0,0 +1,75 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2014 Intel Corporation. All rights reserved.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; 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 <stdbool.h>
+#include <glib.h>
+
+#include "lib/bluetooth.h"
+
+#include "src/log.h"
+
+#include "android/avctp.h"
+#include "avrcp.h"
+
+struct avrcp {
+ struct avctp *session;
+};
+
+void avrcp_shutdown(struct avrcp *session)
+{
+ if (session->session)
+ avctp_shutdown(session->session);
+
+ g_free(session);
+}
+
+struct avrcp *avrcp_new(int fd, size_t imtu, size_t omtu, uint16_t version)
+{
+ struct avrcp *session;
+
+ session = g_new0(struct avrcp, 1);
+
+ session->session = avctp_new(fd, imtu, omtu, version);
+ if (!session->session) {
+ g_free(session);
+ return NULL;
+ }
+
+ return session;
+}
+
+void avrcp_set_destroy_cb(struct avrcp *session, avrcp_destroy_cb_t cb,
+ void *user_data)
+{
+ avctp_set_destroy_cb(session->session, cb, user_data);
+}
+
+int avrcp_init_uinput(struct avrcp *session, const char *name,
+ const char *address)
+{
+ return avctp_init_uinput(session->session, name, address);
+}
diff --git a/android/avrcp.h b/src/shared/avrcp.h
similarity index 65%
copy from android/avrcp.h
copy to src/shared/avrcp.h
index 1fcd953..7955d56 100644
--- a/android/avrcp.h
+++ b/src/shared/avrcp.h
@@ -2,7 +2,7 @@
*
* BlueZ - Bluetooth protocol stack for Linux
*
- * Copyright (C) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (C) 2014 Intel Corporation. All rights reserved.
*
*
* This library is free software; you can redistribute it and/or
@@ -21,8 +21,11 @@
*
*/
-bool bt_avrcp_register(const bdaddr_t *addr);
-void bt_avrcp_unregister(void);
+typedef void (*avrcp_destroy_cb_t) (void *user_data);
-void bt_avrcp_connect(const bdaddr_t *dst);
-void bt_avrcp_disconnect(const bdaddr_t *dst);
+struct avrcp *avrcp_new(int fd, size_t imtu, size_t omtu, uint16_t version);
+void avrcp_shutdown(struct avrcp *session);
+void avrcp_set_destroy_cb(struct avrcp *session, avrcp_destroy_cb_t cb,
+ void *user_data);
+int avrcp_init_uinput(struct avrcp *session, const char *name,
+ const char *address);
--
1.8.5.3
^ permalink raw reply related
* Re: [PATCH BlueZ 8/8] doc/obex-api: Update documentation
From: Andrei Emeltchenko @ 2014-02-17 7:24 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth, patrick.ohly
In-Reply-To: <1392393184-15266-8-git-send-email-luiz.dentz@gmail.com>
Hi Luiz,
On Fri, Feb 14, 2014 at 05:53:04PM +0200, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds Suspend and Resume methods and 'suspended' value as status in
> the Transfer interface documentation.
> ---
> doc/obex-api.txt | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/doc/obex-api.txt b/doc/obex-api.txt
> index 1f22fea..0f57ce1 100644
> --- a/doc/obex-api.txt
> +++ b/doc/obex-api.txt
> @@ -90,12 +90,26 @@ Methods void Cancel()
> org.bluez.obex.Error.InProgress
> org.bluez.obex.Error.Failed
>
> + void Suspend()
> +
> + Suspend transference.
would transfer sound better then transference ?
Best regards
Andrei Emeltchenko
> +
> + Possible errors: org.bluez.obex.Error.NotAuthorized
> + org.bluez.obex.Error.NotInProgress
> +
> + void Resume()
> +
> + Resume transference.
> +
> + Possible errors: org.bluez.obex.Error.NotAuthorized
> + org.bluez.obex.Error.NotInProgress
> +
> Properties string Status [readonly]
>
> Inform the current status of the transfer.
>
> - Possible values: "queued", "active", "complete" or
> - "error"
> + Possible values: "queued", "active", "suspended",
> + "complete" or "error"
>
> object Session [readonly]
>
> --
> 1.8.5.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [RFC v5] doc: Add management commands and events for privacy support
From: Marcel Holtmann @ 2014-02-16 21:06 UTC (permalink / raw)
To: linux-bluetooth
---
doc/mgmt-api.txt | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 175 insertions(+)
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index ed9618b877fd..5a4172dfa004 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -213,6 +213,7 @@ Read Controller Information Command
11 Advertising
12 Secure Connections
13 Debug Keys
+ 14 Privacy
This command generates a Command Complete event on success or
a Command Status event on failure.
@@ -730,6 +731,17 @@ Load Long Term Keys Command
again upon the receiption of New Long Term Key events since the
kernel updates its list automatically.
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ Unresolvable random addresses and resolvable random addresses are
+ not valid and will be rejected.
+
Currently defined Key_Type values are:
0x00 Unauthenticated key
@@ -1386,6 +1398,15 @@ Set Static Address Command
The special BDADDR_ANY address (00:00:00:00:00:00) can be used
to disable the static address.
+ When a controller has a public address (which is required for
+ all dual-mode controllers), this address is not used. Only when
+ the controller information reports BDADDR_ANY (00:00:00:00:00:00),
+ it is required to configure a static address first.
+
+ If privacy mode is enabled and the controller is single mode
+ LE only without a public address, the static random address is
+ used as identity address.
+
This command generates a Command Complete event on success or a
Command Status event on failure.
@@ -1475,6 +1496,76 @@ Set Debug Keys Command
Invalid Index
+Set Privacy Command
+===================
+
+ Command Code: 0x002F
+ Controller Index: <controller id>
+ Command Parameters: Privacy (1 Octet)
+ Identity_Resolving_Key (16 Octets)
+ Return Parameters: Current_Settings (4 Octets)
+
+ This command is used to enable Low Energy Privacy feature using
+ resolvable private addresses.
+
+ The value 0x00 disables privacy mode, the value 0x01 enables
+ privacy mode.
+
+ When the controller has a public address (mandatory for dual-mode
+ controllers) it is used as identity address. In case the controller
+ is single mode LE only without a public address, it is required
+ to configure a static random andress first. The privacy mode can
+ only be enabled when an identity address is available.
+
+ The Identity_Resolving_Key is the local key assigned for the local
+ resolvable private address.
+
+ Possible errors: Busy
+ Not Supported
+ Invalid Parameters
+ Invalid Index
+
+
+Load Identity Resolving Keys Command
+====================================
+
+ Command Code: 0x0030
+ Controller Index: <controller id>
+ Command Parameters: Key_Count (2 Octets)
+ Key1 {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+ Key2 { }
+ ...
+ Return Parameters:
+
+ This command is used to feed the kernel with currently known
+ identity resolving keys. The command does not need to be called
+ again upon the receiption of New Identity Resolving Key events
+ since the kernel updates its list automatically.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ Unresolvable random addresses and resolvable random addresses are
+ not valid and will be rejected.
+
+ This command can be used when the controller is not powered.
+
+ This command generates a Command Complete event on success or
+ a Command Status event on failure.
+
+ Possible errors: Invalid Parameters
+ Invalid Index
+
+
Command Complete Event
======================
@@ -1643,6 +1734,18 @@ Event Parameters Store_Hint (1 Octet)
to store the key persistently or not (e.g. this would not be set
if the authentication requirement was "No Bonding").
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ For unresolvable random addresses and resolvable random addresses
+ without identity information and identity resolving key, the
+ Store_Hint will be set to not store the long term key.
+
Currently defined Key_Type values are:
0x00 Unauthenticated key
@@ -1675,6 +1778,11 @@ Event Parameters Address (6 Octets)
This event indicates that a successful baseband connection has
been created to the remote device.
+ The EIR_Data might contain the LE Bluetooth Device Address type
+ providing the identity address and identity address type. For
+ random resolvable address where the identity resolving key is
+ known, the identity information will be provided this way.
+
Device Disconnected Event
=========================
@@ -1828,6 +1936,11 @@ Event Parameters Address (6 Octets)
false-positives for this flag so user space should be able to
handle getting something else as a PIN Request when pairing.
+ The EIR_Data might contain the LE Bluetooth Device Address type
+ providing the identity address and identity address type. For
+ random resolvable address where the identity resolving key is
+ known, the identity information will be provided this way.
+
Discovering Event
=================
@@ -1904,3 +2017,65 @@ Event Parameters Address (6 Octets)
The Passkey parameter indicates the passkey to be shown to the
user whereas the Entered parameter indicates how many characters
the user has entered on the remote side.
+
+
+Device Resolved Event
+=====================
+
+Event Code 0x0018
+Controller Index: <controller id>
+Event Parameters Address (6 Octets)
+ Address_Type (1 Octet)
+ Flags (4 Octets)
+ EIR_Data_Length (2 Octets)
+ EIR_Data (0-65535 Octets)
+
+ This event indicates that a random resolvable address has been
+ resolved into an identity of the device.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 Reserved (not in use)
+ 2 LE Random
+
+ The following bits are defined for the Flags parameter:
+ 0 Reserved (not in use)
+ 1 Reserved (not in use)
+
+ During pairing the remote device can provide identity information
+ and identity resolving key. In that case this event will provide
+ the new identity information matching the random resolvable address.
+
+ This event can also be send at any time a new random resolvable
+ address has been found and during scanning and then successfully
+ resolved into an identity.
+
+ The EIR_Data contains the LE Bluetooth Device Address type
+ providing the identity address and identity address type.
+
+
+New Identity Resolving Key Event
+================================
+
+Event Code 0x0019
+Controller Index <controller id>
+Event Parameters Store_Hint (1 Octet)
+ Key {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+
+ This event indicates that a new identity resolving key has been
+ generated for a remote device.
+
+ The Store_Hint parameter indicates whether the host is expected
+ to store the key persistently or not.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
--
1.8.5.3
^ permalink raw reply related
* Re: [PATCH 11/11] android/tester: Make bt_callbacks thread-safe
From: Szymon Janc @ 2014-02-16 21:04 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Anderson Lizardo, Andrzej Kaczmarek, BlueZ development
In-Reply-To: <EF441CC3-EFCF-4A2A-8ADF-D9F6FF262E4D@holtmann.org>
Hi Marcel and Anderson,
On Sunday 02 of February 2014 08:55:49 Marcel Holtmann wrote:
> Hi Anderson,
>
> >> This patch adds wrappers for BT HAL callback which execute them in main
> >> thread instead of notification_handler() thread. Otherwise test
> >> execution is prone to race conditions since we do not provide any
> >> locking mechanism for tester.
> >
> > In my opinion, this is becoming too messy. I'm getting races even
> > inside the emulator code: sometimes bthost->ncmd becomes zero before a
> > HCI command is sent by the emulated host because the Command Status /
> > Command Complete comes after the command is written to the socket, but
> > before bthost->ncmd is decremented.
> >
> > Also try running android-tester under valgrind. At least for me, I get
> > a few failures that I don't have when running without valgrind (at
> > least one in HIDHost apparently due to if_bluetooth->enable() not
> > being called on test setup and thus the tests rely on finishing before
> > the controller is powered off by the kernel after initialization).
> >
> > IMHO, the best approach would be to keep all HAL API usage in a
> > separate process, and keep android-tester single-threaded. Of course,
> > this could extra complexity for the required IPC between
> > android-tester and this new process...
> >
> > Again, I'm not familiar with how HAL API works, all this is just based
> > on my failed attempt to make android-tester run reliably under
> > valgrind.
>
> I have to agree. We might better spawn processes for this. Our emulator code
> was never designed to be thread safe and never will be. We are just hiding
> the real problem here and it will break somewhere else later on.
I think using g_idle_add to have checks executes in right thread context
pretty clear and easy to follow. Spawning processes will require dedicated IPC
that will wrap either HAL or emulator and that will be quite complicated
comparing to using g_idle_add. Jakub did some initial implementation for this
and it adds ~800 sloc (and will be more in future...).
So I would go with using g_idle_add but refactor propose patch to emphasize
that those are tests checks that execute in mainloop context, not HAL
callbacks.
--
BR
Szymon Janc
^ permalink raw reply
* [PATCH 2/2] Bluetooth: Fix sending wrong store hint for new long term keys
From: Marcel Holtmann @ 2014-02-16 20:59 UTC (permalink / raw)
To: linux-bluetooth
The long term keys should only be stored when they belong to an
indentity address. The identity address can either be a public
address or a random static address.
For all other addresses (unresovable or resolvable) tell userspace
that the long term key is not persistent.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/hci_core.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index e7746690d620..58d2f9bf241f 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2685,6 +2685,7 @@ int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
{
struct smp_ltk *key, *old_key;
bool master = ltk_type_master(type);
+ u8 persistent;
old_key = hci_find_ltk_by_addr(hdev, bdaddr, addr_type, master);
if (old_key)
@@ -2708,8 +2709,13 @@ int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
if (!new_key)
return 0;
+ if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
+ persistent = 0;
+ else
+ persistent = 1;
+
if (type == HCI_SMP_LTK || type == HCI_SMP_LTK_SLAVE)
- mgmt_new_ltk(hdev, key, 1);
+ mgmt_new_ltk(hdev, key, persistent);
return 0;
}
--
1.8.5.3
^ permalink raw reply related
* [PATCH 1/2] Bluetooth: Restrict long term keys to public and static addresses
From: Marcel Holtmann @ 2014-02-16 20:59 UTC (permalink / raw)
To: linux-bluetooth
The long term keys should be associated with an identity address. Valid
identity addresses are public addresses or static addresses. So only
allow these two as valid address information for long term keys.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/mgmt.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index ce7ef339b1c4..70bef3d5db57 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -4162,9 +4162,19 @@ static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
if (key->master != 0x00 && key->master != 0x01)
return false;
- if (!bdaddr_type_is_le(key->addr.type))
- return false;
- return true;
+
+ switch (key->addr.type) {
+ case BDADDR_LE_PUBLIC:
+ return true;
+
+ case BDADDR_LE_RANDOM:
+ /* Two most significant bits shall be set */
+ if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0)
+ return false;
+ return true;
+ }
+
+ return false;
}
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
--
1.8.5.3
^ permalink raw reply related
* [RFC v4] doc: Add management commands and events for privacy support
From: Marcel Holtmann @ 2014-02-16 20:13 UTC (permalink / raw)
To: linux-bluetooth
---
doc/mgmt-api.txt | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 175 insertions(+)
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index 697336092798..554ff2b706cd 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -213,6 +213,7 @@ Read Controller Information Command
11 Advertising
12 Secure Connections
13 Debug Keys
+ 14 Privacy
This command generates a Command Complete event on success or
a Command Status event on failure.
@@ -730,6 +731,17 @@ Load Long Term Keys Command
again upon the receiption of New Long Term Key events since the
kernel updates its list automatically.
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ Unresolvable random addresses and resolvable random addresses are
+ not valid and will be rejected.
+
Currently defined Key_Type values are:
0x00 Unauthenticated key
@@ -1386,6 +1398,15 @@ Set Static Address Command
The special BDADDR_ANY address (00:00:00:00:00:00) can be used
to disable the static address.
+ When a controller has a public address (which is required for
+ all dual-mode controllers), this address is not used. Only when
+ the controller information reports BDADDR_ANY (00:00:00:00:00:00),
+ it is required to configure a static address first.
+
+ If privacy mode is enabled and the controller is single mode
+ LE only without a public address, the static random address is
+ used as identity address.
+
This command generates a Command Complete event on success or a
Command Status event on failure.
@@ -1475,6 +1496,76 @@ Set Debug Keys Command
Invalid Index
+Set Privacy Command
+===================
+
+ Command Code: 0x002F
+ Controller Index: <controller id>
+ Command Parameters: Privacy (1 Octet)
+ Identity_Resolving_Key (16 Octets)
+ Return Parameters: Current_Settings (4 Octets)
+
+ This command is used to enable Low Energy Privacy feature using
+ resolvable private addresses.
+
+ The value 0x00 disables privacy mode, the value 0x01 enables
+ privacy mode.
+
+ When the controller has a public address (mandatory for dual-mode
+ controllers) it is used as identity address. In case the controller
+ is single mode LE only without a public address, it is required
+ to configure a static random andress first. The privacy mode can
+ only be enabled when an identity address is available.
+
+ The Identity_Resolving_Key is the local key assigned for the local
+ resolvable private address.
+
+ Possible errors: Busy
+ Not Supported
+ Invalid Parameters
+ Invalid Index
+
+
+Load Identity Resolving Keys Command
+====================================
+
+ Command Code: 0x0030
+ Controller Index: <controller id>
+ Command Parameters: Key_Count (2 Octets)
+ Key1 {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+ Key2 { }
+ ...
+ Return Parameters:
+
+ This command is used to feed the kernel with currently known
+ identity resolving keys. The command does not need to be called
+ again upon the receiption of New Identity Resolving Key events
+ since the kernel updates its list automatically.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ Unresolvable random addresses and resolvable random addresses are
+ not valid and will be rejected.
+
+ This command can be used when the controller is not powered.
+
+ This command generates a Command Complete event on success or
+ a Command Status event on failure.
+
+ Possible errors: Invalid Parameters
+ Invalid Index
+
+
Command Complete Event
======================
@@ -1640,6 +1731,18 @@ Event Parameters Store_Hint (1 Octet)
to store the key persistently or not (e.g. this would not be set
if the authentication requirement was "No Bonding").
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ For unresolvable random addresses and resolvable random addresses
+ without identity information and identity resolving key, the
+ long term key will not be provided.
+
Currently defined Key_Type values are:
0x00 Unauthenticated key
@@ -1669,6 +1772,11 @@ Event Parameters Address (6 Octets)
This event indicates that a successful baseband connection has
been created to the remote device.
+ The EIR_Data might contain the LE Bluetooth Device Address type
+ providing the identity address and identity address type. For
+ random resolvable address where the identity resolving key is
+ known, the identity information will be provided this way.
+
Device Disconnected Event
=========================
@@ -1822,6 +1930,11 @@ Event Parameters Address (6 Octets)
false-positives for this flag so user space should be able to
handle getting something else as a PIN Request when pairing.
+ The EIR_Data might contain the LE Bluetooth Device Address type
+ providing the identity address and identity address type. For
+ random resolvable address where the identity resolving key is
+ known, the identity information will be provided this way.
+
Discovering Event
=================
@@ -1898,3 +2011,65 @@ Event Parameters Address (6 Octets)
The Passkey parameter indicates the passkey to be shown to the
user whereas the Entered parameter indicates how many characters
the user has entered on the remote side.
+
+
+Device Resolved Event
+=====================
+
+Event Code 0x0018
+Controller Index: <controller id>
+Event Parameters Address (6 Octets)
+ Address_Type (1 Octet)
+ Flags (4 Octets)
+ EIR_Data_Length (2 Octets)
+ EIR_Data (0-65535 Octets)
+
+ This event indicates that a random resolvable address has been
+ resolved into an identity of the device.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 Reserved (not in use)
+ 2 LE Random
+
+ The following bits are defined for the Flags parameter:
+ 0 Reserved (not in use)
+ 1 Reserved (not in use)
+
+ During pairing the remote device can provide identity information
+ and identity resolving key. In that case this event will provide
+ the new identity information matching the random resolvable address.
+
+ This event can also be send at any time a new random resolvable
+ address has been found and during scanning and then successfully
+ resolved into an identity.
+
+ The EIR_Data contains the LE Bluetooth Device Address type
+ providing the identity address and identity address type.
+
+
+New Identity Resolving Key Event
+================================
+
+Event Code 0x0019
+Controller Index <controller id>
+Event Parameters Store_Hint (1 Octet)
+ Key {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+
+ This event indicates that a new identity resolving key has been
+ generated for a remote device.
+
+ The Store_Hint parameter indicates whether the host is expected
+ to store the key persistently or not.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 LE Public
+ 2 LE Random
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
--
1.8.5.3
^ permalink raw reply related
* [RFC v2] doc: Add management commands and events for privacy support
From: Marcel Holtmann @ 2014-02-16 19:48 UTC (permalink / raw)
To: linux-bluetooth
---
doc/mgmt-api.txt | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 139 insertions(+)
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index 73c560692dce..cc20e7031ea2 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -213,6 +213,7 @@ Read Controller Information Command
11 Advertising
12 Secure Connections
13 Debug Keys
+ 14 Privacy
This command generates a Command Complete event on success or
a Command Status event on failure.
@@ -1379,6 +1380,15 @@ Set Static Address Command
The special BDADDR_ANY address (00:00:00:00:00:00) can be used
to disable the static address.
+ When a controller has a public address (which is required for
+ all dual-mode controllers), this address is not used. Only when
+ the controller information reports BDADDR_ANY (00:00:00:00:00:00),
+ it is required to configure a static address first.
+
+ If privacy mode is enabled and the controller is single mode
+ LE only without a public address, the static random address is
+ used as identity address.
+
This command generates a Command Complete event on success or a
Command Status event on failure.
@@ -1468,6 +1478,68 @@ Set Debug Keys Command
Invalid Index
+Set Privacy Command
+===================
+
+ Command Code: 0x002F
+ Controller Index: <controller id>
+ Command Parameters: Privacy (1 Octet)
+ Identity_Resolving_Key (16 Octets)
+ Return Parameters: Current_Settings (4 Octets)
+
+ This command is used to enable Low Energy Privacy feature using
+ resolvable private addresses.
+
+ The value 0x00 disables privacy mode, the value 0x01 enables
+ privacy mode.
+
+ When the controller has a public address (mandatory for dual-mode
+ controllers) it is used as identity address. In case the controller
+ is single mode LE only without a public address, it is required
+ to configure a static random andress first. The privacy mode can
+ only be enabled when an identity address is available.
+
+ The Identity_Resolving_Key is the local key assigned for the local
+ resolvable private address.
+
+ Possible errors: Busy
+ Not Supported
+ Invalid Parameters
+ Invalid Index
+
+
+Load Identity Resolving Keys Command
+====================================
+
+ Command Code: 0x0030
+ Controller Index: <controller id>
+ Command Parameters: Key_Count (2 Octets)
+ Key1 {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+ Key2 { }
+ ...
+ Return Parameters:
+
+ This command is used to feed the kernel with currently known
+ identity resolving keys. The command does not need to be called
+ again upon the receiption of New Identity Resolving Key events
+ since the kernel updates its list automatically.
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ This command can be used when the controller is not powered.
+
+ This command generates a Command Complete event on success or
+ a Command Status event on failure.
+
+ Possible errors: Invalid Parameters
+ Invalid Index
+
+
Command Complete Event
======================
@@ -1655,6 +1727,11 @@ Event Parameters Address (6 Octets)
This event indicates that a successful baseband connection has
been created to the remote device.
+ The EIR_Data might contain the LE Bluetooth Device Address type
+ providing the identity address and identity address type. For
+ random resolvable address where the identity resolving key is
+ known, the identity information will be provided this way.
+
Device Disconnected Event
=========================
@@ -1808,6 +1885,11 @@ Event Parameters Address (6 Octets)
false-positives for this flag so user space should be able to
handle getting something else as a PIN Request when pairing.
+ The EIR_Data might contain the LE Bluetooth Device Address type
+ providing the identity address and identity address type. For
+ random resolvable address where the identity resolving key is
+ known, the identity information will be provided this way.
+
Discovering Event
=================
@@ -1884,3 +1966,60 @@ Event Parameters Address (6 Octets)
The Passkey parameter indicates the passkey to be shown to the
user whereas the Entered parameter indicates how many characters
the user has entered on the remote side.
+
+
+Device Resolved Event
+=====================
+
+Event Code 0x0018
+Controller Index: <controller id>
+Event Parameters Address (6 Octets)
+ Address_Type (1 Octet)
+ Flags (4 Octets)
+ EIR_Data_Length (2 Octets)
+ EIR_Data (0-65535 Octets)
+
+ This event indicates that a random resolvable address has been
+ resolved into an identity of the device.
+
+ Possible values for the Address_Type parameter:
+ 0 Reserved (not in use)
+ 1 Reserved (not in use)
+ 2 LE Random
+
+ The following bits are defined for the Flags parameter:
+ 0 Reserved (not in use)
+ 1 Reserved (not in use)
+
+ During pairing the remote device can provide identity information
+ and identity resolving key. In that case this event will provide
+ the new identity information matching the random resolvable address.
+
+ This event can also be send at any time a new random resolvable
+ address has been found and during scanning and then successfully
+ resolved into an identity.
+
+ The EIR_Data contains the LE Bluetooth Device Address type
+ providing the identity address and identity address type.
+
+
+New Identity Resolving Key Event
+================================
+
+Event Code 0x0019
+Controller Index <controller id>
+Event Parameters Store_Hint (1 Octet)
+ Key {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+
+ This event indicates that a new identity resolving key has been
+ generated for a remote device.
+
+ The provided Address and Address_Type are the identity of
+ a device. So either its public address or static random address.
+
+ The Store_Hint parameter indicates whether the host is expected
+ to store the key persistently or not.
--
1.8.5.3
^ permalink raw reply related
* Re: Some patches applied on Fedora that maybe should be considered for being applied upstream
From: Pacho Ramos @ 2014-02-16 19:06 UTC (permalink / raw)
To: Bastien Nocera; +Cc: BlueZ development
In-Reply-To: <1392125277.22732.1.camel@nuvo>
El mar, 11-02-2014 a las 14:27 +0100, Bastien Nocera escribió:
> On Mon, 2014-02-10 at 21:01 +0100, Pacho Ramos wrote:
> > El lun, 10-02-2014 a las 14:40 +0100, Bastien Nocera escribió:
> > > On Sun, 2014-02-09 at 09:53 +0100, Pacho Ramos wrote:
> > > > Hello
> > > >
> > > > I was looking at bluez package and found some patches that maybe could
> > > > be upstreamed. Also, I would like to know the reasons for not accepting
> > > > them to ensure they are safe to be applied downstream by us too :)
> > > >
> > > > http://pkgs.fedoraproject.org/cgit/bluez.git/tree/0001-Allow-using-obexd-without-systemd-in-the-user-sessio.patch -> Does this cause any issues with systemd --user setups?
> > >
> > > Giovanni already posted this patch earlier. There's no distribution
> > > using systemd sessions, so this doesn't work yet.
> > >
> > > > http://pkgs.fedoraproject.org/cgit/bluez.git/tree/0001-obex-Use-GLib-helper-function-to-manipulate-paths.patch
> > > > http://pkgs.fedoraproject.org/cgit/bluez.git/tree/0002-autopair-Don-t-handle-the-iCade.patch
> > > > http://pkgs.fedoraproject.org/cgit/bluez.git/tree/0004-agent-Assert-possible-infinite-loop.patch
> > > > -> Any reason for not applying it upstream too?
> > >
> > > I've posted those patches to the list as well.
> >
> > And, do you know why they weren't accepted? (it's for trying to get them
> > merged and not needing to carry them forever)
>
> Read the threads for the various patches?
>
> Mailing-lists, awful at tracking patches since forever...
>
But, for example for the patch allowing to run without systemd --user:
http://marc.info/?t=138159296100001&r=1&w=2
What is the point in providing a "--disable-systemd" configure flag that
needs this patches to be applied to be really working? Looks like
"--enable-systemd" will be needed if we don't apply that patches
downstream...
Also:
http://www.spinics.net/lists/linux-bluetooth/msg40136.html
http://www.spinics.net/lists/linux-bluetooth/msg41264.html
Look to have no reply at all
And for 0004-agent-Assert-possible-infinite-loop.patch I can't find the
relevant thread :(
^ permalink raw reply
* Re: Some patches applied on Fedora that maybe should be considered for being applied upstream
From: Pacho Ramos @ 2014-02-16 18:58 UTC (permalink / raw)
To: Bastien Nocera; +Cc: BlueZ development
In-Reply-To: <1392062509.4911.0.camel@belkin5>
El lun, 10-02-2014 a las 21:01 +0100, Pacho Ramos escribió:
> [...]
> > > http://pkgs.fedoraproject.org/cgit/bluez.git/tree/0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
> > > -> Taking care this looks to be a really old issue, maybe using the
> > > workaround would be the only option for now :/
> >
> > I have no hardware to test this on, I snatched it from Ubuntu's bluez 4
> > package.
> >
> > Cheers
>
> OK, thanks :)
>
Looks to be still needed:
https://bugs.gentoo.org/show_bug.cgi?id=501120
^ permalink raw reply
* Re: [PATCH v3] btusb.c - Add IMC Networks (Broadcom based)
From: Jurgen Kramer @ 2014-02-16 8:19 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: bluez mailin list (linux-bluetooth@vger.kernel.org)
In-Reply-To: <5A7ECA4A-ADC4-4587-8DC1-20784328A5F0@holtmann.org>
Hi Marcel,
On Sat, 2014-02-15 at 11:54 -0800, Marcel Holtmann wrote:
> Hi Jurgen,
>
> the subject should start with Bluetooth: for patches.
>
> > Add support for IMC Networks (Broadcom based) to btusb.c.
> >
> > v3: Switch to using USB_VENDOR_AND_INTERFACE_INFO.
>
> This belong after --- in git patches.
OK, will do next time.
>
> >
> > Below the output of /sys/kernel/debug/usb/devices for this device:
> >
> > T: Bus=01 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
> > D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
> > P: Vendor=13d3 ProdID=3404 Rev= 1.12
> > S: Manufacturer=Broadcom Corp
> > S: Product=BCM20702A0
> > S: SerialNumber=240A649F8246
> > C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr= 0mA
> > I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
> > E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> > E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> > I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
> > E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
> > I: If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
> > E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
> > I: If#= 1 Alt= 2 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
> > E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
> > I: If#= 1 Alt= 3 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
> > E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
> > I: If#= 1 Alt= 4 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
> > E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
> > I: If#= 1 Alt= 5 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> > E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
> > E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
> > I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
> > E: Ad=84(I) Atr=02(Bulk) MxPS= 32 Ivl=0ms
> > E: Ad=04(O) Atr=02(Bulk) MxPS= 32 Ivl=0ms
> > I:* If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
> >
> > Signed-off-by: Jurgen Kramer <gtmkramer@xs4all.nl>
> > ---
> > drivers/bluetooth/btusb.c | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> > index 3980fd1..a372df8 100644
> > --- a/drivers/bluetooth/btusb.c
> > +++ b/drivers/bluetooth/btusb.c
> > @@ -116,6 +116,9 @@ static const struct usb_device_id btusb_table[] = {
> > /* Belkin F8065bf - Broadcom based */
> > { USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01) },
> >
> > + /* IMC Networks - Broadcom based */
> > + { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
> > +
>
> CC drivers/bluetooth/btusb.o
> drivers/bluetooth/btusb.c:1716:0: error: unterminated argument list invoking macro "USB_VENDOR_AND_INTERFACE_INFO"
> MODULE_LICENSE("GPL");
> ^
> drivers/bluetooth/btusb.c:120:4: error: ‘USB_VENDOR_AND_INTERFACE_INFO’ undeclared here (not in a function)
> { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
> ^
> drivers/bluetooth/btusb.c:120:2: error: expected ‘}’ at end of input
> { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
> ^
>
> > { } /* Terminating entry */
> > };
>
> I fixed this all up for you now and applied the patch to bluetooth-next tree.
>
> However next time, at least compile test the patch before sending it. Otherwise you are wasting everyones time.
Sorry about that. Thanks for fixing.
Regards,
Jurgen
^ permalink raw reply
* Re: [PATCH v2] Bluetooth: Add hci_h4p driver
From: Pavel Machek @ 2014-02-15 22:30 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Pali Rohár, Ben Hutchings,
Ивайло Димитров,
linux-kernel, linux-bluetooth@vger.kernel.org development
In-Reply-To: <20140214172802.GA26969@earth.universe>
Hi!
> > >> > Firmware files are available for download from nemo project:
> > >> >
> > >> > https://api.merproject.org/public/source/nemo:devel:hw:ti:om
> > >> > ap3:n900/bcm-bt-firmware/bcm-bt-firmware-0.21rc3.tar.bz2
> > >> > https://api.merproject.org/public/source/nemo:devel:hw:ti:o
> > >> > map3:n950-n9/ti-wl1273-bt-firmware/bt-firmware-ti1273_0.23+0
> > >> > m6.tar.gz
> > >>
> > >> Would be nice to have them added to the linux-firmware.git.
> > >
> > Now when driver is queued for staging, can somebody add firmware files
> > to linux-firmware repository? Note that without firmware files, driver
> > not working...
>
> I just had a look at the file for the Nokia N900
> (bcm-bt-firmware-0.21rc3.tar.bz2) and I think the license is too
> restrictive for linux-firmware.git. Actually I can't see any
> statement allowing redistribution. For reference this is the license
> text:
>
> Copyright (c) Nokia Corporation 2010
> All Rights Reserved.
>
> This material, including documentation and any related computer programs, is
> protected by copyright controlled by Nokia Corporation. All rights are
> reserved. Modifying, adapting and/or translating, any or all of this material
> requires the prior written consent of Nokia. Distribution for commercial
> purposes not allowed without prior written approval from Nokia.
With my lingvistics hat on, this says "distribution for non-commercial
purposes is ok". (Because otherwise, they would say "Distribution not
allowed without ...")
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
^ permalink raw reply
* Re: partial success with PS3 sixaxis
From: Andrea @ 2014-02-15 20:49 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <52FFD116.2080902@gmail.com>
On 15/02/14 20:41, Andrea wrote:
> On 13/02/14 09:25, Szymon Janc wrote:
>> Hi Andrea,
>>
>>
>> I assume you are using bluetoothctl so do:
>> agent on
>> default-agent
>>
>> Then you should get authorization request in bluetoothctl when DS3 is connecting.
>>
>
> Hi,
>
> I have tried on a different laptop (no more the raspberry pi, where I still have the issues I
> reported in the other email), running Fedora 19.
>
> I compiled bluez 5.14 and run it.
> It is more stable and /dev/input/js0 is usable.
>
> It is still not able to set the LEDs. This gets written in the output
>
> Feb 15 16:55:02 localhost.localdomain bluetoothd[24620]: sixaxis: compatible device connected:
> PLAYSTATION(R)3 Contr
> Feb 15 16:55:02 localhost.localdomain kernel: input: PLAYSTATION(R)3 Controller as
> /devices/pci0000:00/0000:00:1d.1/
> Feb 15 16:55:02 localhost.localdomain kernel: sony 0005:054C:0268.000E: input,hidraw0: BLUETOOTH HID
> v1.00 Joystick
> Feb 15 16:55:02 localhost.localdomain bluetoothd[24620]: sixaxis: failed to set LEDS (0 bytes written)
>
> I have tried to log the traffic for bluez and sixad (where the LEDs work), to see you can find any
> difference.
>
> http://pastebin.com/pExywtUk (this is the log from bluez where LEDs keep flashing)
> http://pastebin.com/BgRUnamS (log from sixad where LEDs are set)
>
> Happy to provide more if it can be of any help.
>
> Andrea
>
and this is the log from bluez 5.14 running on raspberry pi
where /dev/input/js0 disappears after a few seconds.
http://pastebin.com/Rxsv3php
Andrea
^ permalink raw reply
* Re: partial success with PS3 sixaxis
From: Andrea @ 2014-02-15 20:41 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <2534491.XllyezJg3g@uw000953>
On 13/02/14 09:25, Szymon Janc wrote:
> Hi Andrea,
>
>
> I assume you are using bluetoothctl so do:
> agent on
> default-agent
>
> Then you should get authorization request in bluetoothctl when DS3 is connecting.
>
Hi,
I have tried on a different laptop (no more the raspberry pi, where I still have the issues I
reported in the other email), running Fedora 19.
I compiled bluez 5.14 and run it.
It is more stable and /dev/input/js0 is usable.
It is still not able to set the LEDs. This gets written in the output
Feb 15 16:55:02 localhost.localdomain bluetoothd[24620]: sixaxis: compatible device connected:
PLAYSTATION(R)3 Contr
Feb 15 16:55:02 localhost.localdomain kernel: input: PLAYSTATION(R)3 Controller as
/devices/pci0000:00/0000:00:1d.1/
Feb 15 16:55:02 localhost.localdomain kernel: sony 0005:054C:0268.000E: input,hidraw0: BLUETOOTH HID
v1.00 Joystick
Feb 15 16:55:02 localhost.localdomain bluetoothd[24620]: sixaxis: failed to set LEDS (0 bytes written)
I have tried to log the traffic for bluez and sixad (where the LEDs work), to see you can find any
difference.
http://pastebin.com/pExywtUk (this is the log from bluez where LEDs keep flashing)
http://pastebin.com/BgRUnamS (log from sixad where LEDs are set)
Happy to provide more if it can be of any help.
Andrea
^ permalink raw reply
* Re: [PATCH v3] btusb.c - Add IMC Networks (Broadcom based)
From: Marcel Holtmann @ 2014-02-15 19:54 UTC (permalink / raw)
To: Jurgen Kramer; +Cc: bluez mailin list (linux-bluetooth@vger.kernel.org)
In-Reply-To: <1392462069-3093-1-git-send-email-gtmkramer@xs4all.nl>
Hi Jurgen,
the subject should start with Bluetooth: for patches.
> Add support for IMC Networks (Broadcom based) to btusb.c.
>
> v3: Switch to using USB_VENDOR_AND_INTERFACE_INFO.
This belong after --- in git patches.
>
> Below the output of /sys/kernel/debug/usb/devices for this device:
>
> T: Bus=01 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
> D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
> P: Vendor=13d3 ProdID=3404 Rev= 1.12
> S: Manufacturer=Broadcom Corp
> S: Product=BCM20702A0
> S: SerialNumber=240A649F8246
> C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr= 0mA
> I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
> E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
> E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
> I: If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
> E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
> I: If#= 1 Alt= 2 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
> E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
> I: If#= 1 Alt= 3 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
> E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
> I: If#= 1 Alt= 4 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
> E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
> I: If#= 1 Alt= 5 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
> E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
> I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
> E: Ad=84(I) Atr=02(Bulk) MxPS= 32 Ivl=0ms
> E: Ad=04(O) Atr=02(Bulk) MxPS= 32 Ivl=0ms
> I:* If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
>
> Signed-off-by: Jurgen Kramer <gtmkramer@xs4all.nl>
> ---
> drivers/bluetooth/btusb.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index 3980fd1..a372df8 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -116,6 +116,9 @@ static const struct usb_device_id btusb_table[] = {
> /* Belkin F8065bf - Broadcom based */
> { USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01) },
>
> + /* IMC Networks - Broadcom based */
> + { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
> +
CC drivers/bluetooth/btusb.o
drivers/bluetooth/btusb.c:1716:0: error: unterminated argument list invoking macro "USB_VENDOR_AND_INTERFACE_INFO"
MODULE_LICENSE("GPL");
^
drivers/bluetooth/btusb.c:120:4: error: ‘USB_VENDOR_AND_INTERFACE_INFO’ undeclared here (not in a function)
{ USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
^
drivers/bluetooth/btusb.c:120:2: error: expected ‘}’ at end of input
{ USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
^
> { } /* Terminating entry */
> };
I fixed this all up for you now and applied the patch to bluetooth-next tree.
However next time, at least compile test the patch before sending it. Otherwise you are wasting everyones time.
Regards
Marcel
^ permalink raw reply
* [RFC v2] doc: Add management commands and events for privacy support
From: Marcel Holtmann @ 2014-02-15 18:06 UTC (permalink / raw)
To: linux-bluetooth
---
doc/mgmt-api.txt | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index c5c84291a044..b21ddfbb7e78 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -213,6 +213,7 @@ Read Controller Information Command
11 Advertising
12 Secure Connections
13 Debug Keys
+ 14 Privacy
This command generates a Command Complete event on success or
a Command Status event on failure.
@@ -1379,6 +1380,15 @@ Set Static Address Command
The special BDADDR_ANY address (00:00:00:00:00:00) can be used
to disable the static address.
+ When a controller has a public address (which is required for
+ all dual-mode controllers), this address is not used. Only when
+ the controller information reports BDADDR_ANY (00:00:00:00:00:00),
+ it is required to configure a static address first.
+
+ If privacy mode is enabled and the controller is single mode
+ LE only without a public address, the static random address is
+ used as identity address.
+
This command generates a Command Complete event on success or a
Command Status event on failure.
@@ -1468,6 +1478,65 @@ Set Debug Keys Command
Invalid Index
+Set Privacy Command
+===================
+
+ Command Code: 0x002F
+ Controller Index: <controller id>
+ Command Parameters: Privacy (1 Octet)
+ Identity_Resolving_Key (16 Octets)
+ Return Parameters: Current_Settings (4 Octets)
+
+ This command is used to enable Low Energy Privacy feature using
+ resolvable private addresses.
+
+ The value 0x00 disables privacy mode, the value 0x01 enables
+ privacy mode.
+
+ When the controller has a public address (mandatory for dual-mode
+ controllers) it is used as identity address. In case the controller
+ is single mode LE only without a public address, it is required
+ to configure a static random andress first. The privacy mode can
+ only be enabled when an identity address is available.
+
+ The Identity_Resolving_Key is the local key assigned for the local
+ resolvable private address.
+
+ Possible errors: Busy
+ Not Supported
+ Invalid Parameters
+ Invalid Index
+
+
+Load Identity Resolving Keys Command
+====================================
+
+ Command Code: 0x0030
+ Controller Index: <controller id>
+ Command Parameters: Key_Count (2 Octets)
+ Key1 {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+ Key2 { }
+ ...
+ Return Parameters:
+
+ This command is used to feed the kernel with currently known
+ Identity Resolving Keys. The command does not need to be called
+ again upon the receiption of new Identity Resolving Key events
+ since the kernel updates its list automatically.
+
+ This command can be used when the controller is not powered.
+
+ This command generates a Command Complete event on success or
+ a Command Status event on failure.
+
+ Possible errors: Invalid Parameters
+ Invalid Index
+
+
Command Complete Event
======================
@@ -1884,3 +1953,22 @@ Event Parameters Address (6 Octets)
The Passkey parameter indicates the passkey to be shown to the
user whereas the Entered parameter indicates how many characters
the user has entered on the remote side.
+
+
+New Identity Resolving Key Event
+================================
+
+Event Code 0x0018
+Controller Index <controller id>
+Event Parameters Store_Hint (1 Octet)
+ Key {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+
+ This event indicates that a new identity resolving key has been
+ generated for a remote device.
+
+ The Store_Hint parameter indicates whether the host is expected
+ to store the key persistently or not.
--
1.8.5.3
^ permalink raw reply related
* Re: partial success with PS3 sixaxis
From: Andrea @ 2014-02-15 12:10 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <2534491.XllyezJg3g@uw000953>
On 13/02/14 09:25, Szymon Janc wrote:
> Hi Andrea,
>
> This should "just work". Since 5.14 there is authorization needed when DS3 is
> connecting (device is not marked as trusted when connected on USB) so please
> make sure you have default agent registered.
>
> I assume you are using bluetoothctl so do:
> agent on
> default-agent
>
> Then you should get authorization request in bluetoothctl when DS3 is connecting.
>
I think the problem is not authorisation (I do not get such a request, by I did use the trust
command, so maybe it is not necessary any more). It gets connected, it creates /dev/input/js0 but it
deletes it shortly after.
I run bluetoothd in debug mode and this is what it prints
bluetoothd[13678]: src/adapter.c:connected_callback() hci0 device 00:1B:FB:63:F2:64 connected eir_len 5
bluetoothd[13678]: profiles/input/server.c:connect_event_cb() Incoming connection from
00:1B:FB:63:F2:64 on PSM 17
bluetoothd[13678]: profiles/input/device.c:input_device_set_channel() idev 0x1dec160 psm 17
bluetoothd[13678]: profiles/input/server.c:confirm_event_cb()
bluetoothd[13678]: profiles/input/server.c:connect_event_cb() Incoming connection from
00:1B:FB:63:F2:64 on PSM 19
bluetoothd[13678]: profiles/input/device.c:input_device_set_channel() idev 0x1dec160 psm 19
bluetoothd[13678]: src/service.c:change_state() 0x1deb1c0: device 00:1B:FB:63:F2:64 profile
input-hid state changed: disconnected -> connected (0)
bluetoothd[13678]: sixaxis: compatible device connected: PLAYSTATION(R)3 Controller (054C:0268)
< ===================================== here I disconnect manually, as /dev/input/js0 has already
been deleted>
bluetoothd[13678]: src/service.c:change_state() 0x1deb1c0: device 00:1B:FB:63:F2:64 profile
input-hid state changed: connected -> disconnecting (0)
bluetoothd[13678]: profiles/input/device.c:input_device_disconnect()
bluetoothd[13678]: Input: disconnect /org/bluez/hci0/dev_00_1B_FB_63_F2_64
bluetoothd[13678]: profiles/input/device.c:ctrl_watch_cb() Device 00:1B:FB:63:F2:64 disconnected
bluetoothd[13678]: profiles/input/device.c:intr_watch_cb() Device 00:1B:FB:63:F2:64 disconnected
bluetoothd[13678]: src/service.c:change_state() 0x1deb1c0: device 00:1B:FB:63:F2:64 profile
input-hid state changed: disconnecting -> disconnected (0)
bluetoothd[13678]: profiles/input/device.c:input_device_enter_reconnect_mode()
path=/org/bluez/hci0/dev_00_1B_FB_63_F2_64 reconnect_mode=device
bluetoothd[13678]: src/adapter.c:dev_disconnected() Device 00:1B:FB:63:F2:64 disconnected, reason 2
bluetoothd[13678]: src/adapter.c:adapter_remove_connection()
bluetoothd[13678]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr 00:1B:FB:63:F2:64 type 0
status 0xe
bluetoothd[13678]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[13678]: src/device.c:device_bonding_failed() status 14
bluetoothd[13678]: src/adapter.c:resume_discovery()
Halfway through I disconnected the controller with
disconnect XX:XX:XX:XX:XX in bluetoothtcl
at the same time in the kernel log I can see
Feb 15 12:08:29 alarmpi kernel: sony 0005:054C:0268.0010: Fixing up Sony Sixaxis report descriptor
Feb 15 12:08:29 alarmpi kernel: sony 0005:054C:0268.0010: unknown main item tag 0x0
Feb 15 12:08:29 alarmpi kernel: input: PLAYSTATION(R)3 Controller as
/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/blu
Feb 15 12:08:29 alarmpi kernel: sony 0005:054C:0268.0010: input,hidraw0: BLUETOOTH HID v1.00
Joystick [PLAYSTATION(R)3 Controller] on 00:
Feb 15 12:08:39 alarmpi kernel: sony: probe of 0005:054C:0268.0010 failed with error -5
which mention some issues with descriptor, tag and probe.
I am not too familiar with whom is responsible for /dev/input/js0? kernel? bluez? the sixaxis plugin?
Since this controller always works with the alternative sixad daemon, can I log the traffic and
compare it? or maybe post it here so some of you guys can help me?
thank you
^ permalink raw reply
* [PATCH v3] btusb.c - Add IMC Networks (Broadcom based)
From: Jurgen Kramer @ 2014-02-15 11:01 UTC (permalink / raw)
To: linux-bluetooth; +Cc: marcel, Jurgen Kramer
Add support for IMC Networks (Broadcom based) to btusb.c.
v3: Switch to using USB_VENDOR_AND_INTERFACE_INFO.
Below the output of /sys/kernel/debug/usb/devices for this device:
T: Bus=01 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=13d3 ProdID=3404 Rev= 1.12
S: Manufacturer=Broadcom Corp
S: Product=BCM20702A0
S: SerialNumber=240A649F8246
C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
I: If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
I: If#= 1 Alt= 2 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
I: If#= 1 Alt= 3 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
I: If#= 1 Alt= 4 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
I: If#= 1 Alt= 5 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=84(I) Atr=02(Bulk) MxPS= 32 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 32 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
Signed-off-by: Jurgen Kramer <gtmkramer@xs4all.nl>
---
drivers/bluetooth/btusb.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 3980fd1..a372df8 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -116,6 +116,9 @@ static const struct usb_device_id btusb_table[] = {
/* Belkin F8065bf - Broadcom based */
{ USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01) },
+ /* IMC Networks - Broadcom based */
+ { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01 },
+
{ } /* Terminating entry */
};
--
1.8.5.3
^ permalink raw reply related
* [RFC] doc: Add management commands and events for privacy support
From: Marcel Holtmann @ 2014-02-15 10:53 UTC (permalink / raw)
To: linux-bluetooth
---
doc/mgmt-api.txt | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 82 insertions(+)
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index c5c84291a044..004d2f2965ad 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -213,6 +213,7 @@ Read Controller Information Command
11 Advertising
12 Secure Connections
13 Debug Keys
+ 14 Privacy
This command generates a Command Complete event on success or
a Command Status event on failure.
@@ -1468,6 +1469,68 @@ Set Debug Keys Command
Invalid Index
+Set Privacy Command
+===================
+
+ Command Code: 0x002F
+ Controller Index: <controller id>
+ Command Parameters: Privacy (1 Octet)
+ Identity_Address_Type (1 Octet)
+ Identity_Resolving_Key (16 Octets)
+ Return Parameters: Current_Settings (4 Octets)
+
+ This command is used to enable Low Energy Privacy feature using
+ resolvable private addresses.
+
+ The value 0x00 disables privacy mode, the value 0x01 enables
+ privacy mode.
+
+ Possible values for the Identity_Address_Type parameter:
+ 1 LE Public
+ 2 LE Random
+
+ With LE Public, the controller's public address will be used as
+ identity address. With LE Random, the configured static address
+ will be used as identity address.
+
+ The Identity_Resolving_Key is the local key assigned for the local
+ resolvable private address.
+
+ Possible errors: Busy
+ Not Supported
+ Invalid Parameters
+ Invalid Index
+
+
+Load Identity Resolving Keys Command
+====================================
+
+ Command Code: 0x0030
+ Controller Index: <controller id>
+ Command Parameters: Key_Count (2 Octets)
+ Key1 {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+ Key2 { }
+ ...
+ Return Parameters:
+
+ This command is used to feed the kernel with currently known
+ Identity Resolving Keys. The command does not need to be called
+ again upon the receiption of new Identity Resolving Key events
+ since the kernel updates its list automatically.
+
+ This command can be used when the controller is not powered.
+
+ This command generates a Command Complete event on success or
+ a Command Status event on failure.
+
+ Possible errors: Invalid Parameters
+ Invalid Index
+
+
Command Complete Event
======================
@@ -1884,3 +1947,22 @@ Event Parameters Address (6 Octets)
The Passkey parameter indicates the passkey to be shown to the
user whereas the Entered parameter indicates how many characters
the user has entered on the remote side.
+
+
+New Identity Resolving Key Event
+================================
+
+Event Code 0x0018
+Controller Index <controller id>
+Event Parameters Store_Hint (1 Octet)
+ Key {
+ Address (6 Octets)
+ Address_Type (1 Octet)
+ Value (16 Octets)
+ }
+
+ This event indicates that a new identity resolving key has been
+ generated for a remote device.
+
+ The Store_Hint parameter indicates whether the host is expected
+ to store the key persistently or not.
--
1.8.5.3
^ permalink raw reply related
* Re: [RFC v8 04/10] Bluetooth: Remove unused function
From: Marcel Holtmann @ 2014-02-14 22:28 UTC (permalink / raw)
To: Andre Guedes; +Cc: bluez mailin list (linux-bluetooth@vger.kernel.org)
In-Reply-To: <1391639006-26311-4-git-send-email-andre.guedes@openbossa.org>
Hi Andre,
> This patch removes hci_create_le_conn() since it is not used anymore.
>
> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
> ---
> net/bluetooth/hci_conn.c | 32 --------------------------------
> 1 file changed, 32 deletions(-)
>
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index 166d7a5..70f4226 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -551,38 +551,6 @@ done:
> hci_dev_unlock(hdev);
> }
>
> -static int hci_create_le_conn(struct hci_conn *conn)
> -{
> - struct hci_dev *hdev = conn->hdev;
> - struct hci_cp_le_create_conn cp;
> - struct hci_request req;
> - int err;
> -
> - hci_req_init(&req, hdev);
> -
> - memset(&cp, 0, sizeof(cp));
> - cp.scan_interval = cpu_to_le16(hdev->le_scan_interval);
> - cp.scan_window = cpu_to_le16(hdev->le_scan_window);
> - bacpy(&cp.peer_addr, &conn->dst);
> - cp.peer_addr_type = conn->dst_type;
> - cp.own_address_type = conn->src_type;
> - cp.conn_interval_min = cpu_to_le16(conn->le_conn_min_interval);
> - cp.conn_interval_max = cpu_to_le16(conn->le_conn_max_interval);
> - cp.supervision_timeout = __constant_cpu_to_le16(0x002a);
> - cp.min_ce_len = __constant_cpu_to_le16(0x0000);
> - cp.max_ce_len = __constant_cpu_to_le16(0x0000);
> -
> - hci_req_add(&req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
> -
> - err = hci_req_run(&req, create_le_conn_complete);
> - if (err) {
> - hci_conn_del(conn);
> - return err;
> - }
> -
> - return 0;
> -}
> -
> static void create_le_conn_req(struct hci_request *req, struct hci_conn *conn)
> {
> struct hci_cp_le_create_conn cp;
not about this patch, but with my other comment, this one might be better renamed into hci_req_add_le_create_conn at some point. Not urgent though.
Regards
Marcel
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox