/*----------------------------------------------------------------------------* * 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); }
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); } }