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
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
00170
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