* [PATCH 08/10] Bluetooth: Track the LE Identity Address in struct hci_conn
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
Since we want user space to see and use the LE Identity Address whenever
interfacing with the kernel it makes sense to track that instead of the
real address (the two will only be different in the case of an RPA).
This patch adds the necessary updates to when an LE connection gets
established and when receiving the Identity Address from a remote
device.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/hci_event.c | 7 +++++++
net/bluetooth/smp.c | 3 +++
2 files changed, 10 insertions(+)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index d2c6878a9d6a..f31410a071b5 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -3568,6 +3568,7 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_ev_le_conn_complete *ev = (void *) skb->data;
struct hci_conn *conn;
+ struct smp_irk *irk;
BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
@@ -3600,6 +3601,12 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
}
}
+ irk = hci_get_irk(hdev, &ev->bdaddr, ev->bdaddr_type);
+ if (irk) {
+ bacpy(&conn->dst, &irk->bdaddr);
+ conn->dst_type = irk->addr_type;
+ }
+
if (ev->status) {
mgmt_connect_failed(hdev, &conn->dst, conn->type,
conn->dst_type, ev->status);
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 54672c9ab6a5..4d14ccc7b330 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -973,6 +973,9 @@ static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
hci_add_irk(conn->hcon->hdev, &smp->id_addr, smp->id_addr_type,
smp->irk, &rpa);
+ bacpy(&hcon->dst, &smp->id_addr);
+ hcon->dst_type = smp->id_addr_type;
+
smp_distribute_keys(conn, 1);
return 0;
--
1.8.5.3
^ permalink raw reply related
* [PATCH 07/10] Bluetooth: Add convenience function for fetching IRKs
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
There are many situations where we need to check if an LE address is an
RPA and if so try to look up the IRK for it. To simplify such cases this
patch adds a convenience function for the job.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
include/net/bluetooth/hci_core.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index ac468de11cb7..4461c0051228 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1083,6 +1083,15 @@ static inline bool hci_bdaddr_is_rpa(bdaddr_t *bdaddr, u8 addr_type)
return false;
}
+static inline struct smp_irk *hci_get_irk(struct hci_dev *hdev,
+ bdaddr_t *bdaddr, u8 addr_type)
+{
+ if (!hci_bdaddr_is_rpa(bdaddr, addr_type))
+ return NULL;
+
+ return hci_find_irk_by_rpa(hdev, bdaddr);
+}
+
int hci_register_cb(struct hci_cb *hcb);
int hci_unregister_cb(struct hci_cb *hcb);
--
1.8.5.3
^ permalink raw reply related
* [PATCH 06/10] Bluetooth: Fix removing any IRKs when unpairing devices
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
When mgmt_unpair_device is called we should also remove any associated
IRKs. This patch adds a hci_remove_irk convenience function and ensures
that it's called when mgmt_unpair_device is called.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
include/net/bluetooth/hci_core.h | 1 +
net/bluetooth/hci_core.c | 15 +++++++++++++++
net/bluetooth/mgmt.c | 2 ++
3 files changed, 18 insertions(+)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 964a7888ad0c..ac468de11cb7 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -801,6 +801,7 @@ struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
u8 addr_type);
int hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type,
u8 val[16], bdaddr_t *rpa);
+void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type);
void hci_smp_irks_clear(struct hci_dev *hdev);
void hci_remote_oob_data_clear(struct hci_dev *hdev);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 69b7145bfce2..cdba4709f012 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2823,6 +2823,21 @@ int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
return removed ? 0 : -ENOENT;
}
+void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
+{
+ struct smp_irk *k, *tmp;
+
+ list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
+ if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type)
+ continue;
+
+ BT_DBG("%s removing %pMR", hdev->name, bdaddr);
+
+ list_del(&k->list);
+ kfree(k);
+ }
+}
+
/* HCI command timer function */
static void hci_cmd_timeout(unsigned long arg)
{
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index fbb76a0de580..90aac905a98b 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2328,6 +2328,8 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
else
addr_type = ADDR_LE_DEV_RANDOM;
+ hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);
+
err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
}
--
1.8.5.3
^ permalink raw reply related
* [PATCH 05/10] Bluetooth: Fix completing SMP as peripheral when no keys are expected
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
When we're the acceptors (peripheral/slave) of an SMP procedure and
we've completed distributing our keys we should only stick around
waiting for keys from the remote side if any of the initiator
distribution bits were actually set. This patch fixes the
smp_distribute_keys function to clear the SMP context when this
situation occurs.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/smp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 6dcb35640b6f..54672c9ab6a5 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -1164,7 +1164,7 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
*keydist &= ~SMP_DIST_SIGN;
}
- if (conn->hcon->out || force) {
+ if (conn->hcon->out || force || !(rsp->init_key_dist & 0x07)) {
clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags);
cancel_delayed_work_sync(&conn->security_timer);
smp_chan_destroy(conn);
--
1.8.5.3
^ permalink raw reply related
* [PATCH 04/10] Bluetooth: Fix hci_remove_ltk failure when no match is found
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
There is code (in mgmt.c) that depends on the hci_remove_ltk function to
fail if no match is found. This patch adds tracking of removed LTKs
(there can be up to two: one for master and another for slave) in the
hci_remove_ltk function and returns -ENOENT of no matches were found.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/hci_core.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index fd5bb4086613..69b7145bfce2 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2807,6 +2807,7 @@ int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
{
struct smp_ltk *k, *tmp;
+ int removed = 0;
list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
@@ -2816,9 +2817,10 @@ int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
list_del(&k->list);
kfree(k);
+ removed++;
}
- return 0;
+ return removed ? 0 : -ENOENT;
}
/* HCI command timer function */
--
1.8.5.3
^ permalink raw reply related
* [PATCH 03/10] Bluetooth: Remove return values from functions that don't need them
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
There are many functions that never fail but still declare an integer
return value for no reason. This patch converts these functions to use a
void return value to avoid any confusion of whether they can fail or not.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
include/net/bluetooth/hci_core.h | 10 +++++-----
net/bluetooth/hci_core.c | 26 +++++++++-----------------
net/bluetooth/mgmt.c | 2 +-
3 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index ab94abdeb3c1..964a7888ad0c 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -768,7 +768,7 @@ int hci_inquiry(void __user *arg);
struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
bdaddr_t *bdaddr, u8 type);
-int hci_blacklist_clear(struct hci_dev *hdev);
+void hci_blacklist_clear(struct hci_dev *hdev);
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
@@ -779,9 +779,9 @@ void hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
void hci_conn_params_clear(struct hci_dev *hdev);
-int hci_uuids_clear(struct hci_dev *hdev);
+void hci_uuids_clear(struct hci_dev *hdev);
-int hci_link_keys_clear(struct hci_dev *hdev);
+void hci_link_keys_clear(struct hci_dev *hdev);
struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
@@ -793,7 +793,7 @@ int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
u8 addr_type, bool master);
int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type);
-int hci_smp_ltks_clear(struct hci_dev *hdev);
+void hci_smp_ltks_clear(struct hci_dev *hdev);
int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa);
@@ -803,7 +803,7 @@ int hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type,
u8 val[16], bdaddr_t *rpa);
void hci_smp_irks_clear(struct hci_dev *hdev);
-int hci_remote_oob_data_clear(struct hci_dev *hdev);
+void hci_remote_oob_data_clear(struct hci_dev *hdev);
struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
bdaddr_t *bdaddr);
int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 957c8f4cc4c7..fd5bb4086613 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2506,7 +2506,7 @@ static void hci_discov_off(struct work_struct *work)
mgmt_discoverable_timeout(hdev);
}
-int hci_uuids_clear(struct hci_dev *hdev)
+void hci_uuids_clear(struct hci_dev *hdev)
{
struct bt_uuid *uuid, *tmp;
@@ -2514,11 +2514,9 @@ int hci_uuids_clear(struct hci_dev *hdev)
list_del(&uuid->list);
kfree(uuid);
}
-
- return 0;
}
-int hci_link_keys_clear(struct hci_dev *hdev)
+void hci_link_keys_clear(struct hci_dev *hdev)
{
struct list_head *p, *n;
@@ -2530,11 +2528,9 @@ int hci_link_keys_clear(struct hci_dev *hdev)
list_del(p);
kfree(key);
}
-
- return 0;
}
-int hci_smp_ltks_clear(struct hci_dev *hdev)
+void hci_smp_ltks_clear(struct hci_dev *hdev)
{
struct smp_ltk *k, *tmp;
@@ -2542,8 +2538,6 @@ int hci_smp_ltks_clear(struct hci_dev *hdev)
list_del(&k->list);
kfree(k);
}
-
- return 0;
}
void hci_smp_irks_clear(struct hci_dev *hdev)
@@ -2873,7 +2867,7 @@ int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
return 0;
}
-int hci_remote_oob_data_clear(struct hci_dev *hdev)
+void hci_remote_oob_data_clear(struct hci_dev *hdev)
{
struct oob_data *data, *n;
@@ -2881,8 +2875,6 @@ int hci_remote_oob_data_clear(struct hci_dev *hdev)
list_del(&data->list);
kfree(data);
}
-
- return 0;
}
int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
@@ -2951,7 +2943,7 @@ struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
return NULL;
}
-int hci_blacklist_clear(struct hci_dev *hdev)
+void hci_blacklist_clear(struct hci_dev *hdev)
{
struct list_head *p, *n;
@@ -2961,8 +2953,6 @@ int hci_blacklist_clear(struct hci_dev *hdev)
list_del(p);
kfree(b);
}
-
- return 0;
}
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
@@ -2991,8 +2981,10 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
{
struct bdaddr_list *entry;
- if (!bacmp(bdaddr, BDADDR_ANY))
- return hci_blacklist_clear(hdev);
+ if (!bacmp(bdaddr, BDADDR_ANY)) {
+ hci_blacklist_clear(hdev);
+ return 0;
+ }
entry = hci_blacklist_lookup(hdev, bdaddr, type);
if (!entry)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 473f8687b28b..fbb76a0de580 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2073,7 +2073,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
}
if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
- err = hci_uuids_clear(hdev);
+ hci_uuids_clear(hdev);
if (enable_service_cache(hdev)) {
err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
--
1.8.5.3
^ permalink raw reply related
* [PATCH 02/10] Bluetooth: Fix missing address type check for removing LTKs
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
When removing Long Term Keys we should also be checking that the given
address type (public vs random) matches. This patch updates the
hci_remove_ltk function to take an extra parameter and uses it for
address type matching.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
include/net/bluetooth/hci_core.h | 2 +-
net/bluetooth/hci_core.c | 4 ++--
net/bluetooth/mgmt.c | 14 +++++++++++---
3 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 86ea4bab9e77..ab94abdeb3c1 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -792,7 +792,7 @@ int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
__le16 ediv, u8 rand[8]);
struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
u8 addr_type, bool master);
-int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr);
+int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type);
int hci_smp_ltks_clear(struct hci_dev *hdev);
int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 59a76b2566eb..957c8f4cc4c7 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2810,12 +2810,12 @@ int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
return 0;
}
-int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr)
+int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
{
struct smp_ltk *k, *tmp;
list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
- if (bacmp(bdaddr, &k->bdaddr))
+ if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
continue;
BT_DBG("%s removing %pMR", hdev->name, bdaddr);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 782e2bb10881..473f8687b28b 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2318,10 +2318,18 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
goto unlock;
}
- if (cp->addr.type == BDADDR_BREDR)
+ if (cp->addr.type == BDADDR_BREDR) {
err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
- else
- err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
+ } else {
+ u8 addr_type;
+
+ if (cp->addr.type == BDADDR_LE_PUBLIC)
+ addr_type = ADDR_LE_DEV_PUBLIC;
+ else
+ addr_type = ADDR_LE_DEV_RANDOM;
+
+ err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
+ }
if (err < 0) {
err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
--
1.8.5.3
^ permalink raw reply related
* [PATCH 01/10] Bluetooth: Remove SMP data specific crypto context
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392736479-8808-1-git-send-email-johan.hedberg@gmail.com>
From: Johan Hedberg <johan.hedberg@intel.com>
Now that each HCI device has its own AES crypto context we don't need
the one stored in the SMP data any more. This patch removes the variable
from struct smp_chan and updates the SMP code to use the per-hdev crypto
context.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/smp.c | 15 ++-------------
net/bluetooth/smp.h | 1 -
2 files changed, 2 insertions(+), 14 deletions(-)
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 5867c1c3f436..6dcb35640b6f 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -413,21 +413,13 @@ static void confirm_work(struct work_struct *work)
{
struct smp_chan *smp = container_of(work, struct smp_chan, confirm);
struct l2cap_conn *conn = smp->conn;
- struct crypto_blkcipher *tfm;
+ struct crypto_blkcipher *tfm = conn->hcon->hdev->tfm_aes;
struct smp_cmd_pairing_confirm cp;
int ret;
u8 res[16], reason;
BT_DBG("conn %p", conn);
- tfm = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
- if (IS_ERR(tfm)) {
- reason = SMP_UNSPECIFIED;
- goto error;
- }
-
- smp->tfm = tfm;
-
if (conn->hcon->out)
ret = smp_c1(tfm, smp->tk, smp->prnd, smp->preq, smp->prsp,
conn->hcon->src_type, &conn->hcon->src,
@@ -457,7 +449,7 @@ static void random_work(struct work_struct *work)
struct smp_chan *smp = container_of(work, struct smp_chan, random);
struct l2cap_conn *conn = smp->conn;
struct hci_conn *hcon = conn->hcon;
- struct crypto_blkcipher *tfm = smp->tfm;
+ struct crypto_blkcipher *tfm = hcon->hdev->tfm_aes;
u8 reason, confirm[16], res[16], key[16];
int ret;
@@ -562,9 +554,6 @@ void smp_chan_destroy(struct l2cap_conn *conn)
BUG_ON(!smp);
- if (smp->tfm)
- crypto_free_blkcipher(smp->tfm);
-
kfree(smp);
conn->smp_chan = NULL;
conn->hcon->smp_conn = NULL;
diff --git a/net/bluetooth/smp.h b/net/bluetooth/smp.h
index 4f373bc56ad7..8f54c9b152de 100644
--- a/net/bluetooth/smp.h
+++ b/net/bluetooth/smp.h
@@ -133,7 +133,6 @@ struct smp_chan {
u8 id_addr_type;
u8 irk[16];
unsigned long smp_flags;
- struct crypto_blkcipher *tfm;
struct work_struct confirm;
struct work_struct random;
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH 00/10] Bluetooth: More patches for privacy
From: johan.hedberg @ 2014-02-18 15:14 UTC (permalink / raw)
To: linux-bluetooth
Hi,
Here are more patches towards implementing support for privacy. Included
are also some cleanup and fix patches for issues I came accross when
dealing with the code.
Johan
----------------------------------------------------------------
Johan Hedberg (10):
Bluetooth: Remove SMP data specific crypto context
Bluetooth: Fix missing address type check for removing LTKs
Bluetooth: Remove return values from functions that don't need them
Bluetooth: Fix hci_remove_ltk failure when no match is found
Bluetooth: Fix completing SMP as peripheral when no keys are expected
Bluetooth: Fix removing any IRKs when unpairing devices
Bluetooth: Add convenience function for fetching IRKs
Bluetooth: Track the LE Identity Address in struct hci_conn
Bluetooth: Fix updating Identity Address in L2CAP channels
Bluetooth: Wait for SMP key distribution completion when pairing
include/net/bluetooth/hci_core.h | 23 +++++++++++++-----
include/net/bluetooth/l2cap.h | 1 +
net/bluetooth/hci_core.c | 49 ++++++++++++++++++++++----------------
net/bluetooth/hci_event.c | 7 ++++++
net/bluetooth/l2cap_core.c | 17 +++++++++++++
net/bluetooth/mgmt.c | 45 ++++++++++++++++++++++++++--------
net/bluetooth/smp.c | 25 ++++++++++---------
net/bluetooth/smp.h | 2 +-
8 files changed, 119 insertions(+), 50 deletions(-)
^ permalink raw reply
* Re: Help with AVDTP Connection accept
From: tony @ 2014-02-18 14:45 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <53026C2F.4010705@convergeddevices.net>
A2DP sdp record is not enabled by default. Once I added the source
service using sdptool, I can get past the 'AVDTP CONNECT'. But now it
cribs at AVDTP DISCOVER. Any ideas?
Thanks,
Tony
On 17/02/14 20:08, tony wrote:
> Hi,
> I have BlueZ 4.101 and the daemon is running(log file
> daemon.txt). I am trying to initiate an AVDTP connection from PTS suite.
> But couldn’t get(or not sure how) the BlueZ side accept the connection.
> From the log I can see the device reply with no Link key message. But
> the connection gets dropped quickly.
>
> 1) From browsing the SDP entries (log :- sdptool.txt ), I don't see an
> entry for A2DP. I ran the configure file with --enable audio and can see
> from the daemon.txt audio plugin is loaded. Should I be adding SDP
> record manually? How can I do that?
>
> 2) Am I right in understanding, I should be using test/simple-agent to
> manage SSP? At present I don’t see anything. From forums, I understand,
> the script would prompt for PIN or any security as required. But in my
> case nothing happens. I have attached the btmon log as well.
>
> Thank you for any pointers or suggestions.
>
> Thanks,
> Tony
^ permalink raw reply
* [PATCH BlueZ v2 4/4] build: Move unit tests build rules to Makefile.unit
From: Luiz Augusto von Dentz @ 2014-02-18 14:40 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392734435-2182-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 0697c14..9bffa0f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -179,10 +179,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
@@ -224,103 +224,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 v2 3/4] shared: Move AVDTP implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:40 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392734435-2182-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/Android.mk | 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 +-
7 files changed, 5 insertions(+), 5 deletions(-)
rename {android => src/shared}/avdtp.c (100%)
rename {android => src/shared}/avdtp.h (100%)
diff --git a/Makefile.am b/Makefile.am
index ba9e5b3..0697c14 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -272,7 +272,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/Android.mk b/android/Android.mk
index 763056c..5134d81 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -36,7 +36,6 @@ LOCAL_SRC_FILES := \
bluez/android/socket.c \
bluez/android/ipc.c \
bluez/android/audio-ipc.c \
- bluez/android/avdtp.c \
bluez/android/a2dp.c \
bluez/android/avrcp.c \
bluez/android/pan.c \
@@ -48,6 +47,7 @@ LOCAL_SRC_FILES := \
bluez/src/shared/ringbuf.c \
bluez/src/shared/hfp.c \
bluez/src/shared/io-glib.c \
+ bluez/src/shared/avdtp.c \
bluez/src/shared/avctp.c \
bluez/src/shared/avrcp.c \
bluez/src/sdpd-database.c \
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 v2 2/4] shared: Move AVCTP implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:40 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392734435-2182-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/Android.mk | 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 +-
7 files changed, 5 insertions(+), 5 deletions(-)
rename {android => src/shared}/avctp.c (100%)
rename {android => src/shared}/avctp.h (100%)
diff --git a/Makefile.am b/Makefile.am
index 84dd33b..ba9e5b3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -280,7 +280,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/Android.mk b/android/Android.mk
index 4f8a17a..763056c 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -38,7 +38,6 @@ LOCAL_SRC_FILES := \
bluez/android/audio-ipc.c \
bluez/android/avdtp.c \
bluez/android/a2dp.c \
- bluez/android/avctp.c \
bluez/android/avrcp.c \
bluez/android/pan.c \
bluez/android/handsfree.c \
@@ -49,6 +48,7 @@ LOCAL_SRC_FILES := \
bluez/src/shared/ringbuf.c \
bluez/src/shared/hfp.c \
bluez/src/shared/io-glib.c \
+ bluez/src/shared/avctp.c \
bluez/src/shared/avrcp.c \
bluez/src/sdpd-database.c \
bluez/src/sdpd-service.c \
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 v2 1/4] shared: Add initial AVRCP code
From: Luiz Augusto von Dentz @ 2014-02-18 14:40 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.
---
v2: Fix not updating Android.mk with new location of the files
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..4f8a17a 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -49,6 +49,7 @@ LOCAL_SRC_FILES := \
bluez/src/shared/ringbuf.c \
bluez/src/shared/hfp.c \
bluez/src/shared/io-glib.c \
+ bluez/src/shared/avrcp.c \
bluez/src/sdpd-database.c \
bluez/src/sdpd-service.c \
bluez/src/sdpd-request.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 13/13] android/hal-avrcp: Add notification handlers
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 174 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 469de3f..c08604d 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -32,6 +32,177 @@ static bool interface_ready(void)
return cbs != NULL;
}
+static void handle_remote_features(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_remote_features *ev = buf;
+
+ if (cbs->remote_features_cb)
+ cbs->remote_features_cb((bt_bdaddr_t *) (ev->bdaddr),
+ ev->features);
+}
+
+static void handle_get_play_status(void *buf, uint16_t len)
+{
+ if (cbs->get_play_status_cb)
+ cbs->get_play_status_cb();
+}
+
+static void handle_list_player_attrs(void *buf, uint16_t len)
+{
+ if (cbs->list_player_app_attr_cb)
+ cbs->list_player_app_attr_cb();
+}
+
+static void handle_list_player_values(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_list_player_values *ev = buf;
+
+ if (cbs->list_player_app_values_cb)
+ cbs->list_player_app_values_cb(ev->attr);
+}
+
+static void handle_get_player_values(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_get_player_values *ev = buf;
+ btrc_player_attr_t attrs[4];
+ int i;
+
+ if (!cbs->get_player_app_value_cb)
+ return;
+
+ /* Convert uint8_t array to btrc_player_attr_t array */
+ for (i = 0; i < ev->number; i++)
+ attrs[i] = ev->attrs[i];
+
+ cbs->get_player_app_value_cb(ev->number, attrs);
+}
+
+static void handle_get_player_attrs_text(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_get_player_attrs_text *ev = buf;
+ btrc_player_attr_t attrs[4];
+ int i;
+
+ if (!cbs->get_player_app_attrs_text_cb)
+ return;
+
+ /* Convert uint8_t array to btrc_player_attr_t array */
+ for (i = 0; i < ev->number; i++)
+ attrs[i] = ev->attrs[i];
+
+ cbs->get_player_app_attrs_text_cb(ev->number, attrs);
+}
+
+static void handle_get_player_values_text(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_get_player_values_text *ev = buf;
+
+ if (cbs->get_player_app_values_text_cb)
+ cbs->get_player_app_values_text_cb(ev->attr, ev->number,
+ ev->values);
+}
+
+static void handle_set_player_value(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_set_player_values *ev = buf;
+ struct hal_avrcp_player_attr_value *attrs;
+ btrc_player_settings_t values;
+ int i;
+
+ if (!cbs->set_player_app_value_cb)
+ return;
+
+ attrs = (struct hal_avrcp_player_attr_value *) ev->attrs;
+
+ /* Convert to btrc_player_settings_t */
+ values.num_attr = ev->number;
+ for (i = 0; i < ev->number; i++) {
+ values.attr_ids[i] = attrs[i].attr;
+ values.attr_values[i] = attrs[i].value;
+ }
+
+ cbs->set_player_app_value_cb(&values);
+}
+
+static void handle_get_element_attrs(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_get_element_attrs *ev = buf;
+ btrc_media_attr_t attrs[BTRC_MAX_APP_SETTINGS];
+ int i;
+
+ if (!cbs->get_element_attr_cb)
+ return;
+
+ /* Convert uint8_t array to btrc_media_attr_t array */
+ for (i = 0; i < ev->number; i++)
+ attrs[i] = ev->attrs[i];
+
+ cbs->get_element_attr_cb(ev->number, attrs);
+}
+
+static void handle_register_notification(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_register_notification *ev = buf;
+
+ if (cbs->register_notification_cb)
+ cbs->register_notification_cb(ev->event, ev->param);
+}
+
+static void handle_volume_changed(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_volume_changed *ev = buf;
+
+ if (cbs->volume_change_cb)
+ cbs->volume_change_cb(ev->volume, ev->type);
+}
+
+static void handle_passthrough_cmd(void *buf, uint16_t len)
+{
+ struct hal_ev_avrcp_passthrough_cmd *ev = buf;
+
+ if (cbs->passthrough_cmd_cb)
+ cbs->passthrough_cmd_cb(ev->id, ev->state);
+}
+
+/* handlers will be called from notification thread context,
+ * index in table equals to 'opcode - HAL_MINIMUM_EVENT' */
+static const struct hal_ipc_handler ev_handlers[] = {
+ /* HAL_EV_AVRCP_REMOTE_FEATURES */
+ { handle_remote_features, false,
+ sizeof(struct hal_ev_avrcp_remote_features) },
+ /* HAL_EV_AVRCP_GET_PLAY_STATUS */
+ { handle_get_play_status, false, 0 },
+ /* HAL_EV_AVRCP_LIST_PLAYER_ATTRS */
+ { handle_list_player_attrs, false, 0 },
+ /* HAL_EV_AVRCP_LIST_PLAYER_VALUES */
+ { handle_list_player_values, false,
+ sizeof(struct hal_ev_avrcp_list_player_values) },
+ /* HAL_EV_AVRCP_GET_PLAYER_VALUES */
+ { handle_get_player_values, true,
+ sizeof(struct hal_ev_avrcp_get_player_values) },
+ /* HAL_EV_AVRCP_GET_PLAYER_ATTRS_TEXT */
+ { handle_get_player_attrs_text, true,
+ sizeof(struct hal_ev_avrcp_get_player_attrs_text) },
+ /* HAL_EV_AVRCP_GET_PLAYER_VALUES_TEXT */
+ { handle_get_player_values_text, true,
+ sizeof(struct hal_ev_avrcp_get_player_values_text) },
+ /* HAL_EV_AVRCP_SET_PLAYER_VALUES */
+ { handle_set_player_value, true,
+ sizeof(struct hal_ev_avrcp_set_player_values) },
+ /* HAL_EV_AVRCP_GET_ELEMENT_ATTRS */
+ { handle_get_element_attrs, true,
+ sizeof(struct hal_ev_avrcp_get_element_attrs) },
+ /* HAL_EV_AVRCP_REGISTER_NOTIFICATION */
+ { handle_register_notification, false,
+ sizeof(struct hal_ev_avrcp_register_notification) },
+ /* HAL_EV_AVRCP_VOLUME_CHANGED */
+ { handle_volume_changed, false,
+ sizeof(struct hal_ev_avrcp_volume_changed) },
+ /* HAL_EV_AVRCP_PASSTHROUGH_CMD */
+ { handle_passthrough_cmd, false,
+ sizeof(struct hal_ev_avrcp_passthrough_cmd) },
+};
+
static bt_status_t init(btrc_callbacks_t *callbacks)
{
struct hal_cmd_register_module cmd;
@@ -44,6 +215,9 @@ static bt_status_t init(btrc_callbacks_t *callbacks)
cbs = callbacks;
+ hal_ipc_register(HAL_SERVICE_ID_AVRCP, ev_handlers,
+ sizeof(ev_handlers) / sizeof(ev_handlers[0]));
+
cmd.service_id = HAL_SERVICE_ID_AVRCP;
ret = hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 12/13] android/hal-avrcp: Add .set_volume implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 41349f2..469de3f 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -424,6 +424,21 @@ static bt_status_t register_notification_rsp(btrc_event_id_t event_id,
return status;
}
+static bt_status_t set_volume(uint8_t volume)
+{
+ struct hal_cmd_avrcp_set_volume cmd;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ cmd.value = volume;
+
+ return hal_ipc_cmd(HAL_SERVICE_ID_AVRCP, HAL_OP_AVRCP_SET_VOLUME,
+ sizeof(cmd), &cmd, 0, NULL, NULL);
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -455,6 +470,7 @@ static btrc_interface_t iface = {
.get_element_attr_rsp = get_element_attr_rsp,
.set_player_app_value_rsp = set_player_app_value_rsp,
.register_notification_rsp = register_notification_rsp,
+ .set_volume = set_volume,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 11/13] android/hal-avrcp: Add .register_notification_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 142 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index d32cdff..41349f2 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -283,6 +283,147 @@ static bt_status_t set_player_app_value_rsp(btrc_status_t rsp_status)
sizeof(cmd), &cmd, 0, NULL, NULL);
}
+static void *play_status_changed_rsp(btrc_notification_type_t type,
+ btrc_play_status_t *play_status)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+ size_t param_len;
+
+ param_len = 1;
+ cmd = malloc(sizeof(*cmd) + param_len);
+ cmd->event = BTRC_EVT_PLAY_STATUS_CHANGED;
+ cmd->type = type;
+ cmd->len = param_len;
+ memcpy(cmd->data, play_status, cmd->len);
+
+ return cmd;
+}
+
+static void *track_change_rsp(btrc_notification_type_t type, btrc_uid_t *track)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+ size_t param_len;
+
+ param_len = sizeof(*track);
+ cmd = malloc(sizeof(*cmd) + param_len);
+ cmd->event = BTRC_EVT_TRACK_CHANGE;
+ cmd->type = type;
+ cmd->len = param_len;
+ memcpy(cmd->data, track, cmd->len);
+
+ return cmd;
+}
+
+static void *track_reached_end_rsp(btrc_notification_type_t type)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+
+ cmd = malloc(sizeof(*cmd));
+ cmd->event = BTRC_EVT_TRACK_REACHED_END;
+ cmd->type = type;
+ cmd->len = 0;
+
+ return cmd;
+}
+
+static void *track_reached_start_rsp(btrc_notification_type_t type)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+
+ cmd = malloc(sizeof(*cmd));
+ cmd->event = BTRC_EVT_TRACK_REACHED_START;
+ cmd->type = type;
+ cmd->len = 0;
+
+ return cmd;
+}
+
+static void *play_pos_changed_rsp(btrc_notification_type_t type,
+ uint32_t *song_pos)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+ size_t param_len;
+
+ param_len = sizeof(*song_pos);
+ cmd = malloc(sizeof(*cmd) + param_len);
+ cmd->event = BTRC_EVT_PLAY_POS_CHANGED;
+ cmd->type = type;
+ cmd->len = param_len;
+ memcpy(cmd->data, song_pos, cmd->len);
+
+ return cmd;
+}
+
+static void *settings_changed_rsp(btrc_notification_type_t type,
+ btrc_player_settings_t *player_setting)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+ struct hal_avrcp_player_attr_value *attrs;
+ size_t param_len;
+ int i;
+
+ param_len = player_setting->num_attr * sizeof(*attrs);
+ cmd = malloc(sizeof(*cmd) + param_len);
+ cmd->event = BTRC_EVT_APP_SETTINGS_CHANGED;
+ cmd->type = type;
+ cmd->len = param_len;
+
+ attrs = (struct hal_avrcp_player_attr_value *) &cmd->data[0];
+ for (i = 0; i < player_setting->num_attr; i++) {
+ attrs[i].attr = player_setting->attr_ids[i];
+ attrs[i].value = player_setting->attr_values[i];
+ }
+
+ return cmd;
+}
+
+static bt_status_t register_notification_rsp(btrc_event_id_t event_id,
+ btrc_notification_type_t type,
+ btrc_register_notification_t *p_param)
+{
+ struct hal_cmd_avrcp_register_notification *cmd;
+ bt_status_t status;
+ size_t len;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ switch (event_id) {
+ case BTRC_EVT_PLAY_STATUS_CHANGED:
+ cmd = play_status_changed_rsp(type, &p_param->play_status);
+ break;
+ case BTRC_EVT_TRACK_CHANGE:
+ cmd = track_change_rsp(type, &p_param->track);
+ break;
+ case BTRC_EVT_TRACK_REACHED_END:
+ cmd = track_reached_end_rsp(type);
+ break;
+ case BTRC_EVT_TRACK_REACHED_START:
+ cmd = track_reached_start_rsp(type);
+ break;
+ case BTRC_EVT_PLAY_POS_CHANGED:
+ cmd = play_pos_changed_rsp(type, &p_param->song_pos);
+ break;
+ case BTRC_EVT_APP_SETTINGS_CHANGED:
+ cmd = settings_changed_rsp(type, &p_param->player_setting);
+ break;
+ default:
+ return BT_STATUS_PARM_INVALID;
+ }
+
+ len = sizeof(*cmd) + cmd->len;
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_REGISTER_NOTIFICATION,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -313,6 +454,7 @@ static btrc_interface_t iface = {
.get_player_app_value_text_rsp = get_player_app_value_text_rsp,
.get_element_attr_rsp = get_element_attr_rsp,
.set_player_app_value_rsp = set_player_app_value_rsp,
+ .register_notification_rsp = register_notification_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 10/13] android/hal-avrcp: Add .set_player_app_value_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 2b8b58a..d32cdff 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -267,6 +267,22 @@ static bt_status_t get_element_attr_rsp(uint8_t num_attr,
return status;
}
+static bt_status_t set_player_app_value_rsp(btrc_status_t rsp_status)
+{
+ struct hal_cmd_avrcp_set_player_attrs_value cmd;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ cmd.status = rsp_status;
+
+ return hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_SET_PLAYER_ATTRS_VALUE,
+ sizeof(cmd), &cmd, 0, NULL, NULL);
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -296,6 +312,7 @@ static btrc_interface_t iface = {
.get_player_app_attr_text_rsp = get_player_app_attr_text_rsp,
.get_player_app_value_text_rsp = get_player_app_value_text_rsp,
.get_element_attr_rsp = get_element_attr_rsp,
+ .set_player_app_value_rsp = set_player_app_value_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 09/13] android/hal-avrcp: Add .get_element_attr_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index d7d47f8..2b8b58a 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -232,6 +232,41 @@ static bt_status_t get_player_app_value_text_rsp(int num_val,
return status;
}
+static bt_status_t get_element_attr_rsp(uint8_t num_attr,
+ btrc_element_attr_val_t *p_attrs)
+{
+ struct hal_cmd_avrcp_get_element_attrs_text *cmd;
+ bt_status_t status;
+ size_t len, attrs_len;
+ int i;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ attrs_len = num_attr * sizeof(struct hal_avrcp_player_setting_text);
+ len = sizeof(*cmd) + attrs_len;
+ cmd = malloc(len);
+
+ cmd->number = num_attr;
+
+ for (i = 0; i < num_attr; i++) {
+ /* We are unable to memcpy the id since it is uint32_t */
+ cmd->values[i].id = p_attrs[i].attr_id;
+ memcpy(cmd->values[i].text, p_attrs[i].text,
+ sizeof(cmd->values[i].text));
+ }
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_GET_ELEMENT_ATTRS_TEXT,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -260,6 +295,7 @@ static btrc_interface_t iface = {
.get_player_app_value_rsp = get_player_app_value_rsp,
.get_player_app_attr_text_rsp = get_player_app_attr_text_rsp,
.get_player_app_value_text_rsp = get_player_app_value_text_rsp,
+ .get_element_attr_rsp = get_element_attr_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 08/13] android/hal-avrcp: Add .get_player_app_value_text_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 36513c6..d7d47f8 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -201,6 +201,37 @@ static bt_status_t get_player_app_attr_text_rsp(int num_attr,
return status;
}
+static bt_status_t get_player_app_value_text_rsp(int num_val,
+ btrc_player_setting_text_t *p_vals)
+{
+ struct hal_cmd_avrcp_get_player_values_text *cmd;
+ bt_status_t status;
+ size_t len, values_len;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ if (num_val < 0)
+ return BT_STATUS_PARM_INVALID;
+
+ values_len = num_val * sizeof(*p_vals);
+ len = sizeof(*cmd) + values_len;
+ cmd = malloc(len);
+
+ cmd->number = num_val;
+ memcpy(cmd->values, p_vals, values_len);
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_GET_PLAYER_VALUES_TEXT,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -228,6 +259,7 @@ static btrc_interface_t iface = {
.list_player_app_value_rsp = list_player_app_value_rsp,
.get_player_app_value_rsp = get_player_app_value_rsp,
.get_player_app_attr_text_rsp = get_player_app_attr_text_rsp,
+ .get_player_app_value_text_rsp = get_player_app_value_text_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 07/13] android/hal-avrcp: Add .get_player_app_attr_text_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 4110388..36513c6 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -170,6 +170,37 @@ static bt_status_t get_player_app_value_rsp(btrc_player_settings_t *p_vals)
return status;
}
+static bt_status_t get_player_app_attr_text_rsp(int num_attr,
+ btrc_player_setting_text_t *p_attrs)
+{
+ struct hal_cmd_avrcp_get_player_attrs_text *cmd;
+ bt_status_t status;
+ size_t len, attrs_len;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ if (num_attr < 0)
+ return BT_STATUS_PARM_INVALID;
+
+ attrs_len = num_attr * sizeof(*p_attrs);
+ len = sizeof(*cmd) + attrs_len;
+ cmd = malloc(len);
+
+ cmd->number = num_attr;
+ memcpy(cmd->attrs, p_attrs, attrs_len);
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_GET_PLAYER_ATTRS_TEXT,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -196,6 +227,7 @@ static btrc_interface_t iface = {
.list_player_app_attr_rsp = list_player_app_attr_rsp,
.list_player_app_value_rsp = list_player_app_value_rsp,
.get_player_app_value_rsp = get_player_app_value_rsp,
+ .get_player_app_attr_text_rsp = get_player_app_attr_text_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 06/13] android/hal-avrcp: Add .get_player_app_value_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 4bc8073..4110388 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -134,6 +134,42 @@ static bt_status_t list_player_app_value_rsp(int num_val, uint8_t *p_vals)
return status;
}
+static bt_status_t get_player_app_value_rsp(btrc_player_settings_t *p_vals)
+{
+ struct hal_cmd_avrcp_get_player_attrs *cmd;
+ bt_status_t status;
+ size_t len, attrs_len;
+ int i;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ if (!p_vals)
+ return BT_STATUS_PARM_INVALID;
+
+ attrs_len = p_vals->num_attr *
+ sizeof(struct hal_avrcp_player_attr_value);
+ len = sizeof(*cmd) + attrs_len;
+ cmd = malloc(len);
+
+ cmd->number = p_vals->num_attr;
+
+ for (i = 0; i < p_vals->num_attr; i++) {
+ cmd->attrs[i].attr = p_vals->attr_ids[i];
+ cmd->attrs[i].value = p_vals->attr_values[i];
+ }
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_GET_PLAYER_ATTRS,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -159,6 +195,7 @@ static btrc_interface_t iface = {
.get_play_status_rsp = get_play_status_rsp,
.list_player_app_attr_rsp = list_player_app_attr_rsp,
.list_player_app_value_rsp = list_player_app_value_rsp,
+ .get_player_app_value_rsp = get_player_app_value_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 05/13] android/hal-avrcp: Add .list_player_app_value_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 244f77a..4bc8073 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -105,6 +105,35 @@ static bt_status_t list_player_app_attr_rsp(int num_attr,
return status;
}
+static bt_status_t list_player_app_value_rsp(int num_val, uint8_t *p_vals)
+{
+ struct hal_cmd_avrcp_list_player_values *cmd;
+ bt_status_t status;
+ size_t len;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ if (num_val < 0)
+ return BT_STATUS_PARM_INVALID;
+
+ len = sizeof(*cmd) + num_val;
+ cmd = malloc(len);
+
+ cmd->number = num_val;
+ memcpy(cmd->values, p_vals, num_val);
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_LIST_PLAYER_VALUES,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -129,6 +158,7 @@ static btrc_interface_t iface = {
.init = init,
.get_play_status_rsp = get_play_status_rsp,
.list_player_app_attr_rsp = list_player_app_attr_rsp,
+ .list_player_app_value_rsp = list_player_app_value_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 04/13] android/hal-avrcp: Add .list_player_app_attr_rsp implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 9937a11..244f77a 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -18,6 +18,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
+#include <stdlib.h>
#include "hal-log.h"
#include "hal.h"
@@ -74,6 +75,36 @@ static bt_status_t get_play_status_rsp(btrc_play_status_t status,
sizeof(cmd), &cmd, 0, NULL, NULL);
}
+static bt_status_t list_player_app_attr_rsp(int num_attr,
+ btrc_player_attr_t *p_attrs)
+{
+ struct hal_cmd_avrcp_list_player_attrs *cmd;
+ bt_status_t status;
+ size_t len;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ if (num_attr < 0)
+ return BT_STATUS_PARM_INVALID;
+
+ len = sizeof(*cmd) + num_attr;
+ cmd = malloc(len);
+
+ cmd->number = num_attr;
+ memcpy(cmd->attrs, p_attrs, num_attr);
+
+ status = hal_ipc_cmd(HAL_SERVICE_ID_AVRCP,
+ HAL_OP_AVRCP_LIST_PLAYER_ATTRS,
+ len, cmd, 0, NULL, NULL);
+
+ free(cmd);
+
+ return status;
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -97,6 +128,7 @@ static btrc_interface_t iface = {
.size = sizeof(iface),
.init = init,
.get_play_status_rsp = get_play_status_rsp,
+ .list_player_app_attr_rsp = list_player_app_attr_rsp,
.cleanup = cleanup
};
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 03/13] android/hal-avrcp: Add .get_play_status implementation
From: Luiz Augusto von Dentz @ 2014-02-18 14:24 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1392733470-22736-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/hal-avrcp.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/android/hal-avrcp.c b/android/hal-avrcp.c
index 01d233b..9937a11 100644
--- a/android/hal-avrcp.c
+++ b/android/hal-avrcp.c
@@ -56,6 +56,24 @@ static bt_status_t init(btrc_callbacks_t *callbacks)
return ret;
}
+static bt_status_t get_play_status_rsp(btrc_play_status_t status,
+ uint32_t song_len, uint32_t song_pos)
+{
+ struct hal_cmd_avrcp_get_play_status cmd;
+
+ DBG("");
+
+ if (!interface_ready())
+ return BT_STATUS_NOT_READY;
+
+ cmd.status = status;
+ cmd.duration = song_len;
+ cmd.position = song_pos;
+
+ return hal_ipc_cmd(HAL_SERVICE_ID_AVRCP, HAL_OP_AVRCP_GET_PLAY_STATUS,
+ sizeof(cmd), &cmd, 0, NULL, NULL);
+}
+
static void cleanup()
{
struct hal_cmd_unregister_module cmd;
@@ -78,6 +96,7 @@ static void cleanup()
static btrc_interface_t iface = {
.size = sizeof(iface),
.init = init,
+ .get_play_status_rsp = get_play_status_rsp,
.cleanup = cleanup
};
--
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