mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-07-25 23:45:49 -04:00
Implement IPv6 listening
With this commit IPv6-v3 surpass v0.6-IPv6-2 in term of features obsoleting it. p3BitDht handle gracefully unwanted non IPv4 addresses rsUdpStack handle gracefully unwanted non IPv4 addresses pqissludp handle gracefully unwanted non IPv4 addresses Move single address limitation workaround from p3discovery2::sendOwnContactInfo to better place p3PeerMgrIMPL::UpdateOwnAddress this way local address list is queried less often and only id there is some suggestion that it may have changed (probably ir will not be called all the times there is a changes in local network interfaces but is good enough) Implement crossplatform rs_setsockopt to avoid too much ifdef around Implement sockaddr_storage_copy to safely copy sockaddr_storage objects
This commit is contained in:
parent
b3c7d195c8
commit
4a138e07b9
14 changed files with 618 additions and 378 deletions
|
@ -4,6 +4,7 @@
|
|||
* BitDht interface for RetroShare.
|
||||
*
|
||||
* Copyright 2009-2010 by Robert Fernie.
|
||||
* Copyright (C) 2015-2018 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
|
@ -184,18 +185,24 @@ bool p3BitDht::dropPeer(const RsPeerId& pid)
|
|||
********************************* Basic Peer Details *************************************
|
||||
******************************************************************************************/
|
||||
|
||||
int p3BitDht::addBadPeer(const struct sockaddr_storage &addr, uint32_t /*reason*/, uint32_t /*flags*/, uint32_t /*age*/)
|
||||
int p3BitDht::addBadPeer( const sockaddr_storage &addr, uint32_t /*reason*/,
|
||||
uint32_t /*flags*/, uint32_t /*age*/ )
|
||||
{
|
||||
//mUdpBitDht->updateKnownPeer(&id, 0, bdflags);
|
||||
|
||||
struct sockaddr_in addrv4;
|
||||
if (addr.ss_family != AF_INET)
|
||||
sockaddr_in addrv4;
|
||||
sockaddr_storage tmpaddr;
|
||||
sockaddr_storage_copy(addr, tmpaddr);
|
||||
if(!sockaddr_storage_ipv6_to_ipv4(tmpaddr))
|
||||
{
|
||||
std::cerr << "p3BitDht::addBadPeer() cannot handle IPV6 Yet, aborting";
|
||||
std::cerr << std::endl;
|
||||
abort();
|
||||
std::cerr << __PRETTY_FUNCTION__ << " Error: got non IPv4 address!"
|
||||
<< std::endl;
|
||||
sockaddr_storage_dump(addr);
|
||||
print_stacktrace();
|
||||
return -EINVAL;
|
||||
}
|
||||
struct sockaddr_in *ap = (struct sockaddr_in *) &addr;
|
||||
|
||||
struct sockaddr_in *ap = (struct sockaddr_in *) &tmpaddr;
|
||||
|
||||
// convert.
|
||||
addrv4.sin_family = ap->sin_family;
|
||||
|
@ -216,39 +223,30 @@ int p3BitDht::addBadPeer(const struct sockaddr_storage &addr, uint32_t /*reason*
|
|||
}
|
||||
|
||||
|
||||
int p3BitDht::addKnownPeer(const RsPeerId &pid, const struct sockaddr_storage &addr, uint32_t flags)
|
||||
int p3BitDht::addKnownPeer( const RsPeerId &pid,
|
||||
const sockaddr_storage &addr, uint32_t flags )
|
||||
{
|
||||
struct sockaddr_in addrv4;
|
||||
sockaddr_clear(&addrv4);
|
||||
sockaddr_in addrv4;
|
||||
sockaddr_clear(&addrv4);
|
||||
|
||||
if (addr.ss_family != AF_INET)
|
||||
{
|
||||
if(addr.ss_family != AF_UNSPEC)
|
||||
{
|
||||
std::cerr << "p3BitDht::addKnownPeer() Warning! Non IPv4 Address - Cannot handle IPV6 Yet. addr.ss_family=" << addr.ss_family;
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
if (flags & NETASSIST_KNOWN_PEER_ONLINE)
|
||||
{
|
||||
std::cerr << "p3BitDht::addKnownPeer() Non IPv4 Address & ONLINE. Abort()ing.";
|
||||
std::cerr << std::endl;
|
||||
abort();
|
||||
}
|
||||
}
|
||||
else
|
||||
sockaddr_storage tmpaddr;
|
||||
sockaddr_storage_copy(addr, tmpaddr);
|
||||
if( !sockaddr_storage_isnull(addr) &&
|
||||
!sockaddr_storage_ipv6_to_ipv4(tmpaddr) )
|
||||
{
|
||||
|
||||
// convert.
|
||||
struct sockaddr_in *ap = (struct sockaddr_in *) &addr;
|
||||
|
||||
addrv4.sin_family = ap->sin_family;
|
||||
addrv4.sin_addr = ap->sin_addr;
|
||||
addrv4.sin_port = ap->sin_port;
|
||||
std::cerr << __PRETTY_FUNCTION__ << " Error: got non IPv4 address!"
|
||||
<< std::endl;
|
||||
sockaddr_storage_dump(addr);
|
||||
print_stacktrace();
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// convert.
|
||||
struct sockaddr_in *ap = (struct sockaddr_in *) &tmpaddr;
|
||||
addrv4.sin_family = ap->sin_family;
|
||||
addrv4.sin_addr = ap->sin_addr;
|
||||
addrv4.sin_port = ap->sin_port;
|
||||
|
||||
int p3type = 0;
|
||||
int bdflags = 0;
|
||||
bdId id;
|
||||
|
@ -295,7 +293,7 @@ int p3BitDht::addKnownPeer(const RsPeerId &pid, const struct sockaddr_storage &a
|
|||
|
||||
if (!isOwnId)
|
||||
{
|
||||
RsStackMutex stack(dhtMtx); /********* LOCKED *********/
|
||||
RS_STACK_MUTEX(dhtMtx);
|
||||
DhtPeerDetails *dpd = addInternalPeer_locked(pid, p3type);
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue