* Re: [PATCH 00/24] rfcomm fixes
From: Marcel Holtmann @ 2014-02-14 21:45 UTC (permalink / raw)
To: Peter Hurley
Cc: Gustavo F. Padovan, Johan Hedberg, Gianluca Anzolin,
Alexander Holler, Andrey Vihrov, Sander Eikelenboom,
bluez mailin list (linux-bluetooth@vger.kernel.org), linux-kernel
In-Reply-To: <1391997564-1805-1-git-send-email-peter@hurleysoftware.com>
Hi Peter,
> This patch series addresses a number of previously unknown issues
> with the RFCOMM tty device implementation, in addition to
> addressing the locking regression recently reported [1].
>
> As Gianluca suggested and I agree, this series first reverts
> 3 of the 4 patches of 3.14-rc1 for bluetooth/rfcomm/tty.c.
>
> The reasoning is detailed in the changelog for
> Revert "Bluetooth: Always wait for a connection on RFCOMM open()"
> but the short answer is that it re-implements a long-standing
> bug by blocking on a non-blocking open.
>
> This patch series corrects the reported regressions from 3.13
> (to the extent that correction is required). Specifically,
> the ModemManager regression reported by Gianluca Anzolin [2]
> and the rfcomm bind with wvdial reported by Andrey Vihrov [3].
>
> tty: Fix ref counting for port krefs
> Bluetooth: Fix racy acquire of rfcomm_dev reference
> Bluetooth: Exclude released devices from RFCOMMGETDEVLIST ioctl
> Bluetooth: Release rfcomm_dev only once
> Bluetooth: Fix unreleased rfcomm_dev reference
> These first 5 patches after the reverts
> fix 4 different rfcomm_dev ref count mishandling bugs.
>
> Bluetooth: Fix RFCOMM tty teardown race and
> Bluetooth: Serialize RFCOMMCREATEDEV and RFCOMMRELEASEDEV ioctls
> Fix races which occur due to the design of the rfcomm ioctls
> (note that buses don't have these kinds of races).
>
> Bluetooth: Verify dlci not in use before rfcomm_dev create
> Bluetooth: Simplify RFCOMM session state eval
> Bluetooth: Refactor deferred setup test in rfcomm_dlc_close()
> Bluetooth: Refactor dlc disconnect logic in rfcomm_dlc_close()
> Bluetooth: Directly close dlc for not yet started RFCOMM session
> These 5 patches fix issues with reusing the dlci after
> closing the tty (found by unit test).
>
> Bluetooth: Fix unsafe RFCOMM device parenting
> Bluetooth: Fix RFCOMM parent device for reused dlc
> These 2 patches fix the ModemManager regression.
>
> Bluetooth: Refactor rfcomm_dev_add()
> Bluetooth: Cleanup RFCOMM device registration error handling
> These 2 patches fix an unreleased module reference while
> error handling.
>
> Bluetooth: Rename __rfcomm_dev_get() to __rfcomm_dev_lookup()
> This is a trivial naming patch with no functional impact.
>
> Bluetooth: Force -EIO from tty read/write if .activate() fails
> The tty core provides an existing mechanism for failing
> reads/writes if device activation fails (like an error
> allocating the dlc).
>
> Bluetooth: Don't fail RFCOMM tty writes
> This patch implements buffered writes even if the device
> is not connected.
>
> While unit testing this, I discovered a serious defect in
> the way available space is computed that under-utilizes
> rfcomm i/o and may even halt further tx on that link, which
> is fixed by:
> Bluetooth: Refactor write_room() calculation
> Bluetooth: Fix write_room() calculation
>
>
> Note that this series does not fix the naively inefficient
> method of packetizing tty output; packetizing should be
> done on the krfcommd thread to take advantage of aggregating
> multiple tty writes into 1 or more packets. Look at any
> line-by-line console output to realize how under-utilized
> the rfcomm tty packeting is.
>
> [1] http://www.spinics.net/lists/linux-wireless/msg117818.html
> [2] http://www.spinics.net/lists/linux-bluetooth/msg42075.html
> [3] http://www.spinics.net/lists/linux-bluetooth/msg42057.html
>
>
> Regards,
>
>
> Peter Hurley (24):
> Revert "Bluetooth: Remove rfcomm_carrier_raised()"
> Revert "Bluetooth: Always wait for a connection on RFCOMM open()"
> Revert "Bluetooth: Move rfcomm_get_device() before
> rfcomm_dev_activate()”
these 3 patches are in bluetooth-next to give them extra testing. We will get them into 3.14-rc4 after an extra week of them being in linux-next.
> tty: Fix ref counting for port krefs
I am taking this one with Greg’s ack through bluetooth-next. Unless someone objects.
> Bluetooth: Fix racy acquire of rfcomm_dev reference
> Bluetooth: Exclude released devices from RFCOMMGETDEVLIST ioctl
> Bluetooth: Release rfcomm_dev only once
> Bluetooth: Fix unreleased rfcomm_dev reference
> Bluetooth: Fix RFCOMM tty teardown race
> Bluetooth: Verify dlci not in use before rfcomm_dev create
> Bluetooth: Simplify RFCOMM session state eval
> Bluetooth: Refactor deferred setup test in rfcomm_dlc_close()
> Bluetooth: Refactor dlc disconnect logic in rfcomm_dlc_close()
> Bluetooth: Directly close dlc for not yet started RFCOMM session
> Bluetooth: Fix unsafe RFCOMM device parenting
> Bluetooth: Fix RFCOMM parent device for reused dlc
> Bluetooth: Rename __rfcomm_dev_get() to __rfcomm_dev_lookup()
> Bluetooth: Serialize RFCOMMCREATEDEV and RFCOMMRELEASEDEV ioctls
> Bluetooth: Refactor rfcomm_dev_add()
> Bluetooth: Cleanup RFCOMM device registration error handling
> Bluetooth: Force -EIO from tty read/write if .activate() fails
> Bluetooth: Don't fail RFCOMM tty writes
> Bluetooth: Refactor write_room() calculation
> Bluetooth: Fix write_room() calculation
>
> include/linux/tty.h | 6 +-
> include/net/bluetooth/rfcomm.h | 9 +-
> net/bluetooth/rfcomm/core.c | 88 ++++++++++----
> net/bluetooth/rfcomm/tty.c | 262 ++++++++++++++++++++++-------------------
> 4 files changed, 223 insertions(+), 142 deletions(-)
all patches have been applied to bluetooth-next tree.
Regards
Marcel
^ permalink raw reply
* Re: [RFC v8 01/10] Bluetooth: Create hci_stop_le_scan_req() helper
From: Marcel Holtmann @ 2014-02-14 22:21 UTC (permalink / raw)
To: Andre Guedes; +Cc: bluez mailin list (linux-bluetooth@vger.kernel.org)
In-Reply-To: <1391639006-26311-1-git-send-email-andre.guedes@openbossa.org>
Hi Andre,
> This patch moves stop LE scanning duplicate code to one single
> place and reuses it. This will avoid more duplicate code in
> upcoming patches.
>
> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
> ---
> include/net/bluetooth/hci_core.h | 2 ++
> net/bluetooth/hci_core.c | 14 ++++++++++----
> net/bluetooth/mgmt.c | 6 +-----
> 3 files changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 92fa75f..8aff7f9 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -1212,4 +1212,6 @@ void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
> #define SCO_AIRMODE_CVSD 0x0000
> #define SCO_AIRMODE_TRANSP 0x0003
>
> +void hci_stop_le_scan_req(struct hci_request *req);
> +
this should be close to hci_req_add definition.
> #endif /* __HCI_CORE_H */
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index e774669..6529f4a 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -3058,7 +3058,6 @@ static void le_scan_disable_work(struct work_struct *work)
> {
> struct hci_dev *hdev = container_of(work, struct hci_dev,
> le_scan_disable.work);
> - struct hci_cp_le_set_scan_enable cp;
> struct hci_request req;
> int err;
>
> @@ -3066,9 +3065,7 @@ static void le_scan_disable_work(struct work_struct *work)
>
> hci_req_init(&req, hdev);
>
> - memset(&cp, 0, sizeof(cp));
> - cp.enable = LE_SCAN_DISABLE;
> - hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
> + hci_stop_le_scan_req(&req);
>
> err = hci_req_run(&req, le_scan_disable_work_complete);
> if (err)
> @@ -4523,3 +4520,12 @@ static void hci_cmd_work(struct work_struct *work)
> }
> }
> }
> +
> +void hci_stop_le_scan_req(struct hci_request *req)
> +{
> + struct hci_cp_le_set_scan_enable cp;
> +
> + memset(&cp, 0, sizeof(cp));
> + cp.enable = LE_SCAN_DISABLE;
> + hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
> +}
Can we call this function hci_req_add_le_scan_disable. We should be explicit on what functions are doing. Helpers are just helpers.
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index ce7ef33..5c0d55d 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -3400,7 +3400,6 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
> struct hci_cp_remote_name_req_cancel cp;
> struct inquiry_entry *e;
> struct hci_request req;
> - struct hci_cp_le_set_scan_enable enable_cp;
> int err;
>
> BT_DBG("%s", hdev->name);
> @@ -3436,10 +3435,7 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
> } else {
> cancel_delayed_work(&hdev->le_scan_disable);
>
> - memset(&enable_cp, 0, sizeof(enable_cp));
> - enable_cp.enable = LE_SCAN_DISABLE;
> - hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE,
> - sizeof(enable_cp), &enable_cp);
> + hci_stop_le_scan_req(&req);
> }
>
> break;
Regards
Marcel
^ permalink raw reply
* Re: [RFC v8 02/10] Bluetooth: Declare le_conn_failed in hci_core.h
From: Marcel Holtmann @ 2014-02-14 22:26 UTC (permalink / raw)
To: Andre Guedes; +Cc: bluez mailin list (linux-bluetooth@vger.kernel.org)
In-Reply-To: <1391639006-26311-2-git-send-email-andre.guedes@openbossa.org>
Hi Andre,
> This patch adds the "hci_" prefix to le_conn_failed() helper and
> declares it in hci_core.h so it can be reused in hci_event.c.
>
> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
> ---
> include/net/bluetooth/hci_core.h | 2 ++
> net/bluetooth/hci_conn.c | 4 ++--
> net/bluetooth/hci_event.c | 6 +-----
> 3 files changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 8aff7f9..6e5062c 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -627,6 +627,8 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
>
> void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
>
> +void hci_le_conn_failed(struct hci_conn *conn, u8 status);
> +
> /*
> * hci_conn_get() and hci_conn_put() are used to control the life-time of an
> * "hci_conn" object. They do not guarantee that the hci_conn object is running,
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index 6797292..4f5029c 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -515,7 +515,7 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
> EXPORT_SYMBOL(hci_get_route);
>
> /* This function requires the caller holds hdev->lock */
> -static void le_conn_failed(struct hci_conn *conn, u8 status)
> +void hci_le_conn_failed(struct hci_conn *conn, u8 status)
> {
> struct hci_dev *hdev = conn->hdev;
>
> @@ -545,7 +545,7 @@ static void create_le_conn_complete(struct hci_dev *hdev, u8 status)
> if (!conn)
> goto done;
>
> - le_conn_failed(conn, status);
> + hci_le_conn_failed(conn, status);
>
> done:
> hci_dev_unlock(hdev);
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index d2c6878..df58cde 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -3601,11 +3601,7 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
> }
>
> if (ev->status) {
> - mgmt_connect_failed(hdev, &conn->dst, conn->type,
> - conn->dst_type, ev->status);
> - hci_proto_connect_cfm(conn, ev->status);
> - conn->state = BT_CLOSED;
> - hci_conn_del(conn);
> + hci_le_conn_failed(conn, ev->status);
> goto unlock;
> }
what is the difference between a le_conn_failed and a generic conn_failed.
I am not sure about the naming of this function if we make it non-static. Not that I have a better name at the moment. So we might just go ahead with it.
Regards
Marcel
^ permalink raw reply
* 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
* [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
* [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
* 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
* [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: [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
* 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: 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: [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: [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: 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: 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
* [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
* [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
* [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
* [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
* 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
* [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 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
* [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
* [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 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
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