mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
Don't trigger OnNetworkChange when changing from 3G to 4G
This patch is a follow up to https://webrtc-review.googlesource.com/c/src/+/172582 and change so that a switch from CELLULAR_X to CELLULAR_Y does not trigger OnNetworkChange. This is needed as the OnNetworkChange signals triggers BasicPortAllocator to rescan all networks and generate new candidates. The actual adapter type change is still possible to react on using SignalTypeChanged. BUG: webrtc:11473 Change-Id: Icc1a945b8a4df1714c6ec4b02ec759ecada92d7f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/172802 Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30992}
This commit is contained in:
parent
0cc37303d8
commit
c7ea04af91
3 changed files with 81 additions and 3 deletions
|
@ -147,6 +147,18 @@ bool IsIgnoredIPv6(const InterfaceAddress& ip) {
|
||||||
}
|
}
|
||||||
#endif // !defined(__native_client__)
|
#endif // !defined(__native_client__)
|
||||||
|
|
||||||
|
// Note: consider changing to const Network* as arguments
|
||||||
|
// if/when considering other changes that should not trigger
|
||||||
|
// OnNetworksChanged.
|
||||||
|
bool ShouldAdapterChangeTriggerNetworkChange(rtc::AdapterType old_type,
|
||||||
|
rtc::AdapterType new_type) {
|
||||||
|
// skip triggering OnNetworksChanged if
|
||||||
|
// changing from one cellular to another.
|
||||||
|
if (Network::IsCellular(old_type) && Network::IsCellular(new_type))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// These addresses are used as the targets to find out the default local address
|
// These addresses are used as the targets to find out the default local address
|
||||||
|
@ -350,8 +362,11 @@ void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks,
|
||||||
merged_list.push_back(existing_net);
|
merged_list.push_back(existing_net);
|
||||||
if (net->type() != ADAPTER_TYPE_UNKNOWN &&
|
if (net->type() != ADAPTER_TYPE_UNKNOWN &&
|
||||||
net->type() != existing_net->type()) {
|
net->type() != existing_net->type()) {
|
||||||
|
if (ShouldAdapterChangeTriggerNetworkChange(existing_net->type(),
|
||||||
|
net->type())) {
|
||||||
|
*changed = true;
|
||||||
|
}
|
||||||
existing_net->set_type(net->type());
|
existing_net->set_type(net->type());
|
||||||
*changed = true;
|
|
||||||
}
|
}
|
||||||
// If the existing network was not active, networks have changed.
|
// If the existing network was not active, networks have changed.
|
||||||
if (!existing_net->active()) {
|
if (!existing_net->active()) {
|
||||||
|
|
|
@ -409,8 +409,10 @@ class RTC_EXPORT Network {
|
||||||
|
|
||||||
bool IsVpn() const { return type_ == ADAPTER_TYPE_VPN; }
|
bool IsVpn() const { return type_ == ADAPTER_TYPE_VPN; }
|
||||||
|
|
||||||
bool IsCellular() const {
|
bool IsCellular() const { return IsCellular(type_); }
|
||||||
switch (type_) {
|
|
||||||
|
static bool IsCellular(AdapterType type) {
|
||||||
|
switch (type) {
|
||||||
case ADAPTER_TYPE_CELLULAR:
|
case ADAPTER_TYPE_CELLULAR:
|
||||||
case ADAPTER_TYPE_CELLULAR_2G:
|
case ADAPTER_TYPE_CELLULAR_2G:
|
||||||
case ADAPTER_TYPE_CELLULAR_3G:
|
case ADAPTER_TYPE_CELLULAR_3G:
|
||||||
|
|
|
@ -1118,4 +1118,65 @@ TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
|
||||||
manager.StopUpdating();
|
manager.StopUpdating();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test that MergeNetworkList does not set change = true
|
||||||
|
// when changing from cellular_X to cellular_Y.
|
||||||
|
TEST_F(NetworkTest, TestWhenNetworkListChangeReturnsChangedFlag) {
|
||||||
|
BasicNetworkManager manager;
|
||||||
|
|
||||||
|
IPAddress ip1;
|
||||||
|
EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
|
||||||
|
Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net1->set_type(ADAPTER_TYPE_CELLULAR_3G);
|
||||||
|
net1->AddIP(ip1);
|
||||||
|
NetworkManager::NetworkList list;
|
||||||
|
list.push_back(net1);
|
||||||
|
|
||||||
|
{
|
||||||
|
bool changed;
|
||||||
|
MergeNetworkList(manager, list, &changed);
|
||||||
|
EXPECT_TRUE(changed);
|
||||||
|
NetworkManager::NetworkList list2;
|
||||||
|
manager.GetNetworks(&list2);
|
||||||
|
EXPECT_EQ(list2.size(), 1uL);
|
||||||
|
EXPECT_EQ(ADAPTER_TYPE_CELLULAR_3G, list2[0]->type());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify net1 from 3G to 4G
|
||||||
|
{
|
||||||
|
Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
|
||||||
|
net2->AddIP(ip1);
|
||||||
|
list.clear();
|
||||||
|
list.push_back(net2);
|
||||||
|
bool changed;
|
||||||
|
MergeNetworkList(manager, list, &changed);
|
||||||
|
|
||||||
|
// Change from 3G to 4G shall not trigger OnNetworksChanged,
|
||||||
|
// i.e changed = false.
|
||||||
|
EXPECT_FALSE(changed);
|
||||||
|
NetworkManager::NetworkList list2;
|
||||||
|
manager.GetNetworks(&list2);
|
||||||
|
ASSERT_EQ(list2.size(), 1uL);
|
||||||
|
EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't modify.
|
||||||
|
{
|
||||||
|
Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
|
||||||
|
net2->set_type(ADAPTER_TYPE_CELLULAR_4G);
|
||||||
|
net2->AddIP(ip1);
|
||||||
|
list.clear();
|
||||||
|
list.push_back(net2);
|
||||||
|
bool changed;
|
||||||
|
MergeNetworkList(manager, list, &changed);
|
||||||
|
|
||||||
|
// No change.
|
||||||
|
EXPECT_FALSE(changed);
|
||||||
|
NetworkManager::NetworkList list2;
|
||||||
|
manager.GetNetworks(&list2);
|
||||||
|
ASSERT_EQ(list2.size(), 1uL);
|
||||||
|
EXPECT_EQ(ADAPTER_TYPE_CELLULAR_4G, list2[0]->type());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
|
Loading…
Reference in a new issue