23#include "ns3/simulator.h" 
   24#include "ns3/uinteger.h" 
   66                            .SetGroupName(
"Wimax")
 
 
   88    if (randNr % 5 == 0 || 
GetBs()->GetNrDcdSent() == 0)
 
   94    if (randNr % 5 == 0 || 
GetBs()->GetNrUcdSent() == 0)
 
  123    if (timeSinceLastDcd > 
GetBs()->GetDcdInterval())
 
  129    if (timeSinceLastUcd > 
GetBs()->GetUcdInterval())
 
 
  139    return GetBs()->GetNrDlSymbols() * 
GetBs()->GetPhy()->GetPsPerSymbol() + 
GetBs()->GetTtg();
 
 
  151    symbolsToAllocation += allocationSize;
 
  152    availableSymbols -= allocationSize;
 
 
  161    bool allocationForDsa = 
false;
 
  172    std::vector<SSRecord*>* ssRecords = 
GetBs()->GetSSManager()->GetSSRecords();
 
  173    NS_LOG_INFO(
"UL Scheduler start, availableSymbols = " << availableSymbols);
 
  175    for (
auto iter = ssRecords->begin(); iter != ssRecords->end(); ++iter)
 
  192            allocationSize = 
GetBs()->GetRangReqOppSize();
 
  195            if (availableSymbols >= allocationSize)
 
  209            ulMapIe.
