QuteCom uses src-port 5060 for outgoing connections. why?

Darshaka Pathirana dpat at syn-net.org
Wed Aug 6 20:24:32 CEST 2008


Hi!

Is there any reason why QuteCom alwayas tries to allocate src-port 5060
when registering on a remote server?

The code in subject is this (in wengophone/src/model/network/NetworkDiscovery.cpp):

unsigned NetworkDiscovery::getFreeLocalPort() {
	Config & config = ConfigManager::getInstance().getCurrentConfig();
	int localPort = SIP_PORT;

	if (!is_local_udp_port_used(NULL, config.getNetworkSipLocalPort())) {
		LOG_DEBUG("UDP port configured, will use port number : "
			+ String::fromNumber(config.getNetworkSipLocalPort()));
		return config.getNetworkSipLocalPort();
	}
	if (!is_local_udp_port_used(NULL, localPort)) {
		LOG_DEBUG("UDP port 5060 is free");
		return localPort;
	} else if (!is_local_udp_port_used(NULL, localPort + 1)) {
		LOG_DEBUG("UDP port 5060 is busy, will use 5061");
		return localPort + 1;
	} else {
		localPort = get_local_free_udp_port(NULL);
		if (localPort == -1) {
			LOG_DEBUG("cannot get a free local port");
			localPort = 0;
		}
		LOG_DEBUG("UDP port 5061 is busy, will use random port number : " + String::fromNumber(localPort));
		return localPort;
	}
}

[1] states that there is no reason for a client to always use the same
src-port number - the contrary is the case: the client should get a
"pseudo-random" port number for each process...

[1] http://www.tcpipguide.com/free/t_TCPIPClientEphemeralPortsandClientServerApplicatio.htm

QuteComs behaviour also causes a number of problems when running a
SIP-Server (asterisk) on localhost (or - under special circumstances -
even if in the same network).

I found some posts[2][3] in the wengophone-devel-mailling list but
they were primary workarounds. 

[1] http://article.gmane.org/gmane.comp.voip.wengophone.devel/594
[2] http://article.gmane.org/gmane.comp.voip.wengophone.devel/947

I tried a quick 'n dirty hack to get a random port number but it
seems that it just works for Windows and breaks Mac and Linux.
But I do not know why.

# HG changeset patch
# User Darshaka Pathirana <dpat at syn-net.org>
# Date 1214762709 -7200
# Node ID 504e52162cdb92920f13fb26dec0da23cc71eaa8
# Parent dce8e9215e87a504dc76b30dc6a8574861c8f560
always use random local udp port (should be a config setting)

--- a/wengophone/src/model/network/NetworkDiscovery.cpp	Sun Jun 29 14:26:26 2008 +0200
+++ b/wengophone/src/model/network/NetworkDiscovery.cpp	Sun Jun 29 20:05:09 2008 +0200
@@ -141,16 +141,17 @@ unsigned NetworkDiscovery::getFreeLocalP
 unsigned NetworkDiscovery::getFreeLocalPort() {
 	Config & config = ConfigManager::getInstance().getCurrentConfig();
 	int localPort = SIP_PORT;
+	bool randomPort = true;
 
-	if (!is_local_udp_port_used(NULL, config.getNetworkSipLocalPort())) {
+	if (!randomPort && !is_local_udp_port_used(NULL, config.getNetworkSipLocalPort())) {
 		LOG_DEBUG("UDP port configured, will use port number : "
 			+ String::fromNumber(config.getNetworkSipLocalPort()));
 		return config.getNetworkSipLocalPort();
 	}
-	if (!is_local_udp_port_used(NULL, localPort)) {
+	if (!randomPort && !is_local_udp_port_used(NULL, localPort)) {
 		LOG_DEBUG("UDP port 5060 is free");
 		return localPort;
-	} else if (!is_local_udp_port_used(NULL, localPort + 1)) {
+	} else if (!randomPort && !is_local_udp_port_used(NULL, localPort + 1)) {
 		LOG_DEBUG("UDP port 5060 is busy, will use 5061");
 		return localPort + 1;
 	} else {
@@ -159,7 +160,12 @@ unsigned NetworkDiscovery::getFreeLocalP
 			LOG_DEBUG("cannot get a free local port");
 			localPort = 0;
 		}
-		LOG_DEBUG("UDP port 5061 is busy, will use random port number : " + String::fromNumber(localPort));
+		if (!randomPort) {
+			LOG_DEBUG("UDP port 5061 is busy, will use random port number : " + String::fromNumber(localPort));
+		} else {
+			LOG_DEBUG("UDP port set to random, will use random port number : " + String::fromNumber(localPort));
+		}
+
 		return localPort;
 	}
 }


Any ideas?

Greetings,
 - Darsha



More information about the QuteCom-dev mailing list