* [PATCH 1/3] Add length argument to hci pincode reply
2011-04-02 19:51 [PATCH 0/3] Support binary pin codes David Herrmann
@ 2011-04-02 19:51 ` David Herrmann
2011-04-02 19:51 ` [PATCH 2/3] Make adapter API accept binary pincodes David Herrmann
2011-04-02 19:51 ` [PATCH 3/3] Support hardcoded Nintendo Wii Remote pins David Herrmann
2 siblings, 0 replies; 4+ messages in thread
From: David Herrmann @ 2011-04-02 19:51 UTC (permalink / raw)
To: linux-bluetooth; +Cc: hadess, marcel, David Herrmann
This adds a new "length" argument to the hci pincode reply to allow
sending binary pins including \0 characters.
---
plugins/hciops.c | 9 ++++-----
plugins/mgmtops.c | 14 ++++++--------
src/adapter.c | 2 +-
src/adapter.h | 2 +-
4 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 93f6f21..afac330 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -3296,7 +3296,7 @@ static int hciops_remove_bonding(int index, bdaddr_t *bdaddr)
return 0;
}
-static int hciops_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin)
+static int hciops_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin, size_t pinlen)
{
struct dev_info *dev = &devs[index];
char addr[18];
@@ -3307,14 +3307,13 @@ static int hciops_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin)
if (pin) {
pin_code_reply_cp pr;
- size_t len = strlen(pin);
- dev->pin_length = len;
+ dev->pin_length = pinlen;
memset(&pr, 0, sizeof(pr));
bacpy(&pr.bdaddr, bdaddr);
- memcpy(pr.pin_code, pin, len);
- pr.pin_len = len;
+ memcpy(pr.pin_code, pin, pinlen);
+ pr.pin_len = pinlen;
err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
OCF_PIN_CODE_REPLY,
PIN_CODE_REPLY_CP_SIZE, &pr);
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 042afc5..d03a29d 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -493,7 +493,7 @@ static void mgmt_connect_failed(int sk, uint16_t index, void *buf, size_t len)
btd_event_bonding_complete(&info->bdaddr, &ev->bdaddr, ev->status);
}
-static int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin)
+static int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin, size_t pinlen)
{
char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_pin_code_reply)];
struct mgmt_hdr *hdr = (void *) buf;
@@ -501,7 +501,7 @@ static int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin)
char addr[18];
ba2str(bdaddr, addr);
- DBG("index %d addr %s pin %s", index, addr, pin ? pin : "<none>");
+ DBG("index %d addr %s pinlen %lu", index, addr, pinlen);
memset(buf, 0, sizeof(buf));
@@ -518,10 +518,8 @@ static int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin)
buf_len = sizeof(*hdr) + sizeof(*cp);
} else {
struct mgmt_cp_pin_code_reply *cp;
- size_t pin_len;
- pin_len = strlen(pin);
- if (pin_len > 16)
+ if (pinlen > 16)
return -EINVAL;
hdr->opcode = htobs(MGMT_OP_PIN_CODE_REPLY);
@@ -530,8 +528,8 @@ static int mgmt_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin)
cp = (void *) &buf[sizeof(*hdr)];
bacpy(&cp->bdaddr, bdaddr);
- cp->pin_len = pin_len;
- memcpy(cp->pin_code, pin, pin_len);
+ cp->pin_len = pinlen;
+ memcpy(cp->pin_code, pin, pinlen);
buf_len = sizeof(*hdr) + sizeof(*cp);
}
@@ -568,7 +566,7 @@ static void mgmt_pin_code_request(int sk, uint16_t index, void *buf, size_t len)
err = btd_event_request_pin(&info->bdaddr, &ev->bdaddr);
if (err < 0) {
error("btd_event_request_pin: %s", strerror(-err));
- mgmt_pincode_reply(index, &ev->bdaddr, NULL);
+ mgmt_pincode_reply(index, &ev->bdaddr, NULL, 0);
}
}
diff --git a/src/adapter.c b/src/adapter.c
index c400bfd..83f3217 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3703,7 +3703,7 @@ int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
const char *pin)
{
- return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin);
+ return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin, pin ? strlen(pin) : 0);
}
int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
diff --git a/src/adapter.h b/src/adapter.h
index 308af75..fd2fc12 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -221,7 +221,7 @@ struct btd_adapter_ops {
int (*read_local_features) (int index, uint8_t *features);
int (*disconnect) (int index, bdaddr_t *bdaddr);
int (*remove_bonding) (int index, bdaddr_t *bdaddr);
- int (*pincode_reply) (int index, bdaddr_t *bdaddr, const char *pin);
+ int (*pincode_reply) (int index, bdaddr_t *bdaddr, const char *pin, size_t pinlen);
int (*confirm_reply) (int index, bdaddr_t *bdaddr, gboolean success);
int (*passkey_reply) (int index, bdaddr_t *bdaddr, uint32_t passkey);
int (*enable_le) (int index);
--
1.7.4.2
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 2/3] Make adapter API accept binary pincodes
2011-04-02 19:51 [PATCH 0/3] Support binary pin codes David Herrmann
2011-04-02 19:51 ` [PATCH 1/3] Add length argument to hci pincode reply David Herrmann
@ 2011-04-02 19:51 ` David Herrmann
2011-04-02 19:51 ` [PATCH 3/3] Support hardcoded Nintendo Wii Remote pins David Herrmann
2 siblings, 0 replies; 4+ messages in thread
From: David Herrmann @ 2011-04-02 19:51 UTC (permalink / raw)
To: linux-bluetooth; +Cc: hadess, marcel, David Herrmann
Add pin-length argument to adapter API to allow passing binary pins
containing \0 characters to the hci handler.
---
src/adapter.c | 4 ++--
src/adapter.h | 2 +-
src/event.c | 6 +++---
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 83f3217..14516ac 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3701,9 +3701,9 @@ int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
}
int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
- const char *pin)
+ const char *pin, size_t pinlen)
{
- return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin, pin ? strlen(pin) : 0);
+ return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin, pinlen);
}
int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
diff --git a/src/adapter.h b/src/adapter.h
index fd2fc12..b507506 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -273,7 +273,7 @@ int btd_adapter_disconnect_device(struct btd_adapter *adapter,
int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr);
int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
- const char *pin);
+ const char *pin, size_t pinlen);
int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
gboolean success);
int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
diff --git a/src/event.c b/src/event.c
index 4ca1be5..91343d4 100644
--- a/src/event.c
+++ b/src/event.c
@@ -111,13 +111,13 @@ static void pincode_cb(struct agent *agent, DBusError *derr,
device_get_address(device, &dba);
if (derr) {
- err = btd_adapter_pincode_reply(adapter, &dba, NULL);
+ err = btd_adapter_pincode_reply(adapter, &dba, NULL, 0);
if (err < 0)
goto fail;
return;
}
- err = btd_adapter_pincode_reply(adapter, &dba, pincode);
+ err = btd_adapter_pincode_reply(adapter, &dba, pincode, pincode ? strlen(pincode) : 0);
if (err < 0)
goto fail;
@@ -142,7 +142,7 @@ int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba)
memset(pin, 0, sizeof(pin));
pinlen = read_pin_code(sba, dba, pin);
if (pinlen > 0) {
- btd_adapter_pincode_reply(adapter, dba, pin);
+ btd_adapter_pincode_reply(adapter, dba, pin, pinlen);
return 0;
}
--
1.7.4.2
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 3/3] Support hardcoded Nintendo Wii Remote pins
2011-04-02 19:51 [PATCH 0/3] Support binary pin codes David Herrmann
2011-04-02 19:51 ` [PATCH 1/3] Add length argument to hci pincode reply David Herrmann
2011-04-02 19:51 ` [PATCH 2/3] Make adapter API accept binary pincodes David Herrmann
@ 2011-04-02 19:51 ` David Herrmann
2 siblings, 0 replies; 4+ messages in thread
From: David Herrmann @ 2011-04-02 19:51 UTC (permalink / raw)
To: linux-bluetooth; +Cc: hadess, marcel, David Herrmann
The Nintendo Wii Remote requires the destination bluetooth address
as pincode. This changes the pin handling by skipping the agent
module and sending an hardcoded pin if the target device is a
Nintendo Wii Remote.
---
src/event.c | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/src/event.c b/src/event.c
index 91343d4..ec05e95 100644
--- a/src/event.c
+++ b/src/event.c
@@ -129,6 +129,24 @@ fail:
error("Sending PIN code reply failed: %s (%d)", strerror(-err), -err);
}
+static int get_pin(bdaddr_t *sba, bdaddr_t *dba, char *pinbuf)
+{
+ uint16_t vendor, product;
+ char src_addr[18], dst_addr[18];
+
+ ba2str(sba, src_addr);
+ ba2str(dba, dst_addr);
+ if (0 == read_device_id(src_addr, dst_addr, NULL, &vendor, &product, NULL)) {
+ /* Nintendo Wii Remote uses destination address as PIN */
+ if (vendor == 0x057e && product == 0x0306) {
+ memcpy(pinbuf, dba, 6);
+ return 6;
+ }
+ }
+
+ return read_pin_code(sba, dba, pinbuf);
+}
+
int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba)
{
struct btd_adapter *adapter;
@@ -140,7 +158,7 @@ int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba)
return -ENODEV;
memset(pin, 0, sizeof(pin));
- pinlen = read_pin_code(sba, dba, pin);
+ pinlen = get_pin(sba, dba, pin);
if (pinlen > 0) {
btd_adapter_pincode_reply(adapter, dba, pin, pinlen);
return 0;
--
1.7.4.2
^ permalink raw reply related [flat|nested] 4+ messages in thread