]> sjero.net Git - linphone/blobdiff - coreapi/TunnelManager.cc
Aac-eld add missing header according to RFC3640 3.3.6
[linphone] / coreapi / TunnelManager.cc
index 2165a2bf452db65be59839acb532eeced14e218e..d1020b1b2782f6d431fefa607771a1ea4bd05173 100644 (file)
@@ -59,12 +59,12 @@ int TunnelManager::eXosipRecvfrom(int fd, void *buf, size_t len, int flags, stru
 int TunnelManager::eXosipSelect(int max_fds, fd_set *s1, fd_set *s2, fd_set *s3, struct timeval *tv,void* userdata){
        struct timeval begin,cur;
        TunnelManager* lTunnelMgr=(TunnelManager*)userdata;
-       if (tv!=0 && tv->tv_sec){
+       if (s1 && tv!=0 && tv->tv_sec){
                /*this is the select from udp.c, the one that is interesting to us*/
                NativeSocket udp_fd=(NativeSocket)eXosip_get_udp_socket();
                NativeSocket controlfd=(NativeSocket)eXosip_get_control_fd();
 
-               FD_ZERO(s1);            
+               FD_ZERO(s1);
                gettimeofday(&begin,NULL);
                do{
                        struct timeval abit;
@@ -102,11 +102,19 @@ int TunnelManager::eXosipSelect(int max_fds, fd_set *s1, fd_set *s2, fd_set *s3,
 
 
 void TunnelManager::addServer(const char *ip, int port,unsigned int udpMirrorPort,unsigned int delay) {
+       if (ip == NULL) {
+               ip = "";
+               ms_warning("Adding tunnel server with empty ip, it will not work!");
+       }
        addServer(ip,port);
        mUdpMirrorClients.push_back(UdpMirrorClient(ServerAddr(ip,udpMirrorPort),delay));
 }
 
 void TunnelManager::addServer(const char *ip, int port) {
+       if (ip == NULL) {
+               ip = "";
+               ms_warning("Adding tunnel server with empty ip, it will not work!");
+       }
        mServerAddrs.push_back(ServerAddr(ip,port));
        if (mTunnelClient) mTunnelClient->addServer(ip,port);
 }
@@ -246,18 +254,19 @@ void TunnelManager::processTunnelEvent(const Event &ev){
        linphone_core_get_default_proxy(mCore, &lProxy);
 
        if (mEnabled && mTunnelClient->isReady()){
-               ms_message("Tunnel is up, registering now");            
+               ms_message("Tunnel is up, registering now");
+               linphone_core_set_firewall_policy(mCore,LinphonePolicyNoFirewall);
                linphone_core_set_rtp_transport_factories(mCore,&mTransportFactories);
                eXosip_transport_hook_register(&mExosipTransport);
                //force transport to udp
                LCSipTransports lTransport;
                
-               lTransport.udp_port=15060;
+               lTransport.udp_port=(0xDFFF&random())+1024;
                lTransport.tcp_port=0;
                lTransport.tls_port=0;
                lTransport.dtls_port=0;
                
-               linphone_core_set_sip_transports(mCore, &lTransport);           
+               linphone_core_set_sip_transports(mCore, &lTransport);
                //register
                if (lProxy) {
                        linphone_proxy_config_done(lProxy);
@@ -295,8 +304,9 @@ void TunnelManager::enable(bool isEnable) {
        ms_message("Turning tunnel [%s]",(isEnable?"on":"off"));
        if (isEnable && !mEnabled){
                mEnabled=true;
-               //1 save transport 
+               //1 save transport and firewall policy
                linphone_core_get_sip_transports(mCore, &mRegularTransport);
+               mPreviousFirewallPolicy=linphone_core_get_firewall_policy(mCore);
                //2 unregister
                waitUnRegistration();
                //3 insert tunnel
@@ -311,8 +321,9 @@ void TunnelManager::enable(bool isEnable) {
                linphone_core_set_rtp_transport_factories(mCore,NULL);
 
                eXosip_transport_hook_register(NULL);
-               //Restore transport
+               //Restore transport and firewall policy
                linphone_core_set_sip_transports(mCore, &mRegularTransport);
+               linphone_core_set_firewall_policy(mCore, mPreviousFirewallPolicy);
                //register
                LinphoneProxyConfig* lProxy;
                linphone_core_get_default_proxy(mCore, &lProxy);
@@ -352,7 +363,8 @@ void TunnelManager::sOnIterate(TunnelManager *zis){
 }
 
 #ifdef ANDROID
-static void linphone_android_log_handler(int lev, const char *fmt, va_list args){
+extern void linphone_android_log_handler(int prio, const char *fmt, va_list args);
+static void linphone_android_tunnel_log_handler(int lev, const char *fmt, va_list args) {
        int prio;
        switch(lev){
        case TUNNEL_DEBUG:      prio = ANDROID_LOG_DEBUG;       break;
@@ -360,9 +372,9 @@ static void linphone_android_log_handler(int lev, const char *fmt, va_list args)
        case TUNNEL_NOTICE:     prio = ANDROID_LOG_INFO;        break;
        case TUNNEL_WARN:       prio = ANDROID_LOG_WARN;        break;
        case TUNNEL_ERROR:      prio = ANDROID_LOG_ERROR;       break;
-       default:                        prio = ANDROID_LOG_DEFAULT;     break;
+       default:                prio = ANDROID_LOG_DEFAULT;     break;
        }
-       __android_log_vprint(prio, LOG_DOMAIN, fmt, args);
+       linphone_android_log_handler(prio, fmt, args);
 }
 #endif /*ANDROID*/
 
@@ -373,7 +385,7 @@ void TunnelManager::enableLogs(bool value) {
 void TunnelManager::enableLogs(bool isEnabled,LogHandler logHandler) {
        if (logHandler != NULL) SetLogHandler(logHandler);
 #ifdef ANDROID
-       else SetLogHandler(linphone_android_log_handler);
+       else SetLogHandler(linphone_android_tunnel_log_handler);
 #else
        else SetLogHandler(default_log_handler);
 #endif
@@ -396,6 +408,7 @@ void TunnelManager::processUdpMirrorEvent(const Event &ev){
                enable(false);
                mAutoDetectStarted = false;
        } else {
+               mCurrentUdpMirrorClient++;
                if (mCurrentUdpMirrorClient !=mUdpMirrorClients.end()) {
                        // enable tunnel but also try backup server
                        LOGI("Tunnel is required, enabling; Trying backup udp mirror");