Skip to content
Snippets Groups Projects
Commit 3e0460fd authored by Emmanuel Milou's avatar Emmanuel Milou Committed by Alexandre Savard
Browse files

#8335 Fix default transport initialization on 5062, 5064

parent 2a6c8f12
No related branches found
No related tags found
No related merge requests found
......@@ -1288,13 +1288,34 @@ pj_status_t SIPVoIPLink::stunServerResolve(SIPAccount *account)
return status;
}
#define DEFAULT_TRANSPORT_ATTEMPT 5
void SIPVoIPLink::createDefaultSipUdpTransport()
{
pjsip_transport *transport = NULL;
pj_uint16_t port = 0;
int counter = 0;
SIPAccount *account = dynamic_cast<SIPAccount *>(Manager::instance().getAccount(IP2IP_PROFILE));
createUdpTransport(account);
assert(account->transport_);
while((transport == NULL) and (counter < DEFAULT_TRANSPORT_ATTEMPT)) {
// if default udp transport fails to init on 5060, try other ports with 2 step size increment (i.e. 5062, 5064, ...)
port = account->getLocalPort() + (counter * 2);
transport = createUdpTransport(account->getLocalInterface(), port);
counter++;
}
if(transport == NULL) {
ERROR("UserAgent: Create UDP transport ");
return;
}
DEBUG("UserAgent: Created defautl sip transport on %d", port);
// set transport for this account
account->transport_ = transport;
// set local udp transport
localUDPTransport_ = account->transport_;
}
......@@ -1340,6 +1361,11 @@ void SIPVoIPLink::createSipTransport(SIPAccount *account)
{
shutdownSipTransport(account);
if(account == NULL) {
ERROR("Acccount is NULL while creating sip transport");
return;
}
if (account->isTlsEnabled()) {
std::string remoteSipUri(account->getServerUri());
static const char SIPS_PREFIX[] = "<sips:";
......@@ -1350,8 +1376,10 @@ void SIPVoIPLink::createSipTransport(SIPAccount *account)
createTlsTransport(account, remoteAddr);
} else if (account->isStunEnabled())
createStunTransport(account);
else
createUdpTransport(account);
else {
pjsip_transport *transport = createUdpTransport(account->getLocalInterface(), account->getLocalPort());
account->transport_ = transport;
}
if (!account->transport_) {
// Could not create new transport, this transport may already exists
......@@ -1366,47 +1394,70 @@ void SIPVoIPLink::createSipTransport(SIPAccount *account)
}
}
void SIPVoIPLink::createUdpTransport(SIPAccount *account)
#define DEFAULT_INTERFACE "default"
pjsip_transport *SIPVoIPLink::createUdpTransport(std::string interface, unsigned int port)
{
pjsip_transport *transport = NULL;
std::string listeningAddress;
pj_uint16_t listeningPort = account->getLocalPort();
pj_uint16_t listeningPort = (pj_uint16_t)port;
pj_status_t status = PJ_SUCCESS;
// init socket to bind this transport to
pj_sockaddr_in bound_addr;
pj_bzero(&bound_addr, sizeof(bound_addr));
bound_addr.sin_port = pj_htons(listeningPort);
bound_addr.sin_family = PJ_AF_INET;
if (account->getLocalInterface() == "default") {
// determine the ip address for this transport
if (interface == DEFAULT_INTERFACE) {
listeningAddress = getSIPLocalIP();
bound_addr.sin_addr.s_addr = pj_htonl(PJ_INADDR_ANY);
} else {
listeningAddress = getInterfaceAddrFromName(account->getLocalInterface());
listeningAddress = getInterfaceAddrFromName(interface);
bound_addr.sin_addr = pj_inet_addr2(listeningAddress.c_str());
}
/*
if (!account->getPublishedSameasLocal()) {
listeningAddress = account->getPublishedAddress();
listeningPort = account->getPublishedPort();
}
*/
// We must specify this here to avoid the IP2IP_PROFILE creating a
// transport with the name 0.0.0.0 appearing in the via header
if (account->getAccountID() == IP2IP_PROFILE)
listeningAddress = getSIPLocalIP();
// if (account->getAccountID() == IP2IP_PROFILE)
// listeningAddress = getSIPLocalIP();
if (listeningAddress.empty() or listeningPort == 0)
return;
if (listeningAddress.empty()) {
ERROR("SIP: Could not determine ip address for this transport");
return NULL;
}
if(listeningPort == 0) {
ERROR("SIP: Could not determine port for this transport");
return NULL;
}
// The published address for this transport
const pjsip_host_port a_name = {
pj_str((char*) listeningAddress.c_str()),
listeningPort
};
pjsip_udp_transport_start(endpt_, &bound_addr, &a_name, 1, &account->transport_);
pjsip_tpmgr_dump_transports(pjsip_endpt_get_tpmgr(endpt_)); // dump debug information to stdout
status = pjsip_udp_transport_start(endpt_, &bound_addr, &a_name, 1, &transport);
if(status != PJ_SUCCESS) {
ERROR("SIP: Could not create udp transport");
return NULL;
}
// dump debug information to stdout
pjsip_tpmgr_dump_transports(pjsip_endpt_get_tpmgr(endpt_));
transportMap_[listeningPort] = transport;
if (account->transport_)
transportMap_[account->getLocalPort()] = account->transport_;
return transport;
}
pjsip_tpselector *SIPVoIPLink::initTransportSelector(pjsip_transport *transport, pj_pool_t *tp_pool) const
......
......@@ -327,7 +327,7 @@ class SIPVoIPLink : public VoIPLink {
* Create SIP UDP transport from account's setting
* @param account The account for which a transport must be created.
*/
void createUdpTransport(SIPAccount *account);
pjsip_transport *createUdpTransport(std::string interface, unsigned int port);
/**
* Create a TLS transport from the default TLS listener from
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment