diff options
Diffstat (limited to 'hcid/security.c')
-rw-r--r-- | hcid/security.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/hcid/security.c b/hcid/security.c index c9e7dda7..6f8151f8 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -375,18 +375,29 @@ static void remote_oob_data_request(int dev, bdaddr_t *sba, void *ptr) static void io_capa_request(int dev, bdaddr_t *sba, bdaddr_t *dba) { - io_capability_neg_reply_cp cp; char sa[18], da[18]; + uint8_t cap, auth; ba2str(sba, sa); ba2str(dba, da); info("io_capa_request (sba=%s, dba=%s)", sa, da); - memset(&cp, 0, sizeof(cp)); - bacpy(&cp.bdaddr, dba); - cp.reason = HCI_PAIRING_NOT_ALLOWED; - - hci_send_cmd(dev, OGF_LINK_CTL, OCF_IO_CAPABILITY_NEG_REPLY, - IO_CAPABILITY_NEG_REPLY_CP_SIZE, &cp); + if (hcid_dbus_get_io_cap(sba, dba, &cap, &auth) < 0) { + io_capability_neg_reply_cp cp; + memset(&cp, 0, sizeof(cp)); + bacpy(&cp.bdaddr, dba); + cp.reason = HCI_PAIRING_NOT_ALLOWED; + hci_send_cmd(dev, OGF_LINK_CTL, OCF_IO_CAPABILITY_NEG_REPLY, + IO_CAPABILITY_NEG_REPLY_CP_SIZE, &cp); + } else { + io_capability_reply_cp cp; + memset(&cp, 0, sizeof(cp)); + bacpy(&cp.bdaddr, dba); + cp.capability = cap; + cp.oob_data = 0x00; + cp.authentication = auth; + hci_send_cmd(dev, OGF_LINK_CTL, OCF_IO_CAPABILITY_REPLY, + IO_CAPABILITY_REPLY_CP_SIZE, &cp); + } } /* PIN code handling */ |