1// -*- C++ -*- 2// This file is part of the aMule Project. 3// 4// Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) 5// Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) 6// Copyright (c) 2003-2011 Barry Dunne (http://www.emule-project.net) 7// 8// Any parts of this program derived from the xMule, lMule or eMule project, 9// or contributed by third-party developers are copyrighted by their 10// respective authors. 11// 12// This program is free software; you can redistribute it and/or modify 13// it under the terms of the GNU General Public License as published by 14// the Free Software Foundation; either version 2 of the License, or 15// (at your option) any later version. 16// 17// This program is distributed in the hope that it will be useful, 18// but WITHOUT ANY WARRANTY; without even the implied warranty of 19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20// GNU General Public License for more details. 21// 22// You should have received a copy of the GNU General Public License 23// along with this program; if not, write to the Free Software 24// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 25// 26 27// Note To Mods // 28/* 29Please do not change anything here and release it.. 30There is going to be a new forum created just for the Kademlia side of the client.. 31If you feel there is an error or a way to improve something, please 32post it in the forum first and let us look at it.. If it is a real improvement, 33it will be added to the offical client.. Changing something without knowing 34what all it does can cause great harm to the network if released in mass form.. 35Any mod that changes anything within the Kademlia side will not be allowed to advertise 36there client on the eMule forum.. 37*/ 38 39#ifndef __KAD_UDP_LISTENER_H__ 40#define __KAD_UDP_LISTENER_H__ 41 42#include "../utils/UInt128.h" 43#include "../../Tag.h" 44#include "PacketTracking.h" 45 46#include <list> 47 48 49class CMemFile; 50struct SSearchTerm; 51 52//////////////////////////////////////// 53namespace Kademlia { 54//////////////////////////////////////// 55 56class CContact; 57class CKadUDPKey; 58class CKadClientSearcher; 59 60struct FetchNodeID_Struct { 61 uint32_t ip; 62 uint32_t tcpPort; 63 uint32_t expire; 64 CKadClientSearcher* requester; 65}; 66 67#define DebugSendF(what, ip, port) AddDebugLogLineN(logClientKadUDP, what + wxString(wxT(" to ")) + KadIPPortToString(ip, port)) 68#define DebugRecvF(what, ip, port) AddDebugLogLineN(logClientKadUDP, what + wxString(wxT(" from ")) + KadIPPortToString(ip, port)) 69 70#define DebugSend(what, ip, port) DebugSendF(wxSTRINGIZE_T(what), ip, port) 71#define DebugRecv(what, ip, port) DebugRecvF(wxSTRINGIZE_T(what), ip, port) 72 73 74class CKademliaUDPListener : public CPacketTracking 75{ 76public: 77 ~CKademliaUDPListener(); 78 void Bootstrap(uint32_t ip, uint16_t port, uint8_t kadVersion = 0, const CUInt128* cryptTargetID = NULL); 79 void FirewalledCheck(uint32_t ip, uint16_t port, const CKadUDPKey& senderKey, uint8_t kadVersion); 80 void SendMyDetails(uint8_t opcode, uint32_t ip, uint16_t port, uint8_t kadVersion, const CKadUDPKey& targetKey, const CUInt128* cryptTargetID, bool requestAckPacket); 81 void SendNullPacket(uint8_t opcode, uint32_t ip, uint16_t port, const CKadUDPKey& targetKey, const CUInt128* cryptTargetID); 82 void SendPublishSourcePacket(const CContact& contact, const CUInt128& targetID, const CUInt128& contactID, const TagPtrList& tags); 83 virtual void ProcessPacket(const uint8_t* data, uint32_t lenData, uint32_t ip, uint16_t port, bool validReceiverKey, const CKadUDPKey& senderKey); 84 void SendPacket(const CMemFile& data, uint8_t opcode, uint32_t destinationHost, uint16_t destinationPort, const CKadUDPKey& targetKey, const CUInt128* cryptTargetID); 85 86 bool FindNodeIDByIP(CKadClientSearcher *requester, uint32_t ip, uint16_t tcpPort, uint16_t udpPort); 87 void ExpireClientSearch(CKadClientSearcher *expireImmediately = NULL); 88private: 89 static SSearchTerm* CreateSearchExpressionTree(CMemFile& bio, int iLevel); 90 static void Free(SSearchTerm* pSearchTerms); 91 92 // Kad1.0 93 void SendLegacyChallenge(uint32_t ip, uint16_t port, const CUInt128& contactID); 94 95 void ProcessSearchResponse (CMemFile &bio); 96 void ProcessSearchResponse (const uint8_t* packetData, uint32_t lenPacket); 97 void ProcessPublishResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip); 98 void ProcessSearchNotesResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip); 99 void ProcessFirewalledRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 100 void ProcessFirewalledResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, const CKadUDPKey& senderKey); 101 void ProcessFirewalledAckResponse (uint32_t lenPacket); 102 void ProcessFindBuddyRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 103 void ProcessFindBuddyResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 104 void ProcessCallbackRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 105 106 // Kad2.0 107 bool AddContact2(const uint8_t* data, uint32_t lenData, uint32_t ip, uint16_t& port, uint8_t* outVersion, const CKadUDPKey& key, bool& ipVerified, bool update, bool fromHelloReq, bool* outRequestsACK, CUInt128* outContactID); 108 109 void Process2BootstrapRequest (uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 110 void Process2BootstrapResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey, bool validReceiverKey); 111 void Process2HelloRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey, bool validReceiverKey); 112 void Process2HelloResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey, bool validReceiverKey); 113 void Process2HelloResponseAck (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, bool validReceiverKey); 114 void ProcessKademlia2Request (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 115 void ProcessKademlia2Response (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 116 void Process2SearchNotesRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 117 void Process2SearchKeyRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 118 void Process2SearchSourceRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 119 void Process2SearchResponse (const uint8_t* packetData, uint32_t lenPacket, const CKadUDPKey& senderKey); 120 void Process2PublishNotesRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 121 void Process2PublishKeyRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 122 void Process2PublishSourceRequest (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 123 void Process2PublishResponse (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 124 void Process2Ping (uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 125 void Process2Pong (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip); 126 void Process2FirewallUDP (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip); 127 void ProcessFirewalled2Request (const uint8_t* packetData, uint32_t lenPacket, uint32_t ip, uint16_t port, const CKadUDPKey& senderKey); 128 129 // Debug 130 void DebugClientOutput(const wxString& place, uint32_t kad_ip, uint32_t port, const uint8_t* data = NULL, int len = 0); 131 132 typedef std::list<FetchNodeID_Struct> FetchNodeIDList; 133 FetchNodeIDList m_fetchNodeIDRequests; 134}; 135 136} // End namespace 137 138#endif //__KAD_UDP_LISTENER_H__ 139// File_checked_for_headers 140