mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-01 11:50:37 +02:00
Speed up connecting by sorting the SipInfos
This commit is contained in:
@@ -164,7 +164,69 @@ ConnectionManager::connectToPeer( const Tomahawk::peerinfo_ptr &peerInfo, bool l
|
|||||||
// If we are not connected, try to connect
|
// If we are not connected, try to connect
|
||||||
d_func()->currentPeerInfo = peerInfo;
|
d_func()->currentPeerInfo = peerInfo;
|
||||||
peerInfoDebug( peerInfo ) << "No existing connection found, trying to connect.";
|
peerInfoDebug( peerInfo ) << "No existing connection found, trying to connect.";
|
||||||
d_func()->sipCandidates.append( peerInfo->sipInfos() );
|
// Sort SipInfos
|
||||||
|
QList< SipInfo > anyOther;
|
||||||
|
QList< SipInfo > publicIPv4;
|
||||||
|
QList< SipInfo > publicIPv6;
|
||||||
|
QList< SipInfo > privateIPv4;
|
||||||
|
QList< SipInfo > privateIPv6;
|
||||||
|
foreach ( SipInfo sipInfo, peerInfo->sipInfos() )
|
||||||
|
{
|
||||||
|
if ( !sipInfo.isVisible() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
QHostAddress ha;
|
||||||
|
if ( ha.setAddress( sipInfo.host() ) )
|
||||||
|
{
|
||||||
|
if ( Servent::isValidExternalIP( ha ) )
|
||||||
|
{
|
||||||
|
if ( ha.protocol() == QAbstractSocket::IPv6Protocol )
|
||||||
|
{
|
||||||
|
publicIPv6.append( sipInfo );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
publicIPv4.append( sipInfo );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( ha.protocol() == QAbstractSocket::IPv6Protocol )
|
||||||
|
{
|
||||||
|
privateIPv6.append( sipInfo );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
privateIPv4.append( sipInfo );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
anyOther.append( sipInfo );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if ( Servent::instance()->ipv6ConnectivityLikely() && !publicIPv6.isEmpty() )
|
||||||
|
{
|
||||||
|
// Prefer IPv6 over IPv4
|
||||||
|
d_func()->sipCandidates.append( anyOther );
|
||||||
|
d_func()->sipCandidates.append( publicIPv6 );
|
||||||
|
d_func()->sipCandidates.append( publicIPv4 );
|
||||||
|
d_func()->sipCandidates.append( privateIPv6 );
|
||||||
|
d_func()->sipCandidates.append( privateIPv4 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// First try all IPv4 before trying IPv6
|
||||||
|
d_func()->sipCandidates.append( anyOther );
|
||||||
|
d_func()->sipCandidates.append( publicIPv4 );
|
||||||
|
d_func()->sipCandidates.append( privateIPv4 );
|
||||||
|
d_func()->sipCandidates.append( publicIPv6 );
|
||||||
|
d_func()->sipCandidates.append( privateIPv6 );
|
||||||
|
}
|
||||||
|
|
||||||
QVariantMap m;
|
QVariantMap m;
|
||||||
m["conntype"] = "accept-offer";
|
m["conntype"] = "accept-offer";
|
||||||
|
@@ -953,6 +953,20 @@ Servent::visibleExternally() const
|
|||||||
return (!d_func()->externalHostname.isNull()) || (d_func()->externalAddresses.length() > 0);
|
return (!d_func()->externalHostname.isNull()) || (d_func()->externalAddresses.length() > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Servent::ipv6ConnectivityLikely() const
|
||||||
|
{
|
||||||
|
foreach ( QHostAddress ha, d_func()->externalAddresses )
|
||||||
|
{
|
||||||
|
if ( ha.protocol() == QAbstractSocket::IPv6Protocol && Servent::isValidExternalIP( ha ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Servent::port() const
|
Servent::port() const
|
||||||
{
|
{
|
||||||
|
@@ -99,6 +99,13 @@ public:
|
|||||||
|
|
||||||
bool visibleExternally() const;
|
bool visibleExternally() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the probality that this host supports IPv6 high?
|
||||||
|
*
|
||||||
|
* Though we cannot fully test for IPv6 connectivity, some guesses based on non-localhost addresses are done.
|
||||||
|
*/
|
||||||
|
bool ipv6ConnectivityLikely() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The port this Peer listens directly (per default)
|
* The port this Peer listens directly (per default)
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user