| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1089 } | 1089 } |
| 1090 | 1090 |
| 1091 // AllocationSequence | 1091 // AllocationSequence |
| 1092 | 1092 |
| 1093 AllocationSequence::AllocationSequence(BasicPortAllocatorSession* session, | 1093 AllocationSequence::AllocationSequence(BasicPortAllocatorSession* session, |
| 1094 rtc::Network* network, | 1094 rtc::Network* network, |
| 1095 PortConfiguration* config, | 1095 PortConfiguration* config, |
| 1096 uint32_t flags) | 1096 uint32_t flags) |
| 1097 : session_(session), | 1097 : session_(session), |
| 1098 network_(network), | 1098 network_(network), |
| 1099 ip_(network->GetBestIP()), | |
| 1100 config_(config), | 1099 config_(config), |
| 1101 state_(kInit), | 1100 state_(kInit), |
| 1102 flags_(flags), | 1101 flags_(flags), |
| 1103 udp_socket_(), | 1102 udp_socket_(), |
| 1104 udp_port_(NULL), | 1103 udp_port_(NULL), |
| 1105 phase_(0) { | 1104 phase_(0) { |
| 1106 } | 1105 } |
| 1107 | 1106 |
| 1108 void AllocationSequence::Init() { | 1107 void AllocationSequence::Init() { |
| 1109 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { | 1108 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { |
| 1110 udp_socket_.reset(session_->socket_factory()->CreateUdpSocket( | 1109 udp_socket_.reset(session_->socket_factory()->CreateUdpSocket( |
| 1111 rtc::SocketAddress(ip_, 0), session_->allocator()->min_port(), | 1110 rtc::SocketAddress(network_->GetBestIP(), 0), |
| 1112 session_->allocator()->max_port())); | 1111 session_->allocator()->min_port(), session_->allocator()->max_port())); |
| 1113 if (udp_socket_) { | 1112 if (udp_socket_) { |
| 1114 udp_socket_->SignalReadPacket.connect( | 1113 udp_socket_->SignalReadPacket.connect( |
| 1115 this, &AllocationSequence::OnReadPacket); | 1114 this, &AllocationSequence::OnReadPacket); |
| 1116 } | 1115 } |
| 1117 // Continuing if |udp_socket_| is NULL, as local TCP and RelayPort using TCP | 1116 // Continuing if |udp_socket_| is NULL, as local TCP and RelayPort using TCP |
| 1118 // are next available options to setup a communication channel. | 1117 // are next available options to setup a communication channel. |
| 1119 } | 1118 } |
| 1120 } | 1119 } |
| 1121 | 1120 |
| 1122 void AllocationSequence::Clear() { | 1121 void AllocationSequence::Clear() { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1136 } | 1135 } |
| 1137 | 1136 |
| 1138 void AllocationSequence::DisableEquivalentPhases(rtc::Network* network, | 1137 void AllocationSequence::DisableEquivalentPhases(rtc::Network* network, |
| 1139 PortConfiguration* config, uint32_t* flags) { | 1138 PortConfiguration* config, uint32_t* flags) { |
| 1140 if (network_failed_) { | 1139 if (network_failed_) { |
| 1141 // If the network of this allocation sequence has ever become failed, | 1140 // If the network of this allocation sequence has ever become failed, |
| 1142 // it won't be equivalent to the new network. | 1141 // it won't be equivalent to the new network. |
| 1143 return; | 1142 return; |
| 1144 } | 1143 } |
| 1145 | 1144 |
| 1146 if (!((network == network_) && (ip_ == network->GetBestIP()))) { | 1145 if (!((network == network_) && (previous_best_ip_ == network->GetBestIP()))) { |
| 1147 // Different network setup; nothing is equivalent. | 1146 // Different network setup; nothing is equivalent. |
| 1148 return; | 1147 return; |
| 1149 } | 1148 } |
| 1150 | 1149 |
| 1151 // Else turn off the stuff that we've already got covered. | 1150 // Else turn off the stuff that we've already got covered. |
| 1152 | 1151 |
| 1153 // Every config implicitly specifies local, so turn that off right away. | 1152 // Every config implicitly specifies local, so turn that off right away. |
| 1154 *flags |= PORTALLOCATOR_DISABLE_UDP; | 1153 *flags |= PORTALLOCATOR_DISABLE_UDP; |
| 1155 *flags |= PORTALLOCATOR_DISABLE_TCP; | 1154 *flags |= PORTALLOCATOR_DISABLE_TCP; |
| 1156 | 1155 |
| 1157 if (config_ && config) { | 1156 if (config_ && config) { |
| 1158 if (config_->StunServers() == config->StunServers()) { | 1157 if (config_->StunServers() == config->StunServers()) { |
| 1159 // Already got this STUN servers covered. | 1158 // Already got this STUN servers covered. |
| 1160 *flags |= PORTALLOCATOR_DISABLE_STUN; | 1159 *flags |= PORTALLOCATOR_DISABLE_STUN; |
| 1161 } | 1160 } |
| 1162 if (!config_->relays.empty()) { | 1161 if (!config_->relays.empty()) { |
| 1163 // Already got relays covered. | 1162 // Already got relays covered. |
| 1164 // NOTE: This will even skip a _different_ set of relay servers if we | 1163 // NOTE: This will even skip a _different_ set of relay servers if we |
| 1165 // were to be given one, but that never happens in our codebase. Should | 1164 // were to be given one, but that never happens in our codebase. Should |
| 1166 // probably get rid of the list in PortConfiguration and just keep a | 1165 // probably get rid of the list in PortConfiguration and just keep a |
| 1167 // single relay server in each one. | 1166 // single relay server in each one. |
| 1168 *flags |= PORTALLOCATOR_DISABLE_RELAY; | 1167 *flags |= PORTALLOCATOR_DISABLE_RELAY; |
| 1169 } | 1168 } |
| 1170 } | 1169 } |
| 1171 } | 1170 } |
| 1172 | 1171 |
| 1173 void AllocationSequence::Start() { | 1172 void AllocationSequence::Start() { |
| 1174 state_ = kRunning; | 1173 state_ = kRunning; |
| 1175 session_->network_thread()->Post(RTC_FROM_HERE, this, MSG_ALLOCATION_PHASE); | 1174 session_->network_thread()->Post(RTC_FROM_HERE, this, MSG_ALLOCATION_PHASE); |
| 1175 // Take a snapshot of the best IP, so that when DisableEquivalentPhases is |
| 1176 // called next time, we enable all phases if the best IP has since changed. |
| 1177 previous_best_ip_ = network_->GetBestIP(); |
| 1176 } | 1178 } |
| 1177 | 1179 |
| 1178 void AllocationSequence::Stop() { | 1180 void AllocationSequence::Stop() { |
| 1179 // If the port is completed, don't set it to stopped. | 1181 // If the port is completed, don't set it to stopped. |
| 1180 if (state_ == kRunning) { | 1182 if (state_ == kRunning) { |
| 1181 state_ = kStopped; | 1183 state_ = kStopped; |
| 1182 session_->network_thread()->Clear(this, MSG_ALLOCATION_PHASE); | 1184 session_->network_thread()->Clear(this, MSG_ALLOCATION_PHASE); |
| 1183 } | 1185 } |
| 1184 } | 1186 } |
| 1185 | 1187 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1260 UDPPort* port = NULL; | 1262 UDPPort* port = NULL; |
| 1261 bool emit_local_candidate_for_anyaddress = | 1263 bool emit_local_candidate_for_anyaddress = |
| 1262 !IsFlagSet(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE); | 1264 !IsFlagSet(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE); |
| 1263 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && udp_socket_) { | 1265 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && udp_socket_) { |
| 1264 port = UDPPort::Create( | 1266 port = UDPPort::Create( |
| 1265 session_->network_thread(), session_->socket_factory(), network_, | 1267 session_->network_thread(), session_->socket_factory(), network_, |
| 1266 udp_socket_.get(), session_->username(), session_->password(), | 1268 udp_socket_.get(), session_->username(), session_->password(), |
| 1267 session_->allocator()->origin(), emit_local_candidate_for_anyaddress); | 1269 session_->allocator()->origin(), emit_local_candidate_for_anyaddress); |
| 1268 } else { | 1270 } else { |
| 1269 port = UDPPort::Create( | 1271 port = UDPPort::Create( |
| 1270 session_->network_thread(), session_->socket_factory(), network_, ip_, | 1272 session_->network_thread(), session_->socket_factory(), network_, |
| 1271 session_->allocator()->min_port(), session_->allocator()->max_port(), | 1273 session_->allocator()->min_port(), session_->allocator()->max_port(), |
| 1272 session_->username(), session_->password(), | 1274 session_->username(), session_->password(), |
| 1273 session_->allocator()->origin(), emit_local_candidate_for_anyaddress); | 1275 session_->allocator()->origin(), emit_local_candidate_for_anyaddress); |
| 1274 } | 1276 } |
| 1275 | 1277 |
| 1276 if (port) { | 1278 if (port) { |
| 1277 // If shared socket is enabled, STUN candidate will be allocated by the | 1279 // If shared socket is enabled, STUN candidate will be allocated by the |
| 1278 // UDPPort. | 1280 // UDPPort. |
| 1279 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { | 1281 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { |
| 1280 udp_port_ = port; | 1282 udp_port_ = port; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1293 session_->AddAllocatedPort(port, this, true); | 1295 session_->AddAllocatedPort(port, this, true); |
| 1294 } | 1296 } |
| 1295 } | 1297 } |
| 1296 | 1298 |
| 1297 void AllocationSequence::CreateTCPPorts() { | 1299 void AllocationSequence::CreateTCPPorts() { |
| 1298 if (IsFlagSet(PORTALLOCATOR_DISABLE_TCP)) { | 1300 if (IsFlagSet(PORTALLOCATOR_DISABLE_TCP)) { |
| 1299 LOG(LS_VERBOSE) << "AllocationSequence: TCP ports disabled, skipping."; | 1301 LOG(LS_VERBOSE) << "AllocationSequence: TCP ports disabled, skipping."; |
| 1300 return; | 1302 return; |
| 1301 } | 1303 } |
| 1302 | 1304 |
| 1303 Port* port = TCPPort::Create(session_->network_thread(), | 1305 Port* port = TCPPort::Create( |
| 1304 session_->socket_factory(), | 1306 session_->network_thread(), session_->socket_factory(), network_, |
| 1305 network_, ip_, | 1307 session_->allocator()->min_port(), session_->allocator()->max_port(), |
| 1306 session_->allocator()->min_port(), | 1308 session_->username(), session_->password(), |
| 1307 session_->allocator()->max_port(), | 1309 session_->allocator()->allow_tcp_listen()); |
| 1308 session_->username(), session_->password(), | |
| 1309 session_->allocator()->allow_tcp_listen()); | |
| 1310 if (port) { | 1310 if (port) { |
| 1311 session_->AddAllocatedPort(port, this, true); | 1311 session_->AddAllocatedPort(port, this, true); |
| 1312 // Since TCPPort is not created using shared socket, |port| will not be | 1312 // Since TCPPort is not created using shared socket, |port| will not be |
| 1313 // added to the dequeue. | 1313 // added to the dequeue. |
| 1314 } | 1314 } |
| 1315 } | 1315 } |
| 1316 | 1316 |
| 1317 void AllocationSequence::CreateStunPorts() { | 1317 void AllocationSequence::CreateStunPorts() { |
| 1318 if (IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) { | 1318 if (IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) { |
| 1319 LOG(LS_VERBOSE) << "AllocationSequence: STUN ports disabled, skipping."; | 1319 LOG(LS_VERBOSE) << "AllocationSequence: STUN ports disabled, skipping."; |
| 1320 return; | 1320 return; |
| 1321 } | 1321 } |
| 1322 | 1322 |
| 1323 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { | 1323 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) { |
| 1324 return; | 1324 return; |
| 1325 } | 1325 } |
| 1326 | 1326 |
| 1327 if (!(config_ && !config_->StunServers().empty())) { | 1327 if (!(config_ && !config_->StunServers().empty())) { |
| 1328 LOG(LS_WARNING) | 1328 LOG(LS_WARNING) |
| 1329 << "AllocationSequence: No STUN server configured, skipping."; | 1329 << "AllocationSequence: No STUN server configured, skipping."; |
| 1330 return; | 1330 return; |
| 1331 } | 1331 } |
| 1332 | 1332 |
| 1333 StunPort* port = StunPort::Create(session_->network_thread(), | 1333 StunPort* port = StunPort::Create( |
| 1334 session_->socket_factory(), | 1334 session_->network_thread(), session_->socket_factory(), network_, |
| 1335 network_, ip_, | 1335 session_->allocator()->min_port(), session_->allocator()->max_port(), |
| 1336 session_->allocator()->min_port(), | 1336 session_->username(), session_->password(), config_->StunServers(), |
| 1337 session_->allocator()->max_port(), | 1337 session_->allocator()->origin()); |
| 1338 session_->username(), session_->password(), | |
| 1339 config_->StunServers(), | |
| 1340 session_->allocator()->origin()); | |
| 1341 if (port) { | 1338 if (port) { |
| 1342 session_->AddAllocatedPort(port, this, true); | 1339 session_->AddAllocatedPort(port, this, true); |
| 1343 // Since StunPort is not created using shared socket, |port| will not be | 1340 // Since StunPort is not created using shared socket, |port| will not be |
| 1344 // added to the dequeue. | 1341 // added to the dequeue. |
| 1345 } | 1342 } |
| 1346 } | 1343 } |
| 1347 | 1344 |
| 1348 void AllocationSequence::CreateRelayPorts() { | 1345 void AllocationSequence::CreateRelayPorts() { |
| 1349 if (IsFlagSet(PORTALLOCATOR_DISABLE_RELAY)) { | 1346 if (IsFlagSet(PORTALLOCATOR_DISABLE_RELAY)) { |
| 1350 LOG(LS_VERBOSE) << "AllocationSequence: Relay ports disabled, skipping."; | 1347 LOG(LS_VERBOSE) << "AllocationSequence: Relay ports disabled, skipping."; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1366 } else if (relay.type == RELAY_TURN) { | 1363 } else if (relay.type == RELAY_TURN) { |
| 1367 CreateTurnPort(relay); | 1364 CreateTurnPort(relay); |
| 1368 } else { | 1365 } else { |
| 1369 RTC_NOTREACHED(); | 1366 RTC_NOTREACHED(); |
| 1370 } | 1367 } |
| 1371 } | 1368 } |
| 1372 } | 1369 } |
| 1373 | 1370 |
| 1374 void AllocationSequence::CreateGturnPort(const RelayServerConfig& config) { | 1371 void AllocationSequence::CreateGturnPort(const RelayServerConfig& config) { |
| 1375 // TODO(mallinath) - Rename RelayPort to GTurnPort. | 1372 // TODO(mallinath) - Rename RelayPort to GTurnPort. |
| 1376 RelayPort* port = RelayPort::Create(session_->network_thread(), | 1373 RelayPort* port = RelayPort::Create( |
| 1377 session_->socket_factory(), | 1374 session_->network_thread(), session_->socket_factory(), network_, |
| 1378 network_, ip_, | 1375 session_->allocator()->min_port(), session_->allocator()->max_port(), |
| 1379 session_->allocator()->min_port(), | 1376 config_->username, config_->password); |
| 1380 session_->allocator()->max_port(), | |
| 1381 config_->username, config_->password); | |
| 1382 if (port) { | 1377 if (port) { |
| 1383 // Since RelayPort is not created using shared socket, |port| will not be | 1378 // Since RelayPort is not created using shared socket, |port| will not be |
| 1384 // added to the dequeue. | 1379 // added to the dequeue. |
| 1385 // Note: We must add the allocated port before we add addresses because | 1380 // Note: We must add the allocated port before we add addresses because |
| 1386 // the latter will create candidates that need name and preference | 1381 // the latter will create candidates that need name and preference |
| 1387 // settings. However, we also can't prepare the address (normally | 1382 // settings. However, we also can't prepare the address (normally |
| 1388 // done by AddAllocatedPort) until we have these addresses. So we | 1383 // done by AddAllocatedPort) until we have these addresses. So we |
| 1389 // wait to do that until below. | 1384 // wait to do that until below. |
| 1390 session_->AddAllocatedPort(port, this, false); | 1385 session_->AddAllocatedPort(port, this, false); |
| 1391 | 1386 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1410 | 1405 |
| 1411 // Skip UDP connections to relay servers if it's disallowed. | 1406 // Skip UDP connections to relay servers if it's disallowed. |
| 1412 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) && | 1407 if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) && |
| 1413 relay_port->proto == PROTO_UDP) { | 1408 relay_port->proto == PROTO_UDP) { |
| 1414 continue; | 1409 continue; |
| 1415 } | 1410 } |
| 1416 | 1411 |
| 1417 // Do not create a port if the server address family is known and does | 1412 // Do not create a port if the server address family is known and does |
| 1418 // not match the local IP address family. | 1413 // not match the local IP address family. |
| 1419 int server_ip_family = relay_port->address.ipaddr().family(); | 1414 int server_ip_family = relay_port->address.ipaddr().family(); |
| 1420 int local_ip_family = ip_.family(); | 1415 int local_ip_family = network_->GetBestIP().family(); |
| 1421 if (server_ip_family != AF_UNSPEC && server_ip_family != local_ip_family) { | 1416 if (server_ip_family != AF_UNSPEC && server_ip_family != local_ip_family) { |
| 1422 LOG(LS_INFO) << "Server and local address families are not compatible. " | 1417 LOG(LS_INFO) << "Server and local address families are not compatible. " |
| 1423 << "Server address: " | 1418 << "Server address: " |
| 1424 << relay_port->address.ipaddr().ToString() | 1419 << relay_port->address.ipaddr().ToString() |
| 1425 << " Local address: " << ip_.ToString(); | 1420 << " Local address: " << network_->GetBestIP().ToString(); |
| 1426 continue; | 1421 continue; |
| 1427 } | 1422 } |
| 1428 | 1423 |
| 1429 | 1424 |
| 1430 // Shared socket mode must be enabled only for UDP based ports. Hence | 1425 // Shared socket mode must be enabled only for UDP based ports. Hence |
| 1431 // don't pass shared socket for ports which will create TCP sockets. | 1426 // don't pass shared socket for ports which will create TCP sockets. |
| 1432 // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled | 1427 // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled |
| 1433 // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537 | 1428 // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537 |
| 1434 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && | 1429 if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && |
| 1435 relay_port->proto == PROTO_UDP && udp_socket_) { | 1430 relay_port->proto == PROTO_UDP && udp_socket_) { |
| 1436 port = TurnPort::Create(session_->network_thread(), | 1431 port = TurnPort::Create(session_->network_thread(), |
| 1437 session_->socket_factory(), | 1432 session_->socket_factory(), |
| 1438 network_, udp_socket_.get(), | 1433 network_, udp_socket_.get(), |
| 1439 session_->username(), session_->password(), | 1434 session_->username(), session_->password(), |
| 1440 *relay_port, config.credentials, config.priority, | 1435 *relay_port, config.credentials, config.priority, |
| 1441 session_->allocator()->origin()); | 1436 session_->allocator()->origin()); |
| 1442 turn_ports_.push_back(port); | 1437 turn_ports_.push_back(port); |
| 1443 // Listen to the port destroyed signal, to allow AllocationSequence to | 1438 // Listen to the port destroyed signal, to allow AllocationSequence to |
| 1444 // remove entrt from it's map. | 1439 // remove entrt from it's map. |
| 1445 port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed); | 1440 port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed); |
| 1446 } else { | 1441 } else { |
| 1447 port = TurnPort::Create(session_->network_thread(), | 1442 port = TurnPort::Create( |
| 1448 session_->socket_factory(), | 1443 session_->network_thread(), session_->socket_factory(), network_, |
| 1449 network_, ip_, | 1444 session_->allocator()->min_port(), session_->allocator()->max_port(), |
| 1450 session_->allocator()->min_port(), | 1445 session_->username(), session_->password(), *relay_port, |
| 1451 session_->allocator()->max_port(), | 1446 config.credentials, config.priority, session_->allocator()->origin()); |
| 1452 session_->username(), | |
| 1453 session_->password(), | |
| 1454 *relay_port, config.credentials, config.priority, | |
| 1455 session_->allocator()->origin()); | |
| 1456 } | 1447 } |
| 1457 RTC_DCHECK(port != NULL); | 1448 RTC_DCHECK(port != NULL); |
| 1458 port->SetTlsCertPolicy(config.tls_cert_policy); | 1449 port->SetTlsCertPolicy(config.tls_cert_policy); |
| 1459 session_->AddAllocatedPort(port, this, true); | 1450 session_->AddAllocatedPort(port, this, true); |
| 1460 } | 1451 } |
| 1461 } | 1452 } |
| 1462 | 1453 |
| 1463 void AllocationSequence::OnReadPacket( | 1454 void AllocationSequence::OnReadPacket( |
| 1464 rtc::AsyncPacketSocket* socket, const char* data, size_t size, | 1455 rtc::AsyncPacketSocket* socket, const char* data, size_t size, |
| 1465 const rtc::SocketAddress& remote_addr, | 1456 const rtc::SocketAddress& remote_addr, |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1579 ServerAddresses servers; | 1570 ServerAddresses servers; |
| 1580 for (size_t i = 0; i < relays.size(); ++i) { | 1571 for (size_t i = 0; i < relays.size(); ++i) { |
| 1581 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { | 1572 if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) { |
| 1582 servers.insert(relays[i].ports.front().address); | 1573 servers.insert(relays[i].ports.front().address); |
| 1583 } | 1574 } |
| 1584 } | 1575 } |
| 1585 return servers; | 1576 return servers; |
| 1586 } | 1577 } |
| 1587 | 1578 |
| 1588 } // namespace cricket | 1579 } // namespace cricket |
| OLD | NEW |