void DownlinkPacketScheduler::UpdateAverageTransmissionRate (void) { RrcEntity *rrc = GetMacEntity ()->GetDevice ()->GetProtocolStack ()->GetRrcEntity (); RrcEntity::RadioBearersContainer* bearers = rrc->GetRadioBearerContainer (); for (std::vector<RadioBearer* >::iterator it = bearers->begin (); it != bearers->end (); it++) { RadioBearer *bearer = (*it); bearer->UpdateAverageTransmissionRate (); } }
void DownlinkPacketScheduler::SelectFlowsToSchedule () { #ifdef SCHEDULER_DEBUG std::cout << "\t Select Flows to schedule" << std::endl; #endif ClearFlowsToSchedule (); RrcEntity *rrc = GetMacEntity ()->GetDevice ()->GetProtocolStack ()->GetRrcEntity (); RrcEntity::RadioBearersContainer* bearers = rrc->GetRadioBearerContainer (); for (std::vector<RadioBearer* >::iterator it = bearers->begin (); it != bearers->end (); it++) { //SELECT FLOWS TO SCHEDULE RadioBearer *bearer = (*it); if (bearer->HasPackets () && bearer->GetDestination ()->GetNodeState () == NetworkNode::STATE_ACTIVE) { //compute data to transmit int dataToTransmit; if (bearer->GetApplication ()->GetApplicationType () == Application::APPLICATION_TYPE_INFINITE_BUFFER) { dataToTransmit = 100000000; } else { dataToTransmit = bearer->GetQueueSize (); } //compute spectral efficiency ENodeB *enb = (ENodeB*) GetMacEntity ()->GetDevice (); ENodeB::UserEquipmentRecord *ueRecord = enb->GetUserEquipmentRecord (bearer->GetDestination ()->GetIDNetworkNode ()); std::vector<double> spectralEfficiency; std::vector<int> cqiFeedbacks = ueRecord->GetCQI (); int numberOfCqi = cqiFeedbacks.size (); for (int i = 0; i < numberOfCqi; i++) { double sEff = GetMacEntity ()->GetAmcModule ()->GetEfficiencyFromCQI (cqiFeedbacks.at (i)); spectralEfficiency.push_back (sEff); } //create flow to scheduler record InsertFlowToSchedule(bearer, dataToTransmit, spectralEfficiency, cqiFeedbacks); } else {} } }
void PacketScheduler::CheckForDLDropPackets () { RrcEntity *rrc = GetMacEntity ()->GetDevice ()->GetProtocolStack ()->GetRrcEntity (); RrcEntity::RadioBearersContainer* bearers = rrc->GetRadioBearerContainer (); for (std::vector<RadioBearer* >::iterator it = bearers->begin (); it != bearers->end (); it++) { //delete packets from queue (*it)->GetMacQueue ()->CheckForDropPackets ( (*it)->GetQoSParameters ()->GetMaxDelay (), (*it)->GetApplication ()->GetApplicationID ()); //delete fragment waiting in AM RLC entity if ((*it)->GetRlcEntity()->GetRlcModel() == RlcEntity::AM_RLC_MODE) { AmRlcEntity* amRlc = (AmRlcEntity*) (*it)->GetRlcEntity(); amRlc->CheckForDropPackets ( (*it)->GetQoSParameters ()->GetMaxDelay (), (*it)->GetApplication ()->GetApplicationID ()); } } }