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;
}
Beispiel #3
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;
}