/********************************************************************* * @fn bindRemoveDev() * * @brief * * Remove all bind(s) entries associated to a device address (destination). * Updates binding table. * * @param Addr - address of device to be removed from Binding Table * * @return none */ void bindRemoveDev( zAddrType_t *Addr ) { uint16 idx; bindTableIndex_t x; if ( Addr->addrMode == AddrGroup ) { idx = Addr->addr.shortAddr; } else { idx = bindingAddrMgsHelperFind( Addr ); } if ( idx == INVALID_NODE_ADDR ) { return; } // Removes all the entries that match the destination Address/Index for ( x = 0; x < gNWK_MAX_BINDING_ENTRIES; x++ ) { if ( ( (Addr->addrMode == AddrGroup) && (BindingTable[x].dstGroupMode == DSTGROUPMODE_GROUP) && (BindingTable[x].dstIdx == idx) ) || ( (Addr->addrMode != AddrGroup) && (BindingTable[x].dstGroupMode == DSTGROUPMODE_ADDR) && (BindingTable[x].dstIdx == idx) ) ) { bindRemoveEntry( &BindingTable[x] ); } } // If this is the last Bind Entry for that idx then clear BINDING // user from Address Manager bindAddressClear( idx ); }
/********************************************************************* * @fn bindRemoveDev() * * @brief * * Remove all bind(s) entries associated to a device address (destination). * Updates binding table. * * @param Addr - address of device to be removed from Binding Table * * @return none */ void bindRemoveDev( zAddrType_t *Addr ) { uint16 idx; uint16 x; if ( Addr->addrMode == AddrGroup ) { idx = Addr->addr.shortAddr; } else { idx = bindingAddrMgsHelperFind( Addr ); } if ( idx == INVALID_NODE_ADDR ) { return; } // Removes all the entries that match the destination Address/Index for ( x = 0; x < gNWK_MAX_BINDING_ENTRIES; x++ ) { if ( ( (Addr->addrMode == AddrGroup) && (BindingTable[x].dstGroupMode == DSTGROUPMODE_GROUP) && (BindingTable[x].dstIdx == idx) ) || ( (Addr->addrMode != AddrGroup) && (BindingTable[x].dstGroupMode == DSTGROUPMODE_ADDR) && (BindingTable[x].dstIdx == idx) ) ) { bindRemoveEntry( &BindingTable[x] ); } } }
/********************************************************************* * @fn bindRemoveSrcDev() * * @brief * * Remove binds(s) associated to device address (source). * Updates binding table. * * @param srcAddr - address of device * @param ep - endpoint to remove, 0xFF is all endpoints * * @return none */ void bindRemoveSrcDev( uint8 ep ) { uint16 x; for ( x = 0; x < gNWK_MAX_BINDING_ENTRIES; x++ ) { if ( (ep == 0xFF) || (ep == BindingTable[x].srcEP) ) { bindRemoveEntry( &BindingTable[x] ); } } }
/********************************************************************* * @fn bindRemoveSrcDev() * * @brief * * Remove binds(s) associated to device address (source). * Updates binding table. * * @param ep - endpoint to remove, 0xFF is all endpoints * * @return none */ void bindRemoveSrcDev( uint8 ep ) { bindTableIndex_t x; for ( x = 0; x < gNWK_MAX_BINDING_ENTRIES; x++ ) { if ( (ep == 0xFF) || (ep == BindingTable[x].srcEP) ) { uint16 idx = BindingTable[x].dstIdx; bindRemoveEntry( &BindingTable[x] ); // If this is the last Bind Entry for that idx then clear BINDING // user from Address Manager bindAddressClear( idx ); } } }
/****************************************************************************** * @fn zb_BindDevice * * @brief The zb_BindDevice function establishes or removes a ‘binding’ * between two devices. Once bound, an application can send * messages to a device by referencing the commandId for the * binding. * * @param create - TRUE to create a binding, FALSE to remove a binding * commandId - The identifier of the binding * pDestination - The 64-bit IEEE address of the device to bind to * * @return The status of the bind operation is returned in the * zb_BindConfirm callback. */ void zb_BindDevice ( uint8 create, uint16 commandId, uint8 *pDestination ) { zAddrType_t destination; uint8 ret = ZB_ALREADY_IN_PROGRESS; if ( create ) { if (sapi_bindInProgress == 0xffff) { if ( pDestination ) { destination.addrMode = Addr64Bit; osal_cpyExtAddr( destination.addr.extAddr, pDestination ); ret = APSME_BindRequest( sapi_epDesc.endPoint, commandId, &destination, sapi_epDesc.endPoint ); if ( ret == ZSuccess ) { // Find nwk addr ZDP_NwkAddrReq(pDestination, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 ); osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 ); } } else { ret = ZB_INVALID_PARAMETER; destination.addrMode = Addr16Bit; destination.addr.shortAddr = NWK_BROADCAST_SHORTADDR; if ( ZDO_AnyClusterMatches( 1, &commandId, sapi_epDesc.simpleDesc->AppNumOutClusters, sapi_epDesc.simpleDesc->pAppOutClusterList ) ) { // Try to match with a device in the allow bind mode ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR, sapi_epDesc.simpleDesc->AppProfId, 1, &commandId, 0, (cId_t *)NULL, 0 ); } else if ( ZDO_AnyClusterMatches( 1, &commandId, sapi_epDesc.simpleDesc->AppNumInClusters, sapi_epDesc.simpleDesc->pAppInClusterList ) ) { ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR, sapi_epDesc.simpleDesc->AppProfId, 0, (cId_t *)NULL, 1, &commandId, 0 ); } if ( ret == ZB_SUCCESS ) { // Set a timer to make sure bind completes #if ( ZG_BUILD_RTR_TYPE ) osal_start_timerEx(sapi_TaskID, ZB_BIND_TIMER, AIB_MaxBindingTime); #else // AIB_MaxBindingTime is not defined for an End Device osal_start_timerEx(sapi_TaskID, ZB_BIND_TIMER, zgApsDefaultMaxBindingTime); #endif sapi_bindInProgress = commandId; return; // dont send cback event } } } SAPI_SendCback( SAPICB_BIND_CNF, ret, commandId ); } else { // Remove local bindings for the commandId BindingEntry_t *pBind; // Loop through bindings an remove any that match the cluster while ( pBind = bindFind( sapi_epDesc.simpleDesc->EndPoint, commandId, 0 ) ) { bindRemoveEntry(pBind); } osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 ); } return; }