X-Git-Url: http://sjero.net/git/?p=linphone;a=blobdiff_plain;f=coreapi%2FTunnelManager.cc;h=409f9c42a83635c41ba6ff2890b7166aae46d9f6;hp=9b5dffd29c306bed85a946715eedd7e4f87dab90;hb=5f0d5793b7e65a518076de6f8e253770503f8824;hpb=239e4f553b425ab09ac097b8b2cfbb4d75cf2047 diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc index 9b5dffd2..409f9c42 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -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); } @@ -181,7 +189,7 @@ bool TunnelManager::isStarted() { } bool TunnelManager::isReady() const { - return mTunnelClient && mTunnelClient->isReady(); + return mTunnelClient && mTunnelClient->isReady() && mReady; } int TunnelManager::customSendto(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen){ @@ -206,6 +214,7 @@ TunnelManager::TunnelManager(LinphoneCore* lc) :TunnelClientController() ,mEnabled(false) ,mTunnelClient(NULL) ,mAutoDetectStarted(false) +,mReady(false) ,mHttpProxyPort(0){ mExosipTransport.data=this; @@ -253,16 +262,17 @@ void TunnelManager::processTunnelEvent(const Event &ev){ //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); } + mReady=true; }else if (mEnabled && !mTunnelClient->isReady()){ /* we got disconnected from the tunnel */ if (lProxy && linphone_proxy_config_is_registered(lProxy)) { @@ -270,6 +280,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){ linphone_proxy_config_edit(lProxy); linphone_core_iterate(mCore); } + mReady=false; } } @@ -309,7 +320,7 @@ void TunnelManager::enable(bool isEnable) { mEnabled=false; stopClient(); - + mReady=false; linphone_core_set_rtp_transport_factories(mCore,NULL); eXosip_transport_hook_register(NULL); @@ -355,7 +366,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; @@ -363,9 +375,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*/ @@ -376,7 +388,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 @@ -399,6 +411,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");