communication_layer.cpp

00001 
00002 #include "communication_layer.hpp"
00003 #include "node.hpp"
00004 #include "log_stream_manager.hpp"
00005 #include "packet.hpp"
00006 
00007 const t_uint CommunicationLayer::m_DEFAULT_MAX_QUEUE_LENGTH = 50;
00008 
00009 CommunicationLayer::CommunicationLayer(NodePtr node)
00010    : m_lowerLayerRecvEventPending(false),
00011    m_node(node), m_lowerLayerDelay(0.0), m_upperLayerDelay(0.0),
00012    m_defaultLowerLayerIdx(0), m_defaultUpperLayerIdx(0),
00013    m_maxQueueLength(m_DEFAULT_MAX_QUEUE_LENGTH), m_queueIsBlocked(false)
00014 {
00015 
00016 }
00017 
00018 CommunicationLayer::~CommunicationLayer()
00019 {
00020 
00021 }
00022 
00023 void CommunicationLayer::blockUpperQueues()
00024 {
00025    for(t_uint i = 0; i < m_upperLayers.size(); ++i) {
00026       m_upperLayers[i]->blockQueue();
00027    }
00028 }
00029 
00030 void CommunicationLayer::unblockUpperQueues()
00031 {
00032    t_uint i = 0;
00033    while(!queueIsFull() && i < m_upperLayers.size()) {
00034       m_upperLayers[i]->unblockQueue();
00035       ++i;
00036    }
00037 }
00038 
00039 void CommunicationLayer::sendFromQueue()
00040 {
00041    while(!m_lowerLayerRecvEventPending && !m_queueIsBlocked && 
00042          !m_packetQueue.empty()) {
00043       pair<PacketPtr,t_uint> queueElement = m_packetQueue.front();
00044       m_packetQueue.pop_front();
00045       sendToLayer(CommunicationLayer::Directions_Lower, 
00046          queueElement.first, queueElement.second);
00047    }
00048 
00049    if(!queueIsFull())
00050       unblockUpperQueues();
00051 }
00052 
00053 bool CommunicationLayer::sendToQueue(PacketPtr packet)
00054 {
00055    return sendToQueue(packet, 
00056       getDefaultLayer(CommunicationLayer::Directions_Lower));
00057 }
00058 
00059 bool CommunicationLayer::sendToQueue(PacketPtr packet, 
00060    t_uint lowerLayerIdx)
00061 {
00062    bool wasSuccessful = false;
00063    pair<PacketPtr,t_uint> queueElement = 
00064       make_pair(packet, lowerLayerIdx);
00065    if(!queueIsFull()) {
00066       wasSuccessful = true;
00067       m_packetQueue.push_back(queueElement);
00068       sendFromQueue();
00069    } else {
00070       // The packet is dropped.
00071    }
00072 
00073    if(queueIsFull())
00074       blockUpperQueues();
00075 
00076    return wasSuccessful;
00077 }
00078 
00079 bool CommunicationLayer::sendToLayer(
00080    Directions direction, PacketPtr packet)
00081 {
00082    return sendToLayer(direction, packet, getDefaultLayer(direction));
00083 }
00084 
00085 bool CommunicationLayer::sendToAllLayers(
00086    Directions direction, PacketPtr packet)
00087 {
00088    t_uint layersTotal = numberOfLayers(direction);
00089    bool wasSentToAllLayers = true;
00090    for(t_uint i = 0; i < layersTotal; i++) {
00091       wasSentToAllLayers &= sendToLayer(direction, packet, i);
00092    }
00093    return wasSentToAllLayers;
00094 }
00095 
00096 bool CommunicationLayer::sendToLayer(
00097    Directions direction, PacketPtr packet, t_uint recvingLayerIdx)
00098 {
00099    assert(packet != 0);
00100    assert(recvingLayerIdx < numberOfLayers(direction));
00101    CommunicationLayerPtr recvingLayer;
00102    switch(direction) {
00103    case Directions_Lower:
00104       recvingLayer = m_lowerLayers[recvingLayerIdx];
00105       break;
00106    case Directions_Upper:
00107       removeLayerData(packet);
00108       recvingLayer = m_upperLayers[recvingLayerIdx];
00109       break;
00110    default:
00111       assert(false);
00112    }
00113    assert(recvingLayer.get() != 0);
00114 
00115    LogStreamManager::instance()->logPktSendItem(getNodeId(),
00116       getLayerType(), *packet);
00117    EventPtr recvEvent = LayerRecvEvent::create(direction, 
00118       packet, recvingLayer, shared_from_this());
00119 
00120    if(direction == Directions_Lower)
00121       setLowerLayerRecvEventPending(true);
00122 
00123    assert(m_node != 0);
00124    bool wasScheduled = m_node->scheduleEvent(recvEvent, 
00125       getLayerDelay(direction));
00126    return wasScheduled;
00127 }
00128 
00129 bool CommunicationLayer::recvFromLayer(Directions direction, 
00130    PacketPtr packet, CommunicationLayerPtr sendingLayer)
00131 {
00132    bool layerFound = false;
00133    t_uint sendingLayerIdx;
00134 
00135    vector<CommunicationLayerPtr>* layerVector = 0;
00136    switch(direction) {
00137    case Directions_Lower:
00138       layerVector = &m_lowerLayers;
00139       break;
00140    case Directions_Upper:
00141       layerVector = &m_upperLayers;
00142       break;
00143    default:
00144       assert(false);
00145    }
00146    assert(layerVector != 0);
00147 
00148    t_uint layersTotal = numberOfLayers(direction);
00149    for(t_uint i = 0; i < layersTotal; i++) {
00150       if((*layerVector)[i] == sendingLayer) {
00151          layerFound = true;
00152          sendingLayerIdx = i;
00153          break;
00154       }
00155    }
00156 
00157    bool wasRecvd = false;
00158    if(layerFound) {
00159       LogStreamManager::instance()->logPktRecvItem(getNodeId(),
00160          getLayerType(), *packet);
00161       wasRecvd = recvFromLayer(direction, packet, sendingLayerIdx);
00162    }
00163    return wasRecvd;
00164 }
00165 
00166 bool CommunicationLayer::recvFromLayer(
00167    Directions direction, PacketPtr packet, t_uint recvLayerIdx)
00168 {
00169    // By default, we just pass this along to the default
00170    // next layer or do nothing if none exist
00171    Directions directionToSend = 
00172       Directions_Lower;
00173    switch(direction) {
00174    case Directions_Lower:
00175       directionToSend = Directions_Upper;
00176       break;
00177    case Directions_Upper:
00178       directionToSend = Directions_Lower;
00179       break;
00180    default:
00181       assert(false);
00182    }
00183 
00184    if(numberOfLayers(directionToSend) > 0) {
00185       sendToLayer(directionToSend, packet);
00186    }
00187    return true;
00188 
00189 }
00190 
00191 NodeId CommunicationLayer::getNodeId() const
00192 {
00193    NodePtr owner = getNode();
00194    assert(owner.get() != 0);
00195    return owner->getNodeId();
00196 }
00197 
00198 void CommunicationLayer::removeLayerData(PacketPtr packet) const
00199 {
00200    switch(getLayerType()) {
00201    case Types_Application:
00202       packet->removeData(Packet::DataTypes_Application);
00203       break;
00204    case Types_Transport:
00205       packet->removeData(Packet::DataTypes_Transport);
00206       break;
00207    case Types_Network:
00208       packet->removeData(Packet::DataTypes_Network);
00209       break;
00210    case Types_Link:
00211       packet->removeData(Packet::DataTypes_Link);
00212       break;
00213    case Types_Physical:
00214       packet->removeData(Packet::DataTypes_Physical);
00215       break;
00216    default:
00217       assert(false);
00218    }
00219 }
00220 

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