1
0
mirror of https://github.com/danog/libtgvoip.git synced 2024-12-02 09:37:52 +01:00
This commit is contained in:
Grishka 2018-07-29 21:21:34 +03:00
parent 100f7ecbd8
commit 8faf6f6700
2 changed files with 29 additions and 8 deletions

View File

@ -526,7 +526,8 @@ void VoIPController::InitializeTimers(){
}, 0.1, 0.1); }, 0.1, 0.1);
} }
messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5); udpConnectivityState=UDP_PING_PENDING;
udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5);
messageThread.Post(std::bind(&VoIPController::SendRelayPings, this), 0.0, 2.0); messageThread.Post(std::bind(&VoIPController::SendRelayPings, this), 0.0, 2.0);
} }
@ -1891,7 +1892,7 @@ void VoIPController::SetNetworkType(int type){
if(itfName!=activeNetItfName){ if(itfName!=activeNetItfName){
udpSocket->OnActiveInterfaceChanged(); udpSocket->OnActiveInterfaceChanged();
LOGI("Active network interface changed: %s -> %s", activeNetItfName.c_str(), itfName.c_str()); LOGI("Active network interface changed: %s -> %s", activeNetItfName.c_str(), itfName.c_str());
bool isFirstChange=activeNetItfName.length()==0; bool isFirstChange=activeNetItfName.length()==0 && state!=STATE_ESTABLISHED && state!=STATE_RECONNECTING;
activeNetItfName=itfName; activeNetItfName=itfName;
if(isFirstChange) if(isFirstChange)
return; return;
@ -1921,8 +1922,6 @@ void VoIPController::SetNetworkType(int type){
} }
} }
} }
udpConnectivityState=UDP_UNKNOWN;
udpPingCount=0;
lastUdpPingTime=0; lastUdpPingTime=0;
if(proxyProtocol==PROXY_SOCKS5) if(proxyProtocol==PROXY_SOCKS5)
InitUDPProxy(); InitUDPProxy();
@ -1939,9 +1938,9 @@ void VoIPController::SetNetworkType(int type){
} }
selectCanceller->CancelSelect(); selectCanceller->CancelSelect();
didSendIPv6Endpoint=false; didSendIPv6Endpoint=false;
udpPingCount=0;
AddIPv6Relays(); AddIPv6Relays();
ResetUdpAvailability();
} }
LOGI("set network type: %d, active interface %s", type, activeNetItfName.c_str()); LOGI("set network type: %d, active interface %s", type, activeNetItfName.c_str());
} }
@ -2747,6 +2746,22 @@ void VoIPController::SetEchoCancellationStrength(int strength){
echoCanceller->SetAECStrength(strength); echoCanceller->SetAECStrength(strength);
} }
void VoIPController::ResetUdpAvailability(){
LOGI("Resetting UDP availability");
if(udpPingTimeoutID!=MessageThread::INVALID_ID){
messageThread.Cancel(udpPingTimeoutID);
}
{
MutexGuard m(endpointsMutex);
for(shared_ptr<Endpoint>& e:endpoints){
e->udpPongCount=0;
}
}
udpPingCount=0;
udpConnectivityState=UDP_PING_PENDING;
udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.0, 0.5);
}
#pragma mark - Timer methods #pragma mark - Timer methods
void VoIPController::SendUdpPings(){ void VoIPController::SendUdpPings(){
@ -2755,12 +2770,12 @@ void VoIPController::SendUdpPings(){
SendUdpPing(e); SendUdpPing(e);
} }
} }
if(udpConnectivityState==UDP_UNKNOWN) if(udpConnectivityState==UDP_UNKNOWN || udpConnectivityState==UDP_PING_PENDING)
udpConnectivityState=UDP_PING_SENT; udpConnectivityState=UDP_PING_SENT;
udpPingCount++; udpPingCount++;
if(udpPingCount==4 || udpPingCount==10){ if(udpPingCount==4 || udpPingCount==10){
messageThread.CancelSelf(); messageThread.CancelSelf();
messageThread.Post(std::bind(&VoIPController::EvaluateUdpPingResults, this), 1.0); udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::EvaluateUdpPingResults, this), 1.0);
} }
} }
@ -2795,11 +2810,13 @@ void VoIPController::EvaluateUdpPingResults(){
useTCP=true; useTCP=true;
AddTCPRelays(); AddTCPRelays();
setCurrentEndpointToTCP=true; setCurrentEndpointToTCP=true;
messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.5, 0.5); udpPingTimeoutID=messageThread.Post(std::bind(&VoIPController::SendUdpPings, this), 0.5, 0.5);
}else{ }else{
udpPingTimeoutID=MessageThread::INVALID_ID;
udpConnectivityState=UDP_AVAILABLE; udpConnectivityState=UDP_AVAILABLE;
} }
}else{ }else{
udpPingTimeoutID=MessageThread::INVALID_ID;
udpConnectivityState=UDP_NOT_AVAILABLE; udpConnectivityState=UDP_NOT_AVAILABLE;
} }
} }
@ -2966,6 +2983,7 @@ void VoIPController::UpdateAudioBitrate(){
if(state==STATE_ESTABLISHED && time-lastRecvPacketTime>=reconnectingTimeout){ if(state==STATE_ESTABLISHED && time-lastRecvPacketTime>=reconnectingTimeout){
SetState(STATE_RECONNECTING); SetState(STATE_RECONNECTING);
ResetUdpAvailability();
} }
if(state==STATE_ESTABLISHED || state==STATE_RECONNECTING){ if(state==STATE_ESTABLISHED || state==STATE_RECONNECTING){

View File

@ -436,6 +436,7 @@ namespace tgvoip{
}; };
enum{ enum{
UDP_UNKNOWN=0, UDP_UNKNOWN=0,
UDP_PING_PENDING,
UDP_PING_SENT, UDP_PING_SENT,
UDP_AVAILABLE, UDP_AVAILABLE,
UDP_NOT_AVAILABLE, UDP_NOT_AVAILABLE,
@ -475,6 +476,7 @@ namespace tgvoip{
void UpdateQueuedPackets(); void UpdateQueuedPackets();
void SendNopPacket(); void SendNopPacket();
void TickJitterBufferAngCongestionControl(); void TickJitterBufferAngCongestionControl();
void ResetUdpAvailability();
int state; int state;
std::vector<std::shared_ptr<Endpoint>> endpoints; std::vector<std::shared_ptr<Endpoint>> endpoints;
@ -594,6 +596,7 @@ namespace tgvoip{
uint32_t initTimeoutID=MessageThread::INVALID_ID; uint32_t initTimeoutID=MessageThread::INVALID_ID;
uint32_t noStreamsNopID=MessageThread::INVALID_ID; uint32_t noStreamsNopID=MessageThread::INVALID_ID;
uint32_t udpPingTimeoutID=MessageThread::INVALID_ID;
/*** server config values ***/ /*** server config values ***/
uint32_t maxAudioBitrate; uint32_t maxAudioBitrate;