static int ble_hs_hci_evt_le_dir_adv_rpt(uint8_t subevent, uint8_t *data, int len) { struct ble_gap_disc_desc desc; uint8_t num_reports; int suboff; int off; int i; if (len < BLE_HCI_LE_ADV_DIRECT_RPT_LEN) { return BLE_HS_ECONTROLLER; } num_reports = data[1]; if (len != 2 + num_reports * BLE_HCI_LE_ADV_DIRECT_RPT_SUB_LEN) { return BLE_HS_ECONTROLLER; } /* Data fields not present in a direct advertising report. */ desc.data = NULL; desc.length_data = 0; for (i = 0; i < num_reports; i++) { suboff = 0; off = 2 + suboff * num_reports + i; desc.event_type = data[off]; suboff++; off = 2 + suboff * num_reports + i; desc.addr.type = data[off]; suboff++; off = 2 + suboff * num_reports + i * 6; memcpy(desc.addr.val, data + off, 6); suboff += 6; off = 2 + suboff * num_reports + i; desc.direct_addr.type = data[off]; suboff++; off = 2 + suboff * num_reports + i * 6; memcpy(desc.direct_addr.val, data + off, 6); suboff += 6; off = 2 + suboff * num_reports + i; desc.rssi = data[off]; suboff++; ble_gap_rx_adv_report(&desc); } return 0; }
static int ble_hs_hci_evt_le_adv_rpt(uint8_t subevent, uint8_t *data, int len) { struct ble_gap_disc_desc desc; uint8_t num_reports; int rssi_off; int data_off; int suboff; int off; int rc; int i; rc = ble_hs_hci_evt_le_adv_rpt_first_pass(data, len, &num_reports, &rssi_off); if (rc != 0) { return rc; } desc.direct_addr = *BLE_ADDR_ANY; data_off = 0; for (i = 0; i < num_reports; i++) { suboff = 0; off = 2 + suboff * num_reports + i; desc.event_type = data[off]; suboff++; off = 2 + suboff * num_reports + i; desc.addr.type = data[off]; suboff++; off = 2 + suboff * num_reports + i * 6; memcpy(desc.addr.val, data + off, 6); suboff += 6; off = 2 + suboff * num_reports + i; desc.length_data = data[off]; suboff++; off = 2 + suboff * num_reports + data_off; desc.data = data + off; data_off += desc.length_data; off = rssi_off + 1 * i; desc.rssi = data[off]; ble_gap_rx_adv_report(&desc); } return 0; }
static int host_hci_rx_le_adv_rpt(uint8_t subevent, uint8_t *data, int len) { struct ble_hs_adv adv; uint8_t num_reports; int rssi_off; int data_off; int off; int rc; int i; rc = host_hci_le_adv_rpt_first_pass(data, len, &num_reports, &rssi_off); if (rc != 0) { return rc; } data_off = 0; for (i = 0; i < num_reports; i++) { off = 2 + 0 * num_reports + i; adv.event_type = data[2 + 0 * num_reports + i]; off = 2 + 1 * num_reports + i; adv.addr_type = data[2 + 1 * num_reports + i]; off = 2 + 2 * num_reports + i * 6; memcpy(adv.addr, data + off, 6); off = 2 + 8 * num_reports + i; adv.length_data = data[off]; off = 2 + 9 * num_reports + data_off; adv.data = data + off; data_off += adv.length_data; off = rssi_off + 1 * i; adv.rssi = data[off]; ble_gap_rx_adv_report(&adv); } return 0; }