diff --git a/lib/mgmt.h b/lib/mgmt.h
index 37e63c8..79db878 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
} __packed;
struct mgmt_link_key_info {
- bdaddr_t bdaddr;
+ struct mgmt_addr_info addr;
uint8_t type;
uint8_t val[16];
uint8_t pin_len;
#define MGMT_OP_PIN_CODE_REPLY 0x0016
struct mgmt_cp_pin_code_reply {
- bdaddr_t bdaddr;
+ struct mgmt_addr_info addr;
uint8_t pin_len;
uint8_t pin_code[16];
} __packed;
#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0017
struct mgmt_cp_pin_code_neg_reply {
- bdaddr_t bdaddr;
+ struct mgmt_addr_info addr;
} __packed;
#define MGMT_OP_SET_IO_CAPABILITY 0x0018
#define MGMT_OP_CONFIRM_NAME 0x0025
struct mgmt_cp_confirm_name {
- bdaddr_t bdaddr;
+ struct mgmt_addr_info addr;
uint8_t name_known;
} __packed;
struct mgmt_rp_confirm_name {
- bdaddr_t bdaddr;
+ struct mgmt_addr_info addr;
uint8_t status;
} __packed;
#define MGMT_EV_PIN_CODE_REQUEST 0x000E
struct mgmt_ev_pin_code_request {
- bdaddr_t bdaddr;
+ struct mgmt_addr_info addr;
uint8_t secure;
} __packed;
diff --git a/mgmt/main.c b/mgmt/main.c
index 1f2cbcd..c3a51c3 100644
--- a/mgmt/main.c
+++ b/mgmt/main.c
if (monitor) {
char addr[18];
- ba2str(&ev->key.bdaddr, addr);
+ ba2str(&ev->key.addr.bdaddr, addr);
printf("hci%u new_link_key %s type 0x%02x pin_len %d "
"store_hint %u\n", index, addr, ev->key.type,
ev->key.pin_len, ev->store_hint);
return;
}
- ba2str(&rp->bdaddr, addr);
+ ba2str(&rp->addr.bdaddr, addr);
if (rp->status != 0)
fprintf(stderr,
struct mgmt_cp_confirm_name cp;
memset(&cp, 0, sizeof(cp));
- bacpy(&cp.bdaddr, &ev->addr.bdaddr);
+ memcpy(&cp.addr, &ev->addr, sizeof(cp.addr));
if (resolve_names)
cp.name_known = 0;
else
printf("hci%u PIN Reply successful\n", id);
}
-static int mgmt_pin_reply(int mgmt_sk, uint16_t index, bdaddr_t *bdaddr,
+static int mgmt_pin_reply(int mgmt_sk, uint16_t index,
+ struct mgmt_addr_info *addr,
const char *pin, size_t len)
{
struct mgmt_cp_pin_code_reply cp;
memset(&cp, 0, sizeof(cp));
- bacpy(&cp.bdaddr, bdaddr);
+ memcpy(&cp.addr, addr, sizeof(cp.addr));
cp.pin_len = len;
memcpy(cp.pin_code, pin, len);
printf("hci%u PIN Negative Reply successful\n", id);
}
-static int mgmt_pin_neg_reply(int mgmt_sk, uint16_t index, bdaddr_t *bdaddr)
+static int mgmt_pin_neg_reply(int mgmt_sk, uint16_t index,
+ struct mgmt_addr_info *addr)
{
struct mgmt_cp_pin_code_neg_reply cp;
memset(&cp, 0, sizeof(cp));
- bacpy(&cp.bdaddr, bdaddr);
+ memcpy(&cp.addr, addr, sizeof(cp.addr));
return mgmt_send_cmd(mgmt_sk, MGMT_OP_PIN_CODE_NEG_REPLY, index,
&cp, sizeof(cp), pin_neg_rsp, NULL);
if (monitor) {
char addr[18];
- ba2str(&ev->bdaddr, addr);
+ ba2str(&ev->addr.bdaddr, addr);
printf("hci%u %s request PIN\n", index, addr);
}
memset(pin, 0, sizeof(pin));
if (fgets(pin, sizeof(pin), stdin) == NULL || pin[0] == '\n')
- return mgmt_pin_neg_reply(mgmt_sk, index, &ev->bdaddr);
+ return mgmt_pin_neg_reply(mgmt_sk, index, &ev->addr);
pin_len = strlen(pin);
if (pin[pin_len - 1] == '\n') {
pin_len--;
}
- return mgmt_pin_reply(mgmt_sk, index, &ev->bdaddr, pin, pin_len);
+ return mgmt_pin_reply(mgmt_sk, index, &ev->addr, pin, pin_len);
}
static void confirm_rsp(int mgmt_sk, uint16_t op, uint16_t id, uint8_t status,
diff --git a/plugins/hciops.c b/plugins/hciops.c
index ee73c45..04802f4 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
return 0;
}
-static int hciops_confirm_name(int index, bdaddr_t *bdaddr,
+static int hciops_confirm_name(int index, bdaddr_t *bdaddr, addr_type_t type,
gboolean name_known)
{
struct dev_info *info = &devs[index];
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 5de0aa2..020c277 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
info = &controllers[index];
if (ev->store_hint)
- btd_event_link_key_notify(&info->bdaddr, &ev->key.bdaddr,
+ btd_event_link_key_notify(&info->bdaddr, &ev->key.addr.bdaddr,
ev->key.val, ev->key.type,
ev->key.pin_len);
- bonding_complete(info, &ev->key.bdaddr, 0);
+ bonding_complete(info, &ev->key.addr.bdaddr, 0);
}
static inline addr_type_t addr_type(uint8_t mgmt_addr_type)
hdr->index = htobs(index);
cp = (void *) &buf[sizeof(*hdr)];
- bacpy(&cp->bdaddr, bdaddr);
+ bacpy(&cp->addr.bdaddr, bdaddr);
+ cp->addr.type = MGMT_ADDR_BREDR;
buf_len = sizeof(*hdr) + sizeof(*cp);
} else {
hdr->index = htobs(index);
cp = (void *) &buf[sizeof(*hdr)];
- bacpy(&cp->bdaddr, bdaddr);
+ bacpy(&cp->addr.bdaddr, bdaddr);
+ cp->addr.type = MGMT_ADDR_BREDR;
cp->pin_len = pin_len;
memcpy(cp->pin_code, pin, pin_len);
return;
}
- ba2str(&ev->bdaddr, addr);
+ ba2str(&ev->addr.bdaddr, addr);
DBG("hci%u %s", index, addr);
info = &controllers[index];
- err = btd_event_request_pin(&info->bdaddr, &ev->bdaddr, ev->secure);
+ err = btd_event_request_pin(&info->bdaddr, &ev->addr.bdaddr,
+ ev->secure);
if (err < 0) {
error("btd_event_request_pin: %s", strerror(-err));
- mgmt_pincode_reply(index, &ev->bdaddr, NULL, 0);
+ mgmt_pincode_reply(index, &ev->addr.bdaddr, NULL, 0);
}
}
for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
struct link_key_info *info = l->data;
- bacpy(&key->bdaddr, &info->bdaddr);
+ bacpy(&key->addr.bdaddr, &info->bdaddr);
+ key->addr.type = MGMT_ADDR_BREDR;
key->type = info->type;
memcpy(key->val, info->key, 16);
key->pin_len = info->pin_len;
return 0;
}
-static int mgmt_confirm_name(int index, bdaddr_t *bdaddr, gboolean name_known)
+static int mgmt_confirm_name(int index, bdaddr_t *bdaddr, addr_type_t type,
+ gboolean name_known)
{
char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_confirm_name)];
struct mgmt_hdr *hdr = (void *) buf;
hdr->index = htobs(index);
hdr->len = htobs(sizeof(*cp));
- bacpy(&cp->bdaddr, bdaddr);
+ bacpy(&cp->addr.bdaddr, bdaddr);
+ cp->addr.type = mgmt_addr_type(type);
cp->name_known = name_known;
if (write(mgmt_sock, &buf, sizeof(buf)) < 0)
diff --git a/src/adapter.c b/src/adapter.c
index 36073ff..5742fd2 100644
--- a/src/adapter.c
+++ b/src/adapter.c
}
if (confirm_name)
- adapter_ops->confirm_name(adapter->dev_id, bdaddr, name_known);
+ adapter_ops->confirm_name(adapter->dev_id, bdaddr, type,
+ name_known);
alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
diff --git a/src/adapter.h b/src/adapter.h
index 6c015ef..c285172 100644
--- a/src/adapter.h
+++ b/src/adapter.h
int (*add_remote_oob_data) (int index, bdaddr_t *bdaddr, uint8_t *hash,
uint8_t *randomizer);
int (*remove_remote_oob_data) (int index, bdaddr_t *bdaddr);
- int (*confirm_name) (int index, bdaddr_t *bdaddr, gboolean name_known);
+ int (*confirm_name) (int index, bdaddr_t *bdaddr, addr_type_t type,
+ gboolean name_known);
int (*load_ltks) (int index, GSList *keys);
};