27#include "ns3/ipv4-address.h"
28#include "ns3/llc-snap-header.h"
30#include "ns3/packet-burst.h"
31#include "ns3/pointer.h"
32#include "ns3/simulator.h"
33#include "ns3/trace-source-accessor.h"
34#include "ns3/uinteger.h"
49 TypeId(
"ns3::BaseStationNetDevice")
53 .SetGroupName(
"Wimax")
57 .AddAttribute(
"BSScheduler",
58 "Downlink Scheduler for BS",
63 .AddAttribute(
"InitialRangInterval",
64 "Time between Initial Ranging regions assigned by the BS. Maximum is 2s",
70 .AddAttribute(
"DcdInterval",
71 "Time between transmission of DCD messages. Maximum value is 10s.",
77 .AddAttribute(
"UcdInterval",
78 "Time between transmission of UCD messages. Maximum value is 10s.",
84 .AddAttribute(
"IntervalT8",
85 "Wait for DSA/DSC Acknowledge timeout. Maximum 300ms.",
91 .AddAttribute(
"RangReqOppSize",
92 "The ranging opportunity size in symbols",
98 .AddAttribute(
"BwReqOppSize",
99 "The bandwidth request opportunity size in symbols",
106 "MaxRangCorrectionRetries",
107 "Number of retries on contention Ranging Requests",
113 .AddAttribute(
"SSManager",
114 "The ss manager attached to this device.",
120 .AddAttribute(
"Scheduler",
121 "The BS scheduler attached to this device.",
127 .AddAttribute(
"LinkManager",
128 "The link manager attached to this device.",
134 .AddAttribute(
"UplinkScheduler",
135 "The uplink scheduler attached to this device.",
141 .AddAttribute(
"BsIpcsPacketClassifier",
142 "The uplink IP packet classifier attached to this device.",
148 .AddAttribute(
"ServiceFlowManager",
149 "The service flow manager attached to this device.",
155 .AddTraceSource(
"BSTx",
156 "A packet has been received from higher layers "
157 "and is being processed in preparation "
158 "for queueing for transmission.",
160 "ns3::Packet::TracedCallback")
162 .AddTraceSource(
"BSTxDrop",
163 "A packet has been dropped in the MAC layer "
164 "before being queued for transmission.",
166 "ns3::Packet::TracedCallback")
168 .AddTraceSource(
"BSPromiscRx",
169 "A packet has been received by this device, "
170 "has been passed up from the physical layer "
171 "and is being forwarded up the local protocol stack. "
172 "This is a promiscuous trace,",
174 "ns3::Packet::TracedCallback")
176 .AddTraceSource(
"BSRx",
177 "A packet has been received by this device, "
178 "has been passed up from the physical layer "
179 "and is being forwarded up the local protocol stack. "
180 "This is a non-promiscuous trace,",
182 "ns3::Packet::TracedCallback")
184 .AddTraceSource(
"BSRxDrop",
185 "A packet has been dropped in the MAC layer "
186 "after it has been passed up from the physical layer.",
188 "ns3::Packet::TracedCallback");
518 GetPhy()->SetPhyParameters();
623 uint16_t protocolNumber)
631 NS_LOG_INFO(
"\t\tPacket Size: " << packet->GetSize());
634 if (protocolNumber == 2048)
641 if (protocolNumber != 2048 || serviceFlow ==
nullptr)
646 if (serviceFlow ==
nullptr)
679 "BS: Can not enqueue packet on the selected connection: the connection is not initialized");
684 hdr.
SetCid(connection->GetCid());
686 return connection->Enqueue(packet, hdrType, hdr);
703 bool fragmentation =
false;
705 packet->RemoveHeader(gnrcMacHdr);
716 cid = gnrcMacHdr.
GetCid();
725 packet->RemoveHeader(grantMgmntSubhdr);
728 uint8_t tmpType = type;
729 if (((tmpType >> 2) & 1) == 1)
732 NS_LOG_INFO(
"FRAG_DEBUG: DoReceive -> the packet is a fragment" << std::endl);
733 fragmentation =
true;
739 packet->RemoveHeader(msgType);
743 packet->RemoveHeader(rngReq);
758 packet->RemoveHeader(msgType);
762 packet->RemoveHeader(rngReq);
777 packet->RemoveHeader(msgType);
787 packet->RemoveHeader(dsaReq);
799 packet->RemoveHeader(dsaAck);
819 C_Packet->RemoveHeader(llc);
826 NS_LOG_INFO(
"FRAG_DEBUG: BS DoReceive, the Packet is a fragment" << std::endl);
827 packet->RemoveHeader(fragSubhdr);
829 NS_LOG_INFO(
"\t fragment size = " << packet->GetSize() << std::endl);
834 NS_LOG_INFO(
"\t Received the latest fragment" << std::endl);
841 NS_LOG_INFO(
"\t BS PACKET DEFRAGMENTATION" << std::endl);
842 for (
auto iter = fragmentsQueue.begin(); iter != fragmentsQueue.end(); ++iter)
845 fullPacket->AddAtEnd(*iter);
849 NS_LOG_INFO(
"\t fullPacket size = " << fullPacket->GetSize() << std::endl);
858 NS_LOG_INFO(
"\t Received the first or the middle fragment" << std::endl);
867 packet->AddHeader(gnrcMacHdr);
868 packet->RemoveHeader(bwRequestHdr);
870 "A bandwidth request should be carried by a bandwidth header type");
877 cid = bwRequestHdr.
GetCid();
889 bool sendDcd =
false;
890 bool sendUcd =
false;
891 bool updateDcd =
false;
892 bool updateUcd =
false;
894 uint16_t currentNrSsRegistered =
m_ssManager->GetNRegisteredSSs();
898 m_uplinkScheduler->GetChannelDescriptorsToUpdate(updateDcd, updateUcd, sendDcd, sendUcd);
902 sendDcd = sendUcd =
true;
971 std::pair<OfdmDlMapIe*, Ptr<PacketBurst>> pair;
973 std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst>>>* downlinkBursts =
979 while (!downlinkBursts->empty())
981 pair = downlinkBursts->front();
983 dlMapIe = pair.first;
985 uint8_t diuc = dlMapIe->
GetDiuc();
1000 txTime +=
GetPhy()->GetTransmissionTime(burst->GetSize(), modulationType);
1001 downlinkBursts->pop_front();
1015 std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst>>>* downlinkBursts =
1018 for (
auto iter = downlinkBursts->begin(); iter != downlinkBursts->end(); ++iter)
1020 iter->first->SetPreamblePresent(0);
1021 iter->first->SetStartTime(0);
1036 p->AddHeader(dlmap);
1080 std::list<OfdmUlMapIe> uplinkAllocations =
m_uplinkScheduler->GetUplinkAllocations();
1082 for (
auto iter = uplinkAllocations.begin(); iter != uplinkAllocations.end(); ++iter)
1090 p->AddHeader(ulmap);
1179 uint16_t symbolsToAllocation = 0;
1180 std::list<OfdmUlMapIe> uplinkAllocations =
m_uplinkScheduler->GetUplinkAllocations();
1181 for (
auto iter = uplinkAllocations.begin(); iter != uplinkAllocations.end(); ++iter)
1194 uplinkAllocation.
GetCid(),
This class implements the bandwidth-request mac Header as described by IEEE Standard for Local and me...
uint8_t GetHt() const
Get HT field.
bool check_hcs() const
Check HCS.
Cid GetCid() const
Get CID field.
uint32_t m_nrUlMapSent
number UL map sent
uint8_t GetBwReqOppSize() const
void SetDcdInterval(Time dcdInterval)
Ptr< BSScheduler > GetBSScheduler() const
TracedCallback< Ptr< const Packet >, Mac48Address, Cid > m_traceBSRx
the base station receive trace callback
Time m_dcdInterval
in seconds
void SetBsClassifier(Ptr< IpcsClassifier > classifier)
Ptr< UplinkScheduler > m_uplinkScheduler
the uplink scheduler
uint8_t m_bwReqOppSize
in symbols
void SetBwReqOppSize(uint8_t bwReqOppSize)
void SetUcdInterval(Time ucdInterval)
void SetRangReqOppSize(uint8_t rangReqOppSize)
void RangingOppStart()
Ranging opp start.
Time m_ulSubframeStartTime
UL subframe start time.
Time GetIntervalT8() const
void SetDlBurstProfiles(Dcd *dcd)
Send DL burst profiles.
void UplinkAllocationStart()
Uplink allocation start.
uint32_t GetNrDlSymbols() const
Ptr< SSManager > m_ssManager
the SS manager
void Stop() override
Stop device.
Ptr< IpcsClassifier > GetBsClassifier() const
uint8_t GetRangReqOppSize() const
Ptr< Packet > CreateUcd()
Create UCD.
Time GetDlSubframeStartTime() const
uint8_t GetMaxRangingCorrectionRetries() const
CidFactory * m_cidFactory
the CID factory
uint32_t m_framesSinceLastDcd
frames since last DCD
uint32_t m_ucdConfigChangeCount
UCD config change count.
uint8_t m_rangingOppNumber
current ranging TO number
uint32_t m_allocationStartTime
allocation start time
void SetNrDlSymbols(uint32_t dlSymbols)
TracedCallback< Ptr< const Packet > > m_bsTxDropTrace
The trace source fired when packets coming into the "top" of the device are dropped at the MAC layer ...
TracedCallback< Ptr< const Packet > > m_bsRxDropTrace
The trace source fired when packets coming into the "top" of the device are dropped at the MAC layer ...
void MarkRangingOppStart(Time rangingOppStartTime)
Mark ranging opp start.
void SetMaxRangingCorrectionRetries(uint8_t maxRangCorrectionRetries)
uint32_t m_nrDlSymbols
number of DL symbols
uint32_t GetNrUcdSent() const
uint32_t m_nrUlSymbols
number of UL symbols
Ptr< WimaxConnection > GetConnection(Cid cid)
uint8_t m_maxRangCorrectionRetries
maximum range correction retries
void MarkUplinkAllocationStart(Time allocationStartTime)
Mark uplink allocation start.
uint32_t m_nrDlFrames
number DL frames
void SetBSScheduler(Ptr< BSScheduler > bsSchedule)
static TypeId GetTypeId()
Get the type ID.
void Start() override
Start device.
uint16_t m_nrUlAllocations
number UL allocations
uint32_t m_nrDcdSent
number DCD sent
void StartFrame()
Start frame function.
Ptr< IpcsClassifier > m_bsClassifier
the base station classifier
Time GetUcdInterval() const
void SetIntervalT8(Time interval)
Ptr< Packet > CreateUlMap()
Create UL map.
void EndFrame()
End frame function.
void DoDispose() override
Destructor implementation.
Ptr< BsServiceFlowManager > m_serviceFlowManager
the service flow manager
void SetInitialRangingInterval(Time initialRangInterval)
uint16_t m_nrSsRegistered
number SS registered
Time m_psDuration
ps duration
uint8_t m_maxInvitedRangRetries
maximum invited range retries
uint8_t m_ulAllocationNumber
to see UL burst number
Time GetInitialRangingInterval() const
void MarkUplinkAllocationEnd(Time allocationEndTime, Cid cid, uint8_t uiuc)
Mark uplink allocation end.
void SetNrUlSymbols(uint32_t ulSymbols)
void SetSSManager(Ptr< SSManager > ssManager)
void StartDlSubFrame()
Start DL subframe function.
Ptr< SSManager > GetSSManager() const
Time m_ucdInterval
in seconds
Ptr< Packet > CreateDlMap()
Create DL map.
void SetLinkManager(Ptr< BSLinkManager > linkManager)
void SetMaxInvitedRangRetries(uint8_t maxInvitedRangRetries)
~BaseStationNetDevice() override
Time m_symbolDuration
symbol duration
Time m_initialRangInterval
in seconds
void CreateDescriptorMessages(bool sendDcd, bool sendUcd)
creates the channel descriptor MAC management messages DCD and UCD
void SetUplinkScheduler(Ptr< UplinkScheduler > ulScheduler)
void UplinkAllocationEnd(Cid cid, uint8_t uiuc)
Uplink allocation end.
uint32_t m_nrUcdSent
number UCD sent
void StartUlSubFrame()
Start UL subframe function.
uint32_t m_nrUlFrames
number UL frames
void EndUlSubFrame()
End UL subframe function.
uint32_t GetNrUlSymbols() const
uint32_t m_dcdConfigChangeCount
DCD config change count.
uint32_t m_framesSinceLastUcd
frames since last UCD
void InitBaseStationNetDevice()
initializes the BS net device and sets its parameters to the default values
uint8_t m_rangReqOppSize
in symbols
Ptr< BSLinkManager > GetLinkManager() const
void CreateMapMessages()
creates the MAC management messages DL-MAP and UL-MAP
Time GetPsDuration() const
uint8_t GetMaxInvitedRangRetries() const
void DoReceive(Ptr< Packet > packet) override
Receive packet.
bool Enqueue(Ptr< Packet > packet, const MacHeaderType &hdrType, Ptr< WimaxConnection > connection) override
Enqueue a packet into a connection queue.
Time GetDcdInterval() const
void SetServiceFlowManager(Ptr< BsServiceFlowManager > sfm)
Set service flow manager.
Ptr< Packet > CreateDcd()
Create DCD.
Ptr< BSScheduler > m_scheduler
the base station scheduler
Time m_intervalT8
in milliseconds, wait for DSA/DSC Acknowledge timeout
bool DoSend(Ptr< Packet > packet, const Mac48Address &source, const Mac48Address &dest, uint16_t protocolNumber) override
Send packet.
void SendBursts()
Send burst function.
uint32_t m_nrDlMapSent
number DL map sent
Ptr< UplinkScheduler > GetUplinkScheduler() const
Time m_dlSubframeStartTime
DL subframe start time.
Time GetUlSubframeStartTime() const
uint16_t m_nrDlAllocations
number DL allocations
Time GetSymbolDuration() const
void EndDlSubFrame()
End DL subframe function.
TracedCallback< Ptr< const Packet > > m_bsTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition,...
Ptr< BsServiceFlowManager > GetServiceFlowManager() const
Ptr< BSLinkManager > m_linkManager
the link manager
TracedCallback< Ptr< const Packet > > m_bsPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
uint8_t GetRangingOppNumber() const
void MarkUplinkAllocations()
Mark uplink allocations.
void SetUlBurstProfiles(Ucd *ucd)
Send UL burst profiles.
TracedCallback< Ptr< const Packet > > m_bsRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
uint32_t GetNrDcdSent() const
This class is used exclusively by the BS to allocate CIDs to new connections.
bool IsBasic(Cid cid) const
This function determines if the CID is basic.
bool IsPrimary(Cid cid) const
This function determines if the CID is primary.
bool IsInitialRanging() const
static Cid InitialRanging()
void SetBsEirp(uint16_t bs_eirp)
Set BS EIRP field.
void SetFrequency(uint32_t frequency)
Set frequency field.
void SetEirxPIrMax(uint16_t rss_ir_max)
Set EIRX IR MAX field.
This class implements Downlink channel descriptor as described by "IEEE Standard forLocal and metropo...
void SetConfigurationChangeCount(uint8_t configurationChangeCount)
Set configuration change count field.
void AddDlBurstProfile(OfdmDlBurstProfile dlBurstProfile)
Add DL burst profile field.
void SetChannelEncodings(OfdmDcdChannelEncodings channelEncodings)
Set channel encodings field.
This class implements DL-MAP as described by "IEEE Standard forLocal and metropolitan area networks P...
void SetDcdCount(uint8_t dcdCount)
Set DCD count field.
void AddDlMapElement(OfdmDlMapIe dlMapElement)
Add DL Map element field.
void SetBaseStationId(Mac48Address baseStationID)
Set base station ID field.
This class implements the DSA-ACK message described by "IEEE Standard forLocal and metropolitan area ...
This class implements the DSA-REQ message described by "IEEE Standard forLocal and metropolitan area ...
static Mac48Address GetBroadcast()
Mac Management messages Section 6.3.2.3 MAC Management messages page 42, Table 14 page 43.
uint8_t GetType() const
Get type field.
This class implements the OFDM DCD channel encodings as described by "IEEE Standard forLocal and metr...
void SetChannelNr(uint8_t channelNr)
Set channel number field.
void SetTtg(uint8_t ttg)
Set TTG field.
void SetFrameDurationCode(uint8_t frameDurationCode)
Set frame duration code field.
void SetRtg(uint8_t rtg)
Set RTG field.
void SetFrameNumber(uint32_t frameNumber)
Set frame number field.
void SetBaseStationId(Mac48Address baseStationId)
Set base station ID field.
This class implements the OFDM Downlink burst profile descriptor as described by "IEEE Standardfor Lo...
void SetFecCodeType(uint8_t fecCodeType)
Set FEC code type.
void SetLength(uint8_t length)
Set length field.
void SetType(uint8_t type)
Set type field.
void SetDiuc(uint8_t diuc)
Set DIUC field.
This class implements the OFDM DL-MAP information element as described by "IEEE Standard forLocal and...
void SetStartTime(uint16_t startTime)
Set start time field.
uint8_t GetDiuc() const
Get DIUC field.
void SetCid(Cid cid)
Set CID function.
Cid GetCid() const
Set CID field.
void SetDiuc(uint8_t diuc)
Set DIUC field.
void SetPreamblePresent(uint8_t preamblePresent)
Set preamble present field.
This class implements the OFDM UCD channel encodings as described by "IEEE Standard forLocal and metr...
void SetSbchnlReqRegionFullParams(uint8_t sbchnlReqRegionFullParams)
Set SB channel reguest region full parameters.
void SetSbchnlFocContCodes(uint8_t sbchnlFocContCodes)
Set SB channel for control codes.
This class implements the UL burst profile as described by "IEEE Standard forLocal and metropolitan a...
void SetLength(uint8_t length)
Set length.
void SetUiuc(uint8_t uiuc)
Set UIUC.
void SetFecCodeType(uint8_t fecCodeType)
Set FEC code type.
void SetType(uint8_t type)
Set type.
This class implements the UL-MAP_IE message as described by "IEEE Standard forLocal and metropolitan ...
uint16_t GetDuration() const
Get duration.
Cid GetCid() const
Get CID.
uint8_t GetUiuc() const
Get UIUC.
uint16_t GetStartTime() const
Get start time.
AttributeValue implementation for Pointer.
Smart pointer class similar to boost::intrusive_ptr.
This class implements the ranging request message described by "IEEE Standard forLocal and metropolit...
This class implements service flows as described by the IEEE-802.16 standard.
bool GetIsEnabled() const
Get is enabled flag.
Ptr< WimaxConnection > GetConnection() const
Can return a null connection is this service flow has not been associated yet to a connection.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
static Time Now()
Return the current simulation virtual time.
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Simulation virtual time values and global simulation resolution.
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
void SetRangReqOppSize(uint16_t rangReqOppSize)
Set range request opp size.
void SetFrequency(uint32_t frequency)
Set frequency.
void SetBwReqOppSize(uint16_t bwReqOppSize)
Set BW request opp size.
This class implements the UCD message as described by "IEEE Standard forLocal and metropolitan area n...
void AddUlBurstProfile(OfdmUlBurstProfile ulBurstProfile)
Add UL burst profile.
void SetChannelEncodings(OfdmUcdChannelEncodings channelEncodings)
Set channel encodings.
void SetConfigurationChangeCount(uint8_t ucdCount)
Set configuration change count.
void SetRangingBackoffStart(uint8_t rangingBackoffStart)
Set ranging backoff start.
void SetRangingBackoffEnd(uint8_t rangingBackoffEnd)
Set ranging backoff end.
void SetRequestBackoffEnd(uint8_t requestBackoffEnd)
Set request backoff end.
void SetRequestBackoffStart(uint8_t requestBackoffStart)
Set request backoff start.
Hold an unsigned integer type.
This class implements the UL-MAP_IE message as described by "IEEE Standard forLocal and metropolitan ...
void SetAllocationStartTime(uint32_t allocationStartTime)
Set allocation start time.
void AddUlMapElement(OfdmUlMapIe ulMapElement)
Add UL map element.
void SetUcdCount(uint8_t ucdCount)
Set UCD count.
std::list< Ptr< const Packet > > FragmentsQueue
Definition of Fragments Queue data type.
Hold together all WiMAX-related objects in a NetDevice.
void DoDispose() override
Destructor implementation.
uint16_t GetRtg() const
Get receive/transmit transition gap.
void SetRtg(uint16_t rtg)
Set receive/transmit transition gap.
static uint8_t m_direction
downlink or uplink
Ptr< ConnectionManager > GetConnectionManager() const
Get the connection manager of the device.
void SetPhy(Ptr< WimaxPhy > phy)
Set the physical layer object.
void SetCurrentUcd(Ucd ucd)
Set the current UCD.
uint32_t GetNrFrames() const
Get the number of frames.
static Time m_frameStartTime
temp, to determine the frame start time at SS side, shall actually be determined by frame start pream...
void SetState(uint8_t state)
Set the device state.
Ptr< WimaxConnection > GetInitialRangingConnection() const
Get the initial ranging connection.
Ptr< WimaxPhy > GetPhy() const
Get the physical layer object.
Ptr< BandwidthManager > GetBandwidthManager() const
Get the bandwidth manager on the device.
Ptr< WimaxConnection > GetBroadcastConnection() const
Get the broadcast connection.
void SetTtg(uint16_t ttg)
Set transmission/receive transition gap.
void CreateDefaultConnections()
Creates the initial ranging and broadcast connections.
void SetNrFrames(uint32_t nrFrames)
Set the number of frames.
void SetCurrentDcd(Dcd dcd)
Set the current DCD.
void SetReceiveCallback()
Set receive callback function.
uint16_t GetTtg() const
Get transmission/receive transition gap.
Mac48Address GetMacAddress() const
Get the MAC address.
void SetNode(Ptr< Node > node) override
Set node pointer.
void ForwardUp(Ptr< Packet > packet, const Mac48Address &source, const Mac48Address &dest)
Forward a packet to the next layer above the device.
Ptr< BurstProfileManager > GetBurstProfileManager() const
Get the burst profile manager.
void ForwardDown(Ptr< PacketBurst > burst, WimaxPhy::ModulationType modulationType)
Forward a packet down the stack.
ModulationType
ModulationType enumeration.
@ MODULATION_TYPE_BPSK_12
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< AttributeChecker > MakePointerChecker()
Create a PointerChecker for a type.
#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.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeUintegerChecker()
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.