} else {
tr.tcp_port=lp_config_get_int(lc->config,"sip","sip_tcp_port",0);
}
+ if (lp_config_get_int(lc->config,"sip","sip_tls_random_port",0)) {
+ tr.tls_port=(0xDFF&+random())+1024;
+ } else {
+ tr.tls_port=lp_config_get_int(lc->config,"sip","sip_tls_port",0);
+ }
/*start listening on ports*/
linphone_core_set_sip_transports(lc,&tr);
int linphone_core_get_sip_port(LinphoneCore *lc)
{
LCSipTransports *tr=&lc->sip_conf.transports;
- return tr->udp_port>0 ? tr->udp_port : tr->tcp_port;
+ return tr->udp_port>0 ? tr->udp_port : (tr->tcp_port > 0 ? tr->tcp_port : tr->tls_port);
}
static char _ua_name[64]="Linphone";
sal_unlisten_ports (sal);
if (tr->udp_port>0){
if (sal_listen_port (sal,anyaddr,tr->udp_port,SalTransportUDP,FALSE)!=0){
- transport_error(lc,"UDP",tr->udp_port);
+ transport_error(lc,"udp",tr->udp_port);
return -1;
}
}
if (tr->tcp_port>0){
if (sal_listen_port (sal,anyaddr,tr->tcp_port,SalTransportTCP,FALSE)!=0){
- transport_error(lc,"TCP",tr->tcp_port);
+ transport_error(lc,"tcp",tr->tcp_port);
+ }
+ }
+ if (tr->tls_port>0){
+ if (sal_listen_port (sal,anyaddr,tr->tls_port,SalTransportTLS,TRUE)!=0){
+ transport_error(lc,"tls",tr->tls_port);
}
}
apply_user_agent(lc);
sip_config_t *config=&lc->sip_conf;
lp_config_set_int(lc->config,"sip","sip_port",config->transports.udp_port);
lp_config_set_int(lc->config,"sip","sip_tcp_port",config->transports.tcp_port);
+ lp_config_set_int(lc->config,"sip","sip_tls_port",config->transports.tls_port);
lp_config_set_int(lc->config,"sip","guess_hostname",config->guess_hostname);
lp_config_set_string(lc->config,"sip","contact",config->contact);
lp_config_set_int(lc->config,"sip","inc_timeout",config->inc_timeout);
linphone_address_set_display_name(contact,NULL);
linphone_core_get_sip_transports(obj->lc,&tr);
- if (tr.udp_port <= 0 && tr.tcp_port>0) {
- sal_address_set_param(contact,"transport","TCP");
+ if (tr.udp_port <= 0) {
+ if (tr.tcp_port>0) {
+ sal_address_set_param(contact,"transport","tcp");
+ } else if (tr.tls_port>0) {
+ sal_address_set_param(contact,"transport","tls");
+ }
}
ret=linphone_address_as_string(contact);
linphone_address_destroy(contact);
#include "sal.h"
const char* sal_transport_to_string(SalTransport transport) {
switch (transport) {
- case SalTransportUDP:return "UDP";
- case SalTransportTCP: return "TCP";
- case SalTransportTLS:return "TLS";
- case SalTransportDTLS:return "DTLS";
+ case SalTransportUDP:return "udp";
+ case SalTransportTCP: return "tcp";
+ case SalTransportTLS:return "tls";
+ case SalTransportDTLS:return "dtls";
default: {
ms_fatal("Unexpected transport [%i]",transport);
return NULL;
}
}
SalTransport sal_transport_parse(const char* param) {
- if (strcasecmp("UDP",param)==0) return SalTransportUDP;
- if (strcasecmp("TCP",param)==0) return SalTransportTCP;
- if (strcasecmp("TLS",param)==0) return SalTransportTLS;
- if (strcasecmp("DTLS",param)==0) return SalTransportDTLS;
+ if (strcasecmp("udp",param)==0) return SalTransportUDP;
+ if (strcasecmp("tcp",param)==0) return SalTransportTCP;
+ if (strcasecmp("tls",param)==0) return SalTransportTLS;
+ if (strcasecmp("dtls",param)==0) return SalTransportDTLS;
ms_error("Unkown transport type[%s], returning UDP", param);
return SalTransportUDP;
}
eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive);
break;
case SalTransportTCP:
+ case SalTransportTLS:
proto= IPPROTO_TCP;
keepalive=-1;
eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive);
ipv6=strchr(addr,':')!=NULL;
eXosip_enable_ipv6(ipv6);
- if (is_secure){
- ms_fatal("SIP over TLS or DTLS is not supported yet.");
+ if (is_secure && tr == SalTransportUDP){
+ ms_fatal("SIP over DTLS is not supported yet.");
return -1;
}
- err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, 0);
+ err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure);
#ifdef HAVE_EXOSIP_GET_SOCKET
ms_message("Exosip has socket number %i",eXosip_get_socket(proto));
#endif