Exemple #1
0
/*----------------------------------------------------------------------------*
 *  NAME
 *      appSetRandomAddress
 *
 *  DESCRIPTION
 *      This function generates a non-resolvable private address and sets it
 *      to the firmware.
 *
 *  RETURNS
 *      Nothing.
 *
 *----------------------------------------------------------------------------*/
static void appSetRandomAddress(void)
{
    BD_ADDR_T addr;

    /* "completely" random MAC addresses by default: */
    for(;;)
    {
        uint32 now = TimeGet32();
        /* Random32() is just two of them, no use */
        uint32 rnd = Random16();
        addr.uap = 0xff & (rnd ^ now);
        /* No sub-part may be zero or all-1s */
        if ( 0 == addr.uap || 0xff == addr.uap ) continue;
        addr.lap = 0xffffff & ((now >> 8) ^ (73 * rnd));
        if ( 0 == addr.lap || 0xffffff == addr.lap ) continue;
        addr.nap = 0x3fff & rnd;
        if ( 0 == addr.nap || 0x3fff == addr.nap ) continue;
        break;
    }

    /* Set it to actually be an acceptable random address */
    addr.nap &= ~BD_ADDR_NAP_RANDOM_TYPE_MASK;
    addr.nap |=  BD_ADDR_NAP_RANDOM_TYPE_NONRESOLV;
    GapSetRandomAddress(&addr);
}
Exemple #2
0
extern void GattStartAdverts(bool fast_connection, gap_mode_connect connect_mode)
{
    uint16 connect_flags = L2CAP_CONNECTION_SLAVE_UNDIRECTED | 
                          L2CAP_OWN_ADDR_TYPE_PUBLIC;

    /* Set UCID to INVALID_UCID */
    g_btcar_data.st_ucid = GATT_INVALID_UCID;

    /* Set advertisement parameters */
    gattSetAdvertParams(fast_connection, connect_mode);

    if(g_btcar_data.bonded && 
        !IsAddressResolvableRandom(&g_btcar_data.bonded_bd_addr) &&
        !IsAddressNonResolvableRandom(&g_btcar_data.bonded_bd_addr))
    {

        if(connect_mode == gap_mode_connect_directed)
        {
            connect_flags = L2CAP_CONNECTION_SLAVE_DIRECTED |
                            L2CAP_OWN_ADDR_TYPE_PUBLIC |
                            L2CAP_PEER_ADDR_TYPE_PUBLIC;
        }
        else
        {
            /* When the device is bonded, set the advertising filter policy to 
             * "process scan and connection requests only from devices in white 
             * list"
             */
            connect_flags = L2CAP_CONNECTION_SLAVE_WHITELIST | 
                               L2CAP_OWN_ADDR_TYPE_PUBLIC;
        }
    }

#ifdef __GAP_PRIVACY_SUPPORT__

    /*Check if privacy enabled */
    if(IsGapPeripheralPrivacyEnabled())
    {
        if(connect_mode == gap_mode_connect_directed)
        {
            /* Set advAddress to reconnection address. */
            GapSetRandomAddress(GapGetReconnectionAddress());

            connect_flags = L2CAP_CONNECTION_SLAVE_DIRECTED | 
                            L2CAP_OWN_ADDR_TYPE_RANDOM | 
                            L2CAP_PEER_ADDR_TYPE_RANDOM;
        }
        else
        {
            /* Generate Resolvable random address and use it as advAddress. */
            SMPrivacyRegenerateAddress(NULL);

            if(g_btcar_data.bonded_bd_addr.type == L2CA_RANDOM_ADDR_TYPE)
            {
                /* Change to random address */
                connect_flags = L2CAP_CONNECTION_SLAVE_UNDIRECTED |
                                 L2CAP_OWN_ADDR_TYPE_RANDOM | 
                                 L2CAP_PEER_ADDR_TYPE_RANDOM;
            }
            else
            {
                            /* Change to random address */
                connect_flags = L2CAP_CONNECTION_SLAVE_UNDIRECTED |
                                 L2CAP_OWN_ADDR_TYPE_RANDOM | 
                                 L2CAP_PEER_ADDR_TYPE_PUBLIC;
            }
        }

    }

#endif /* __GAP_PRIVACY_SUPPORT__ */

    /* Start GATT connection in Slave role */
    GattConnectReq(NULL, connect_flags);

     /* Start advertisement timer */
    if(g_btcar_data.advert_timer_value)
    {
        TimerDelete(g_btcar_data.app_tid);

        /* Start advertisement timer  */
        g_btcar_data.app_tid = TimerCreate(g_btcar_data.advert_timer_value, TRUE, 
                                        gattAdvertTimerHandler);
    }
}