uint64_t CECTag::GetInt() const { if (m_tagData == NULL) { // Empty tag - This is NOT an error. EC_ASSERT(m_dataType == EC_TAGTYPE_UNKNOWN); return 0; } switch (m_dataType) { case EC_TAGTYPE_UINT8: return PeekUInt8(m_tagData); case EC_TAGTYPE_UINT16: return ENDIAN_NTOHS( RawPeekUInt16( m_tagData ) ); case EC_TAGTYPE_UINT32: return ENDIAN_NTOHL( RawPeekUInt32( m_tagData ) ); case EC_TAGTYPE_UINT64: return ENDIAN_NTOHLL( RawPeekUInt64( m_tagData ) ); case EC_TAGTYPE_UNKNOWN: // Empty tag - This is NOT an error. return 0; default: EC_ASSERT(0); return 0; } }
void CSocks5StateMachine::process_process_command_reply(bool entry) { if (entry) { m_lastReply = m_buffer[1]; unsigned char addressType = m_buffer[3]; // Process the server's reply m_ok = m_ok && m_buffer[0] == SOCKS5_VERSION && m_buffer[1] == SOCKS5_REPLY_SUCCEED; if (m_ok) { // Read BND.ADDR unsigned int portOffset = 0; switch(addressType) { case SOCKS5_ATYP_IPV4_ADDRESS: { const unsigned int addrOffset = 4; portOffset = 8; m_proxyBoundAddressIPV4.Hostname( PeekUInt32( m_buffer+addrOffset) ); m_proxyBoundAddress = &m_proxyBoundAddressIPV4; break; } case SOCKS5_ATYP_DOMAINNAME: { // Read the domain name const unsigned int addrOffset = 5; portOffset = 10 + m_buffer[4]; char c = m_buffer[portOffset]; m_buffer[portOffset] = 0; m_proxyBoundAddressIPV4.Hostname( char2unicode(m_buffer+addrOffset)); m_proxyBoundAddress = &m_proxyBoundAddressIPV4; m_buffer[portOffset] = c; break; } case SOCKS5_ATYP_IPV6_ADDRESS: { portOffset = 20; // TODO // IPV6 not yet implemented in wx //m_proxyBoundAddress.Hostname(Uint128toStringIP( // *((uint128 *)(m_buffer+addrOffset)) )); //m_proxyBoundAddress = &m_proxyBoundAddressIPV6; m_ok = false; break; } } // Set the packet length at last m_packetLenght = portOffset + 2; // Read BND.PORT m_proxyBoundAddress->Service( ENDIAN_NTOHS( RawPeekUInt16( m_buffer+portOffset) ) ); } } AddDummyEvent(); }
/** * Returns an EC_IPv4_t class. * * This function takes care of the endianness of the port number. * * @return EC_IPv4_t class. * * @see CECTag(ec_tagname_t, const EC_IPv4_t&) */ EC_IPv4_t CECTag::GetIPv4Data() const { EC_IPv4_t p(0, 0); if (m_dataType != EC_TAGTYPE_IPV4) { EC_ASSERT(m_dataType == EC_TAGTYPE_UNKNOWN); } else if (m_tagData == NULL) { EC_ASSERT(false); } else { RawPokeUInt32( p.m_ip, RawPeekUInt32( reinterpret_cast<EC_IPv4_t *>(m_tagData)->m_ip ) ); p.m_port = ENDIAN_NTOHS(reinterpret_cast<EC_IPv4_t *>(m_tagData)->m_port); } return p; }
void CSocks4StateMachine::process_process_command_reply(bool entry) { if (entry) { m_lastReply = m_buffer[1]; // Process the server's reply m_ok = m_ok && m_buffer[0] == SOCKS4_REPLY_CODE && m_buffer[1] == SOCKS4_REPLY_GRANTED; if (m_ok) { // Read BND.PORT const unsigned int portOffset = 2; m_ok = m_proxyBoundAddressIPV4.Service(ENDIAN_NTOHS( RawPeekUInt16( m_buffer+portOffset) ) ); // Read BND.ADDR const unsigned int addrOffset = 4; m_ok = m_ok && m_proxyBoundAddressIPV4.Hostname( PeekUInt32( m_buffer+addrOffset ) ); m_proxyBoundAddress = &m_proxyBoundAddressIPV4; } } AddDummyEvent(); }
wxDatagramSocket &CDatagramSocketProxy::RecvFrom( wxSockAddress &addr, void* buf, wxUint32 nBytes ) { wxMutexLocker lock(m_socketLocker); m_lastUDPOperation = UDP_OPERATION_RECV_FROM; if (m_proxyTCPSocket.GetUseProxy()) { if (m_udpSocketOk) { char *bufUDP = NULL; if (nBytes + PROXY_UDP_MAXIMUM_OVERHEAD > PROXY_BUFFER_SIZE) { bufUDP = new char[nBytes + PROXY_UDP_MAXIMUM_OVERHEAD]; } else { bufUDP = m_proxyTCPSocket.GetBuffer(); } wxDatagramSocket::RecvFrom( m_proxyTCPSocket.GetProxyBoundAddress(), bufUDP, nBytes + PROXY_UDP_MAXIMUM_OVERHEAD); unsigned int offset; switch (m_proxyTCPSocket.GetBuffer()[3]) { case SOCKS5_ATYP_IPV4_ADDRESS: { offset = PROXY_UDP_OVERHEAD_IPV4; try { amuleIPV4Address &a = dynamic_cast<amuleIPV4Address &>(addr); a.Hostname( PeekUInt32( m_proxyTCPSocket.GetBuffer()+4 ) ); a.Service( ENDIAN_NTOHS( RawPeekUInt16( m_proxyTCPSocket.GetBuffer()+8) ) ); } catch (const std::bad_cast& WXUNUSED(e)) { AddDebugLogLineN(logProxy, wxT("(2)bad_cast exception!")); wxFAIL; } } break; case SOCKS5_ATYP_DOMAINNAME: offset = PROXY_UDP_OVERHEAD_DOMAIN_NAME; break; case SOCKS5_ATYP_IPV6_ADDRESS: offset = PROXY_UDP_OVERHEAD_IPV6; break; default: /* Error! */ offset = 0; break; } memcpy(buf, bufUDP + offset, nBytes); // Uncomment here to see the buffer contents on console // DumpMem(bufUDP, wxDatagramSocket::LastCount(), wxT("RecvFrom"), 3); /* Only delete buffer if it was dynamically created */ if (bufUDP != m_proxyTCPSocket.GetBuffer()) { /* We should use a fixed buffer to avoid * new/delete it all the time. * I need an upper bound */ delete bufUDP; } /* There is still one problem pending, fragmentation. * Either we support it or we have to drop fragmented * messages. I vote for drop :) */ } } else { wxDatagramSocket::RecvFrom(addr, buf, nBytes); } return *this; }