void
bletest_init_advertising(void)
{
    int rc;
    uint8_t adv_len;
    struct hci_adv_params adv;

    /* Just zero out advertising */
    memset(&adv, 0, sizeof(struct hci_adv_params));

    /* Set advertising parameters */
    adv.adv_type = BLETEST_CFG_ADV_TYPE;
    adv.adv_channel_map = 0x07;
    adv.adv_filter_policy = BLETEST_CFG_ADV_FILT_POLICY;
    adv.own_addr_type = BLE_HCI_ADV_OWN_ADDR_PUBLIC;
    adv.peer_addr_type = BLE_HCI_ADV_PEER_ADDR_PUBLIC;
    if ((adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) ||
        (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD)) {
        memcpy(adv.peer_addr, g_bletest_cur_peer_addr, BLE_DEV_ADDR_LEN);
        adv_len = 0;
    } else {
        adv_len = bletest_set_adv_data(&g_host_adv_data[0]);
    }

    console_printf("Trying to connect to %x.%x.%x.%x.%x.%x\n",
                   adv.peer_addr[0], adv.peer_addr[1], adv.peer_addr[2],
                   adv.peer_addr[3], adv.peer_addr[4], adv.peer_addr[5]);

    if (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) {
        adv.adv_itvl_min = 0;
        adv.adv_itvl_max = 0;
    } else {
        adv.adv_itvl_min = BLETEST_CFG_ADV_ITVL;
        adv.adv_itvl_max = BLETEST_CFG_ADV_ITVL; /* Advertising interval */
    }

    /* Set the advertising parameters */
    rc = host_hci_cmd_le_set_adv_params(&adv);
    assert(rc == 0);
    host_hci_outstanding_opcode = 0;

    /* Set advertising data */
    if (adv_len != 0) {
        rc = host_hci_cmd_le_set_adv_data(&g_host_adv_data[0], adv_len);
        assert(rc == 0);
        host_hci_outstanding_opcode = 0;

        /* Set scan response data */
        rc = host_hci_cmd_le_set_scan_rsp_data(&g_host_adv_data[0], adv_len);
        assert(rc == 0);
        host_hci_outstanding_opcode = 0;
    }
}
Exemple #2
0
void
bletest_init_advertising(uint8_t instance, int8_t txpwr)
{
    int rc;
    int set_peer_addr;
    uint8_t adv_len;
    uint8_t *addr;
    uint8_t rand_addr[BLE_DEV_ADDR_LEN];
    struct hci_multi_adv_params adv;

    /* Make sure it is a valid instance */
    assert(instance < BLE_LL_ADV_INSTANCES);

    /* Just zero out advertising */
    set_peer_addr = 0;
    memset(&adv, 0, sizeof(struct hci_multi_adv_params));

    /* If we are using a random address, we need to set it */
    adv.own_addr_type = BLETEST_CFG_ADV_OWN_ADDR_TYPE;
    if (adv.own_addr_type & 1) {
        memcpy(rand_addr, g_dev_addr, BLE_DEV_ADDR_LEN);
        rand_addr[5] |= 0xc0;
        if (BLETEST_CFG_MULTI_ADV_RANDOM_OWN == 1) {
            addr = rand_addr;
            memcpy(adv.own_addr, addr, BLE_DEV_ADDR_LEN);
        } else {
            rc = bletest_hci_le_set_multi_rand_addr(rand_addr, instance);
            assert(rc == 0);
            addr = rand_addr;
        }
    } else {
        addr = g_dev_addr;
    }

    /* Set advertising parameters */
    adv.adv_type = BLETEST_CFG_ADV_TYPE;
    adv.adv_channel_map = 0x07;
    adv.adv_filter_policy = BLETEST_CFG_ADV_FILT_POLICY;
    if ((adv.adv_filter_policy & 1) || (BLETEST_CFG_ADV_ADDR_RES_EN == 1)) {
        set_peer_addr = 1;
    }
    adv.peer_addr_type = BLETEST_CFG_ADV_PEER_ADDR_TYPE;
    if ((adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) ||
        (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD)) {
        set_peer_addr = 1;
        adv_len = 0;
    } else {
        adv_len = bletest_set_adv_data(&g_host_adv_data[0], addr);
    }

    /* Not allowed for multi-adv command */
    if (adv.own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) {
        assert(0);
    }

    if (set_peer_addr) {
        memcpy(adv.peer_addr, g_bletest_cur_peer_addr, BLE_DEV_ADDR_LEN);
        if (adv.peer_addr_type == BLE_HCI_ADV_PEER_ADDR_RANDOM) {
            adv.peer_addr[5] |= 0xc0;
        }
    }

    console_printf("Trying to connect to %x.%x.%x.%x.%x.%x\n",
                   adv.peer_addr[0], adv.peer_addr[1], adv.peer_addr[2],
                   adv.peer_addr[3], adv.peer_addr[4], adv.peer_addr[5]);

    if (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) {
        adv.adv_itvl_min = 0;
        adv.adv_itvl_max = 0;
    } else {
        adv.adv_itvl_min = BLETEST_CFG_ADV_ITVL;
        adv.adv_itvl_max = BLETEST_CFG_ADV_ITVL; /* Advertising interval */
    }

    adv.adv_tx_pwr = txpwr;

    /* Set the advertising parameters */
    rc = bletest_hci_le_set_multi_adv_params(&adv, instance);
    assert(rc == 0);

    /* Set advertising data */
    if (adv_len != 0) {
        rc = bletest_hci_le_set_multi_adv_data(&g_host_adv_data[0], adv_len,
                                               instance);
        assert(rc == 0);

        /* Set scan response data */
        rc = bletest_hci_le_set_multi_scan_rsp_data(&g_host_adv_data[0],adv_len,
                                                    instance);
        assert(rc == 0);
    }
}
Exemple #3
0
void
bletest_init_advertising(void)
{
    int rc;
    int set_peer_addr;
    uint8_t adv_len;
    uint8_t *addr;
    uint8_t rand_addr[BLE_DEV_ADDR_LEN];
    struct hci_adv_params adv;

    /* Just zero out advertising */
    set_peer_addr = 0;
    memset(&adv, 0, sizeof(struct hci_adv_params));

    /* If we are using a random address, we need to set it */
    adv.own_addr_type = BLETEST_CFG_ADV_OWN_ADDR_TYPE;
    if (adv.own_addr_type & 1) {
        memcpy(rand_addr, g_dev_addr, BLE_DEV_ADDR_LEN);
        rand_addr[5] |= 0xc0;
        rc = bletest_hci_le_set_rand_addr(rand_addr);
        assert(rc == 0);
        addr = rand_addr;
    } else {
        addr = g_dev_addr;
    }

    /* Set advertising parameters */
    adv.adv_type = BLETEST_CFG_ADV_TYPE;
    adv.adv_channel_map = 0x07;
    adv.adv_filter_policy = BLETEST_CFG_ADV_FILT_POLICY;
    if ((adv.adv_filter_policy & 1) || (BLETEST_CFG_ADV_ADDR_RES_EN == 1)) {
        set_peer_addr = 1;
    }
    adv.peer_addr_type = BLETEST_CFG_ADV_PEER_ADDR_TYPE;
    if ((adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) ||
        (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD)) {
        set_peer_addr = 1;
        adv_len = 0;
    } else {
        adv_len = bletest_set_adv_data(&g_host_adv_data[0], addr);
    }

    if (adv.own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) {
        set_peer_addr = 1;
    }

    if (set_peer_addr) {
        memcpy(adv.peer_addr, g_bletest_cur_peer_addr, BLE_DEV_ADDR_LEN);
        if (adv.peer_addr_type == BLE_HCI_ADV_PEER_ADDR_RANDOM) {
            adv.peer_addr[5] |= 0xc0;
        }
    }

    console_printf("Trying to connect to %x.%x.%x.%x.%x.%x\n",
                   adv.peer_addr[0], adv.peer_addr[1], adv.peer_addr[2],
                   adv.peer_addr[3], adv.peer_addr[4], adv.peer_addr[5]);

    if (adv.adv_type == BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD) {
        adv.adv_itvl_min = 0;
        adv.adv_itvl_max = 0;
    } else {
        adv.adv_itvl_min = BLETEST_CFG_ADV_ITVL;
        adv.adv_itvl_max = BLETEST_CFG_ADV_ITVL; /* Advertising interval */
    }

    /* Set the advertising parameters */
    rc = bletest_hci_le_set_adv_params(&adv);
    assert(rc == 0);

#if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1)
    if ((adv.own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) ||
        (BLETEST_CFG_ADV_ADDR_RES_EN == 1)) {
        rc = bletest_hci_le_add_resolv_list(g_bletest_adv_irk,
                                            g_bletest_init_irk,
                                            adv.peer_addr,
                                            adv.peer_addr_type);
        assert(rc == 0);

        rc = bletest_hci_le_enable_resolv_list(1);
        assert(rc == 0);
    }
#endif

    /* Set advertising data */
    if (adv_len != 0) {
        rc = bletest_hci_le_set_adv_data(&g_host_adv_data[0], adv_len);
        assert(rc == 0);

        /* Set scan response data */
        rc = bletest_hci_le_set_scan_rsp_data(&g_host_adv_data[0], adv_len);
        assert(rc == 0);
    }
}
Exemple #4
0
void
bletest_init_adv_instances(void)
{
    uint8_t i;
    int rc;
    uint8_t *addr;
    uint8_t adv_len;
    uint8_t inst_allowed;
    uint8_t rand_addr[BLE_DEV_ADDR_LEN];
    struct hci_multi_adv_params adv;

    inst_allowed = MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES);
    if (inst_allowed > BLETEST_CFG_ADV_TEST_INSTANCES) {
        inst_allowed = BLETEST_CFG_ADV_TEST_INSTANCES;
    }

    /* Start up all the instances */
    for (i = 1; i <= inst_allowed; ++i) {
        memset(&adv, 0, sizeof(struct hci_multi_adv_params));

        adv.own_addr_type = bletest_multi_adv_instances[i-1].adv_own_addr_type;
        if (adv.own_addr_type == BLE_HCI_ADV_OWN_ADDR_PUBLIC) {
            addr = g_dev_addr;
        } else {
            memcpy(rand_addr, g_dev_addr, BLE_DEV_ADDR_LEN);
            rand_addr[5] |= 0xc0;
            rand_addr[0] = i;
            /*
             * NOTE: we overload own address type with a special case
             * to denote if we use own address or call to set multi random
             * address.
             */
            if (adv.own_addr_type == BLE_HCI_ADV_OWN_ADDR_RANDOM) {
                rc = bletest_hci_le_set_multi_rand_addr(rand_addr, i);
                assert(rc == 0);
                addr = rand_addr;
            } else {
                adv.own_addr_type = BLE_HCI_ADV_OWN_ADDR_RANDOM;
                addr = rand_addr;
                memcpy(adv.own_addr, addr, BLE_DEV_ADDR_LEN);
            }
        }

        adv.adv_type = bletest_multi_adv_instances[i - 1].adv_type;
        adv.adv_channel_map = 0x07;
        adv.adv_filter_policy = BLE_HCI_ADV_FILT_NONE;
        adv.peer_addr_type = BLE_HCI_ADV_PEER_ADDR_PUBLIC;
        adv_len = bletest_set_adv_data(&g_host_adv_data[0], addr);

        adv.adv_itvl_min = bletest_multi_adv_instances[i - 1].adv_itvl;
        adv.adv_itvl_max = bletest_multi_adv_instances[i - 1].adv_itvl;
        adv.adv_tx_pwr = -1 * i;

        /* Set the advertising parameters */
        rc = bletest_hci_le_set_multi_adv_params(&adv, i);
        assert(rc == 0);

        /* Set advertising data */
        if (adv_len != 0) {
            rc = bletest_hci_le_set_multi_adv_data(&g_host_adv_data[0], adv_len,
                                                   i);
            assert(rc == 0);

            /* Set scan response data */
            rc = bletest_hci_le_set_multi_scan_rsp_data(&g_host_adv_data[0],
                                                        adv_len, i);
            assert(rc == 0);
        }

        /* Set the advertising parameters */
        rc = bletest_hci_le_set_multi_adv_enable(1, i);
        assert(rc == 0);
    }
}