mac_protocol.cpp

00001 
00002 #include "mac_protocol.hpp"
00003 #include "packet.hpp"
00004 #include "link_layer.hpp"
00005 
00006 const double SlottedMac::m_DEFAULT_SLOT_TIME = 2.0e-3;
00007 
00008 MacProtocol::MacProtocol(NodePtr node)
00009    : m_node(node)
00010 {
00011 
00012 }
00013 
00014 MacProtocol::~MacProtocol()
00015 {
00016 
00017 }
00018 
00019 void MacProtocol::setLinkLayer(LinkLayerPtr linkLayer)
00020 {
00021    // assert(m_node == linkLayer->getNode());
00022    m_linkLayer = linkLayer;
00023 }
00024 
00025 void MacProtocol::blockUpperQueues()
00026 {
00027    LinkLayerPtr sharedLinkLayer = m_linkLayer.lock();
00028    sharedLinkLayer->blockUpperQueues();
00029 }
00030 
00031 void MacProtocol::unblockUpperQueues()
00032 {
00033    LinkLayerPtr sharedLinkLayer = m_linkLayer.lock();
00034    sharedLinkLayer->unblockUpperQueues();
00035 }
00036 
00037 bool MacProtocol::getQueueIsBlocked() const
00038 {
00039    LinkLayerPtr sharedLinkLayer = m_linkLayer.lock();
00040    return sharedLinkLayer->getQueueIsBlocked();
00041 }
00042 
00043 bool MacProtocol::startSendTimer(
00044    CommunicationLayer::Directions direction, PacketPtr packet,
00045    const SimTime& delay)
00046 {
00047    if(m_sendTimer.get() != 0)
00048       assert(!m_sendTimer->isRunning());
00049 
00050    SendToLinkLayerEventPtr sendEvent = 
00051       SendToLinkLayerEvent::create(thisMacProtocol(), direction, packet);
00052    m_sendTimer = Timer::create(getNode(), sendEvent);
00053    bool wasSuccessful = m_sendTimer->start(delay);
00054    return wasSuccessful;
00055 }
00056 
00057 bool MacProtocol::sendToLinkLayer(
00058    CommunicationLayer::Directions direction, PacketPtr packet)
00059 {
00060    bool wasSuccessful = false;
00061    LinkLayerPtr sharedLinkLayer = m_linkLayer.lock();
00062    // If down, check if the channel is busy and call
00063    // a function if so to allow subclasses to handle this event.
00064    if(direction == CommunicationLayer::Directions_Lower &&
00065          sharedLinkLayer->channelIsBusy()) {
00066       handleChannelBusy(packet);
00067    } else {
00068       handlePacketSent(packet);
00069       wasSuccessful = sharedLinkLayer->recvFromMacProtocol(direction,
00070          packet);
00071    }
00072    return wasSuccessful;
00073 }
00074 
00075 bool MacProtocol::recvFromLinkLayer(
00076    CommunicationLayer::Directions direction, PacketPtr packet,
00077    t_uint sendingLayerIdx)
00078 {
00079 
00080    bool wasSuccessful = false;
00081 
00082 
00083    switch(direction) {
00084    case CommunicationLayer::Directions_Lower:
00085       wasSuccessful = handleRecvdMacPacket(packet, sendingLayerIdx);
00086       /*
00087       if(packet->hasUpperLayerData(Packet::DataTypes_Link)) {
00088          assert(!m_linkLayer.expired());
00089          LinkLayerPtr sharedLinkLayer = m_linkLayer.lock();
00090          wasSuccessful = sharedLinkLayer->recvFromMacProtocol(direction,
00091             packet);
00092       */
00093       break;
00094    case CommunicationLayer::Directions_Upper:
00095       wasSuccessful = handleRecvdUpperLayerPacket(packet, 
00096          sendingLayerIdx);
00097       break;
00098    default:
00099       assert(false);
00100    }
00101 
00102    return wasSuccessful;
00103 }
00104 
00105 

Generated on Tue Dec 12 17:04:38 2006 for rfidsim by  doxygen 1.4.7