unsigned Pager::pageAll() { // Traverse the full list and page all IDs. // Remove expired IDs. // Return the number of IDs paged. // This is a linear time operation. mLock.lock(); // Clear expired entries. PagingEntryList::iterator lp = mPageIDs.begin(); while (lp != mPageIDs.end()) { if (!lp->expired()) ++lp; else { // DO NOT remove the transaction entry here. // It may be in use in an active call. LOG(INFO) << "erasing " << lp->ID(); lp=mPageIDs.erase(lp); } } LOG(INFO) << "paging " << mPageIDs.size() << " mobile(s)"; // Page remaining entries, two at a time if possible. // These PCH send operations are non-blocking. lp = mPageIDs.begin(); while (lp != mPageIDs.end()) { // FIXME -- This completely ignores the paging groups. // HACK -- So we send every page twice. // That will probably mean a different Pager for each subchannel. // See GSM 04.08 10.5.2.11 and GSM 05.02 6.5.2. const L3MobileIdentity& id1 = lp->ID(); ChannelType type1 = lp->type(); ++lp; if (lp==mPageIDs.end()) { // Just one ID left? LOG(DEBUG) << "paging " << id1; gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); break; } // Page by pairs when possible. const L3MobileIdentity& id2 = lp->ID(); ChannelType type2 = lp->type(); ++lp; LOG(DEBUG) << "paging " << id1 << " and " << id2; gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1,id2,type2)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1,id2,type2)); } mLock.unlock(); return mPageIDs.size(); }
unsigned Pager::pageAll() { // Traverse the full list and page all IDs. // Remove expired IDs. // Return the number of IDs paged. // This is a linear time operation. mLock.lock(); // Clear expired entries. PagingEntryList::iterator lp = mPageIDs.begin(); while (lp != mPageIDs.end()) { if (!lp->expired()) ++lp; else { // DO NOT remove the transaction entry here. // It may be in use in an active call. LOG(INFO) << "erasing " << lp->ID(); lp=mPageIDs.erase(lp); } } LOG(INFO) << "paging " << mPageIDs.size() << " mobile(s)"; // Page remaining entries, two at a time if possible. // These PCH send operations are non-blocking. lp = mPageIDs.begin(); while (lp != mPageIDs.end()) { // FIXME -- This completely ignores the paging groups. // HACK -- So we send every page twice. // That will probably mean a different Pager for each subchannel. // See GSM 04.08 10.5.2.11 and GSM 05.02 6.5.2. //const FuzzingL3MobileIdentity &FuzzingID1=lp->FuzzingID(); const L3MobileIdentity& id1 = lp->ID(); ChannelType type1 = lp->type(); ++lp; if(gFuzzingControl.state()==L3Fuzzing&&gFuzzingControl.PD()==GSM::L3MobilityManagementPD&&gFuzzingControl.MTI()==L3MMMessage::LocationUpdatingAccept){ LOG(INFO)<<"Sending Paging Request for Location Updating Accept Fuzzing: "<<id1; COUT("Sending SendingPaging Request for Location Updating Accept Fuzzing: "<<id1); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); removeID(id1); break; } if(gFuzzingControl.state()==L3Fuzzing&&gFuzzingControl.PD()==GSM::L3MobilityManagementPD&&gFuzzingControl.MTI()==L3MMMessage::MMInformation){ LOG(INFO)<<"SendingPaging Request for Fuzzing L3MMInformation "<<id1; COUT("Sending SendingPaging Request for L3MMInformation "<<id1); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); removeID(id1); break; } if(gFuzzingControl.state()==TestPhoneConnect){ LOG(INFO)<<"SendingPaging Request for testing Phone connection state"<<id1; COUT("Sending SendingPaging Request for testing Phone connection state "<<id1); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); removeID(id1); break; } if (lp==mPageIDs.end()) { // Just one ID left? LOG(INFO) << "L3PagingRequestType1 is "<<L3PagingRequestType1(id1,type1); LOG(INFO) << "paging " << id1; gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1)); break; } // Page by pairs when possible. const L3MobileIdentity& id2 = lp->ID(); ChannelType type2 = lp->type(); ++lp; LOG(INFO) << "paging " << id1 << " and " << id2; gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1,id2,type2)); gBTS.getPCH(0)->send(L3PagingRequestType1(id1,type1,id2,type2)); } mLock.unlock(); return mPageIDs.size(); }