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
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
00063
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
00088
00089
00090
00091
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