bool CNetwork::routePacket(G2Packet* pPacket, CG2Node* pNbr) { QUuid pGUID; if(pPacket->getTo(pGUID) && pGUID != quazaaSettings.Profile.GUID) // No and address != my address { CG2Node* pNode = 0; CEndPoint pAddr; if(m_oRoutingTable.find(pGUID, &pNode, &pAddr)) { bool bForwardTCP = false; bool bForwardUDP = false; if(pNbr) { if(pNbr->m_nType == G2_LEAF) // if received from leaf - can forward anywhere { bForwardTCP = bForwardUDP = true; } else // if received from a hub - can be forwarded to leaf { if(pNode && pNode->m_nType == G2_LEAF) { bForwardTCP = true; } } } else // received from udp - do not forward via udp { bForwardTCP = true; } if(pNode && bForwardTCP) { pNode->sendPacket(pPacket, true, false); return true; } else if(pAddr.isValid() && bForwardUDP) { Datagrams.sendPacket(pAddr, pPacket, true); return true; } // drop } return true; } return false; }
bool CNetwork::routePacket(QUuid& pTargetGUID, G2Packet* pPacket, bool bLockNeighbours, bool bBuffered) { CG2Node* pNode = 0; CEndPoint pAddr; if(m_oRoutingTable.find(pTargetGUID, &pNode, &pAddr)) { if(pNode) { if( bLockNeighbours ) { Neighbours.m_pSection.lock(); } if( Neighbours.neighbourExists(pNode) ) { pNode->sendPacket(pPacket, bBuffered, false); systemLog.postLog(LogSeverity::Debug, QString("CNetwork::RoutePacket %1 Packet: %2 routed to neighbour: %3").arg(pTargetGUID.toString()).arg(pPacket->getType()).arg(pNode->m_oAddress.toString().toLocal8Bit().constData())); } if( bLockNeighbours ) { Neighbours.m_pSection.unlock(); } return true; } else if(pAddr.isValid()) { Datagrams.sendPacket(pAddr, pPacket, true); systemLog.postLog(LogSeverity::Debug, QString("CNetwork::RoutePacket %1 Packet: %2 routed to remote node: %3").arg(pTargetGUID.toString()).arg(pPacket->getType()).arg(pAddr.toString().toLocal8Bit().constData())); return true; } systemLog.postLog(LogSeverity::Debug, QString("CNetwork::RoutePacket - No node and no address!")); } systemLog.postLog(LogSeverity::Debug, QString("CNetwork::RoutePacket %1 Packet: %2 DROPPED!").arg(pTargetGUID.toString()).arg(pPacket->getType())); return false; }