SetUiuc(
GetBs()->GetBurstProfileManager()->GetBurstProfile(
 
  219                if (!allocationForDsa)
 
  222                        GetBs()->GetPhy()->GetNrSymbols(
sizeof(
DsaReq), modulationType);
 
  223                    if (availableSymbols >= allocationSize)
 
  229                        allocationForDsa = 
true;
 
  252                if (availableSymbols)
 
  262                if (availableSymbols)
 
  272                if (availableSymbols)
 
  288    if (availableSymbols)
 
  294    if (availableSymbols)
 
  296        for (
auto iter = ssRecords->begin(); iter != ssRecords->end(); ++iter)
 
  311                ulMapIe.
SetUiuc(
GetBs()->GetBurstProfileManager()->GetBurstProfile(
 
  325                if (availableSymbols)
 
  346    GetBs()->GetBandwidthManager()->SetSubframeRatio();
 
 
  358    uint8_t uiuc = ulMapIe.
GetUiuc(); 
 
  359    std::vector<ServiceFlow*> serviceFlows = ssRecord->
GetServiceFlows(schedulingType);
 
  361    for (
auto iter = serviceFlows.begin(); iter != serviceFlows.end(); ++iter)
 
  371            GetBs()->GetBandwidthManager()->CalculateAllocationSize(ssRecord, serviceFlow);
 
  381                if (bps < serviceFlow->GetMinReservedTrafficRate())
 
  395        if (availableSymbols < allocationSize)
 
  400        if (allocationSize > 0)
 
  417            NS_LOG_DEBUG(
"BS uplink scheduler, UGS allocation, size: " << allocationSize
 
  423                                                 << 
" unicast poll, size: " << allocationSize
 
  424                                                 << 
" symbols, modulation: BPSK 1/2");
 
  428                               << 
", SFID: " << serviceFlow->
GetSfid());
 
 
  443    std::vector<ServiceFlow*> serviceFlows = ssRecord->
GetServiceFlows(schedulingType);
 
  445    for (
auto iter = serviceFlows.begin(); iter != serviceFlows.end(); ++iter)
 
 
  469    uint16_t sduSize = 0;
 
  475    if (requiredBandwidth > 0)
 
  480            allocSizeBytes = sduSize;
 
  481            allocSizeSymbols = 
GetBs()->GetPhy()->GetNrSymbols(sduSize, modulationType);
 
  485            allocSizeBytes = requiredBandwidth;
 
  486            allocSizeSymbols = 
GetBs()->GetPhy()->GetNrSymbols(requiredBandwidth, modulationType);
 
  489        if (availableSymbols >= allocSizeSymbols)
 
  493                         << 
" allocation, size: " << allocSizeSymbols << 
" symbols" 
  495                         << 
", SFID: " << serviceFlow->
GetSfid()
 
 
  521    NS_LOG_INFO(
"\t\tavailableSymbols = " << availableSymbols);
 
  528    int nbAllocation = 0;
 
  533    std::vector<SSRecord*>* ssRecords = 
GetBs()->GetSSManager()->GetSSRecords();
 
  535    for (
auto iter = ssRecords->begin(); iter != ssRecords->end(); ++iter)
 
  549            ulMapIe.
SetUiuc(
GetBs()->GetBurstProfileManager()->GetBurstProfile(
 
  553            std::vector<ServiceFlow*> serviceFlows =
 
  555            for (
auto iter2 = serviceFlows.begin(); iter2 != serviceFlows.end(); ++iter2)
 
  557                record_[nbAllocation] = (*iter2)->GetRecord();
 
  561                if (requiredBandwidth > 0)
 
  563                    modulationType_[nbAllocation] = modulationType;
 
  564                    ulMapIe_[nbAllocation] = ulMapIe;
 
  565                    allocSizeBytes = requiredBandwidth;
 
  566                    allocSizeSymbols_[nbAllocation] =
 
  567                        GetBs()->GetPhy()->GetNrSymbols(allocSizeBytes,
 
  568                                                        modulationType_[nbAllocation]);
 
  569                    totAllocSizeSymbols += allocSizeSymbols_[nbAllocation];
 
  572                        "\t\tUL Scheduler for CID = " << (*iter2)->GetConnection()->GetCid());
 
  574                                << record_[nbAllocation]->GetRequestedBandwidth()
 
  575                                << 
", allocSizeSymbols = " << allocSizeSymbols_[nbAllocation]
 
  576                                << 
", modulationType = " << modulationType_[nbAllocation]);
 
  584    NS_LOG_INFO(
"\t\ttotAllocSizeSymbols = " << totAllocSizeSymbols);
 
  587    while (totAllocSizeSymbols > availableSymbols)
 
  589        NS_LOG_INFO(
"\tUL Channel Saturation: totAllocSizeSymbols > availableSymbols");
 
  590        double delta = 
double(availableSymbols) / 
double(totAllocSizeSymbols);
 
  592        totAllocSizeSymbols = 0;
 
  593        for (
int i = 0; i < nbAllocation; i++)
 
  595            NS_LOG_INFO(
"\t\tprevious allocSizeSymbols_[" << i << 
"] = " << allocSizeSymbols_[i]);
 
  596            allocSizeSymbols_[i] = (
uint32_t)std::floor(allocSizeSymbols_[i] * delta);
 
  597            totAllocSizeSymbols += allocSizeSymbols_[i];
 
  598            NS_LOG_INFO(
"\t\tnew allocSizeSymbols_[" << i << 
"] = " << allocSizeSymbols_[i]);
 
  600        NS_LOG_INFO(
"\t\ttotAllocSizeSymbols = " << totAllocSizeSymbols);
 
  604    for (
int i = 0; i < nbAllocation; i++)
 
  607                            allocSizeSymbols_[i],
 
  610        allocSizeBytes = 
GetBs()->GetPhy()->GetNrBytes(allocSizeSymbols_[i], modulationType_[i]);
 
  611        NS_LOG_INFO(
"\t\tUpdateGrantedBandwidth for " << i << 
" = " << allocSizeBytes);
 
  612        if (record_[i]->GetRequestedBandwidth() < allocSizeBytes)
 
 
  637    if (timeSinceLastIrInterval + 
GetBs()->GetPhy()->GetFrameDuration() >
 
  638            GetBs()->GetInitialRangingInterval() &&
 
  639        availableSymbols >= allocationSize)
 
  643        ulMapIeIr.
SetCid(
GetBs()->GetBroadcastConnection()->GetCid());
 
  647        NS_LOG_DEBUG(
"BS uplink scheduler, initial ranging allocation, size: " 
  648                     << allocationSize << 
" symbols, modulation: BPSK 1/2");
 
  653            GetBs()->MarkRangingOppStart(
 
  655                Seconds(symbolsToAllocation * 
GetBs()->GetSymbolDuration().GetSeconds()) +
 
  657                        GetBs()->GetSymbolDuration().GetSeconds()));
 
 
  668    uint8_t delayNrFrames = 1;
 
  672        (
uint32_t((
double)(bitsPerSecond)*
GetBs()->GetPhy()->GetFrameDuration().GetSeconds())) / 8;
 
  673    uint32_t frameDurationMSec = 
GetBs()->GetPhy()->GetFrameDuration().GetMilliSeconds();
 
  686        uint32_t grantSize = 
GetBs()->GetPhy()->GetNrSymbols(bytesPerFrame, modulation);
 
  691        if (toleratedJitter > frameDurationMSec)
 
  693            delayNrFrames = (uint8_t)(toleratedJitter / frameDurationMSec);
 
  696        uint16_t interval = delayNrFrames * frameDurationMSec;
 
  701        if (serviceFlow->
GetSduSize() > bytesPerFrame)
 
  703            delayNrFrames = (uint8_t)(serviceFlow->
GetSduSize() / bytesPerFrame);
 
  706        uint16_t interval = delayNrFrames * frameDurationMSec;
 
 
This class implements the bandwidth-request mac Header as described by IEEE Standard for Local and me...
static Cid InitialRanging()
This class implements the DSA-REQ message described by "IEEE Standard forLocal and metropolitan area ...
This class implements the UL-MAP_IE message as described by "IEEE Standard forLocal and metropolitan ...
void SetStartTime(uint16_t startTime)
Set start time.
uint8_t GetUiuc() const
Get UIUC.
void SetDuration(uint16_t duration)
Set duration.
void SetCid(const Cid &cid)
Set CID.
void SetUiuc(uint8_t uiuc)
Set UIUC.
Smart pointer class similar to boost::intrusive_ptr.
This class is used by the base station to store some information related to subscriber station in the...
Cid GetBasicCid() const
Get basic CID.
WimaxNetDevice::RangingStatus GetRangingStatus() const
Get ranging status.
bool GetPollForRanging() const
Get poll for ranging.
std::vector< ServiceFlow * > GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const
Get service flows.
bool GetAreServiceFlowsAllocated() const
Check if service flows are allocated.
bool GetIsBroadcastSS() const
Get is broadcast SS.
WimaxPhy::ModulationType GetModulationType() const
Get modulation type.
This class implements service flows as described by the IEEE-802.16 standard.
uint32_t GetSfid() const
Get SFID.
ServiceFlow::SchedulingType GetSchedulingType() const
Get scheduling type.
SchedulingType
section 11.13.11 Service flow scheduling type, page 701
char * GetSchedulingTypeStr() const
Get scheduling type string.
uint32_t GetMinReservedTrafficRate() const
Get minimum reserved traffic rate.
uint8_t GetSduSize() const
Get SDU size.
WimaxPhy::ModulationType GetModulation() const
Get modulation.
void SetUnsolicitedGrantInterval(uint16_t unsolicitedGrantInterval)
Set unsolicited grant interval.
ServiceFlowRecord * GetRecord() const
Get service flow record.
void SetUnsolicitedPollingInterval(uint16_t unsolicitedPollingInterval)
Set unsolicited polling interval.
bool GetIsMulticast() const
Get is multicast.
uint32_t GetToleratedJitter() const
Get tolerated jitter.
Ptr< WimaxConnection > GetConnection() const
Can return a null connection is this service flow has not been associated yet to a connection.
this class implements a structure to manage some parameters and statistics related to a service flow
Time GetGrantTimeStamp() const
uint32_t GetRequestedBandwidth() const
void SetRequestedBandwidth(uint32_t requestedBandwidth)
set the requested bandwidth
void SetGrantSize(uint32_t grantSize)
Set the grant size (only for UGS service flows)
uint32_t GetGrantedBandwidth() const
void SetBwSinceLastExpiry(uint32_t bwSinceLastExpiry)
set BW since last expiry
void UpdateGrantedBandwidth(uint32_t grantedBandwidth)
update the granted bandwidth
uint32_t GetBwSinceLastExpiry() const
void SetGrantTimeStamp(Time grantTimeStamp)
Set the grant time stamp.
void SetGrantedBandwidth(uint32_t grantedBandwidth)
set the granted bandwidth
static Time Now()
Return the current simulation virtual time.
Simulation virtual time values and global simulation resolution.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Virtual class for uplink scheduler.
virtual void SetUcdTimeStamp(Time ucdTimeStamp)
Set UCD timestamp.
virtual void SetDcdTimeStamp(Time dcdTimeStamp)
Set DCD timestamp.
virtual void SetNrIrOppsAllocated(uint8_t nrIrOppsAllocated)
Set the number of IR opps allocated.
virtual void SetBs(Ptr< BaseStationNetDevice > bs)
Set base station device.
virtual void SetIsIrIntrvlAllocated(bool isIrIntrvlAllocated)
Set if the IR interval is allocated.
virtual uint8_t GetNrIrOppsAllocated() const
virtual void SetIsInvIrIntrvlAllocated(bool isInvIrIntrvlAllocated)
Set if the Inv IR interval is allocated.
virtual Time GetTimeStampIrInterval()
virtual Time GetDcdTimeStamp() const
virtual void SetTimeStampIrInterval(Time timeStampIrInterval)
Set timestamp IR interval.
virtual Ptr< BaseStationNetDevice > GetBs()
virtual Time GetUcdTimeStamp() const
This class implements a simple uplink scheduler for rtPS flows.
void AddUplinkAllocation(OfdmUlMapIe &ulMapIe, const uint32_t &allocationSize, uint32_t &symbolsToAllocation, uint32_t &availableSymbols) override
Add Uplink Allocation function.
void ProcessBandwidthRequest(const BandwidthRequestHeader &bwRequestHdr) override
Process bandwidth request function.
std::list< OfdmUlMapIe > m_uplinkAllocations
uplink allocations
void GetChannelDescriptorsToUpdate(bool &updateDcd, bool &updateUcd, bool &sendDcd, bool &sendUcd) override
Determines if channel descriptors sent in the current frame are required to be updated.
void AllocateInitialRangingInterval(uint32_t &symbolsToAllocation, uint32_t &availableSymbols) override
Allocate Initial Ranging Interval function.
~UplinkSchedulerRtps() override
std::list< OfdmUlMapIe > GetUplinkAllocations() const override
Get uplink allocations.
static TypeId GetTypeId()
Get the type ID.
void ServiceUnsolicitedGrants(const SSRecord *ssRecord, ServiceFlow::SchedulingType schedulingType, OfdmUlMapIe &ulMapIe, const WimaxPhy::ModulationType modulationType, uint32_t &symbolsToAllocation, uint32_t &availableSymbols) override
Service Unsolicited Grants function.
uint32_t CalculateAllocationStartTime() override
Calculate allocation start time function.
void InitOnce() override
Init once function.
void SetupServiceFlow(SSRecord *ssRecord, ServiceFlow *serviceFlow) override
Setup service flow function.
void OnSetRequestedBandwidth(ServiceFlowRecord *sfr) override
Set requested bandwidth function.
void ULSchedulerRTPSConnection(uint32_t &symbolsToAllocation, uint32_t &availableSymbols)
Uplink Scheduler for rtPS connections.
void Schedule() override
Schedule function.
void ServiceBandwidthRequests(const SSRecord *ssRecord, ServiceFlow::SchedulingType schedulingType, OfdmUlMapIe &ulMapIe, const WimaxPhy::ModulationType modulationType, uint32_t &symbolsToAllocation, uint32_t &availableSymbols) override
Service Bandwidth Requests function.
@ RANGING_STATUS_CONTINUE
ModulationType
ModulationType enumeration.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.