OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 break; | 323 break; |
324 } | 324 } |
325 case INVALID: | 325 case INVALID: |
326 default: | 326 default: |
327 LOG(WARNING) << "Configuration not supported: " << url; | 327 LOG(WARNING) << "Configuration not supported: " << url; |
328 return false; | 328 return false; |
329 } | 329 } |
330 return true; | 330 return true; |
331 } | 331 } |
332 | 332 |
333 void ConvertToCricketIceServers( | |
334 const std::vector<StunConfiguration>& stuns, | |
335 const std::vector<TurnConfiguration>& turns, | |
336 cricket::ServerAddresses* cricket_stuns, | |
337 std::vector<cricket::RelayServerConfig>* cricket_turns) { | |
338 RTC_DCHECK(cricket_stuns && cricket_turns); | |
339 for (const StunConfiguration& stun : stuns) { | |
340 cricket_stuns->insert(stun.server); | |
341 } | |
342 | |
343 int priority = static_cast<int>(turns.size() - 1); | |
344 for (const TurnConfiguration& turn : turns) { | |
345 cricket::RelayCredentials credentials(turn.username, turn.password); | |
346 cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); | |
347 cricket::ProtocolType protocol; | |
348 // Using VERIFY because ParseIceServers should have already caught an | |
349 // invalid transport type. | |
350 if (!VERIFY( | |
351 cricket::StringToProto(turn.transport_type.c_str(), &protocol))) { | |
352 LOG(LS_WARNING) << "Ignoring TURN server " << turn.server << ". " | |
353 << "Reason= Incorrect " << turn.transport_type | |
354 << " transport parameter."; | |
355 } else { | |
356 relay_server.ports.push_back( | |
357 cricket::ProtocolAddress(turn.server, protocol, turn.secure)); | |
358 relay_server.credentials = credentials; | |
359 relay_server.priority = priority; | |
360 cricket_turns->push_back(relay_server); | |
361 } | |
362 // First in the list gets highest priority. | |
363 --priority; | |
364 } | |
365 } | |
366 | |
367 // Check if we can send |new_stream| on a PeerConnection. | 333 // Check if we can send |new_stream| on a PeerConnection. |
368 bool CanAddLocalMediaStream(webrtc::StreamCollectionInterface* current_streams, | 334 bool CanAddLocalMediaStream(webrtc::StreamCollectionInterface* current_streams, |
369 webrtc::MediaStreamInterface* new_stream) { | 335 webrtc::MediaStreamInterface* new_stream) { |
370 if (!new_stream || !current_streams) { | 336 if (!new_stream || !current_streams) { |
371 return false; | 337 return false; |
372 } | 338 } |
373 if (current_streams->find(new_stream->label()) != nullptr) { | 339 if (current_streams->find(new_stream->label()) != nullptr) { |
374 LOG(LS_ERROR) << "MediaStream with label " << new_stream->label() | 340 LOG(LS_ERROR) << "MediaStream with label " << new_stream->label() |
375 << " is already added."; | 341 << " is already added."; |
376 return false; | 342 return false; |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 bool PeerConnection::Initialize( | 582 bool PeerConnection::Initialize( |
617 const PeerConnectionInterface::RTCConfiguration& configuration, | 583 const PeerConnectionInterface::RTCConfiguration& configuration, |
618 const MediaConstraintsInterface* constraints, | 584 const MediaConstraintsInterface* constraints, |
619 PortAllocatorFactoryInterface* allocator_factory, | 585 PortAllocatorFactoryInterface* allocator_factory, |
620 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, | 586 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, |
621 PeerConnectionObserver* observer) { | 587 PeerConnectionObserver* observer) { |
622 RTC_DCHECK(observer != nullptr); | 588 RTC_DCHECK(observer != nullptr); |
623 if (!observer) { | 589 if (!observer) { |
624 return false; | 590 return false; |
625 } | 591 } |
626 | |
627 // This Initialize function parses ICE servers an extra time, but it will | |
628 // be removed once all PortAllocaotrs support SetIceServers. | |
629 std::vector<PortAllocatorFactoryInterface::StunConfiguration> stun_config; | |
630 std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turn_config; | |
631 if (!ParseIceServers(configuration.servers, &stun_config, &turn_config)) { | |
632 return false; | |
633 } | |
634 rtc::scoped_ptr<cricket::PortAllocator> allocator( | |
635 allocator_factory->CreatePortAllocator(stun_config, turn_config)); | |
636 return Initialize(configuration, constraints, allocator.Pass(), | |
637 dtls_identity_store.Pass(), observer); | |
638 } | |
639 | |
640 bool PeerConnection::Initialize( | |
641 const PeerConnectionInterface::RTCConfiguration& configuration, | |
642 const MediaConstraintsInterface* constraints, | |
643 rtc::scoped_ptr<cricket::PortAllocator> allocator, | |
644 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, | |
645 PeerConnectionObserver* observer) { | |
646 RTC_DCHECK(observer != nullptr); | |
647 if (!observer) { | |
648 return false; | |
649 } | |
650 observer_ = observer; | 592 observer_ = observer; |
651 | 593 |
652 port_allocator_ = allocator.Pass(); | |
653 | |
654 std::vector<PortAllocatorFactoryInterface::StunConfiguration> stun_config; | 594 std::vector<PortAllocatorFactoryInterface::StunConfiguration> stun_config; |
655 std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turn_config; | 595 std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turn_config; |
656 if (!ParseIceServers(configuration.servers, &stun_config, &turn_config)) { | 596 if (!ParseIceServers(configuration.servers, &stun_config, &turn_config)) { |
657 return false; | 597 return false; |
658 } | 598 } |
659 | 599 port_allocator_.reset( |
660 cricket::ServerAddresses cricket_stuns; | 600 allocator_factory->CreatePortAllocator(stun_config, turn_config)); |
661 std::vector<cricket::RelayServerConfig> cricket_turns; | |
662 ConvertToCricketIceServers(stun_config, turn_config, &cricket_stuns, | |
663 &cricket_turns); | |
664 port_allocator_->SetIceServers(cricket_stuns, cricket_turns); | |
665 | 601 |
666 // To handle both internal and externally created port allocator, we will | 602 // To handle both internal and externally created port allocator, we will |
667 // enable BUNDLE here. | 603 // enable BUNDLE here. |
668 int portallocator_flags = port_allocator_->flags(); | 604 int portallocator_flags = port_allocator_->flags(); |
669 portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 605 portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
670 cricket::PORTALLOCATOR_ENABLE_IPV6; | 606 cricket::PORTALLOCATOR_ENABLE_IPV6; |
671 bool value; | 607 bool value; |
672 // If IPv6 flag was specified, we'll not override it by experiment. | 608 // If IPv6 flag was specified, we'll not override it by experiment. |
673 if (FindConstraint(constraints, MediaConstraintsInterface::kEnableIPv6, | 609 if (FindConstraint(constraints, MediaConstraintsInterface::kEnableIPv6, |
674 &value, nullptr)) { | 610 &value, nullptr)) { |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1143 } | 1079 } |
1144 | 1080 |
1145 bool PeerConnection::SetConfiguration(const RTCConfiguration& config) { | 1081 bool PeerConnection::SetConfiguration(const RTCConfiguration& config) { |
1146 if (port_allocator_) { | 1082 if (port_allocator_) { |
1147 std::vector<PortAllocatorFactoryInterface::StunConfiguration> stuns; | 1083 std::vector<PortAllocatorFactoryInterface::StunConfiguration> stuns; |
1148 std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turns; | 1084 std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turns; |
1149 if (!ParseIceServers(config.servers, &stuns, &turns)) { | 1085 if (!ParseIceServers(config.servers, &stuns, &turns)) { |
1150 return false; | 1086 return false; |
1151 } | 1087 } |
1152 | 1088 |
1153 cricket::ServerAddresses cricket_stuns; | 1089 std::vector<rtc::SocketAddress> stun_hosts; |
1154 std::vector<cricket::RelayServerConfig> cricket_turns; | 1090 typedef std::vector<StunConfiguration>::const_iterator StunIt; |
1155 ConvertToCricketIceServers(stuns, turns, &cricket_stuns, &cricket_turns); | 1091 for (StunIt stun_it = stuns.begin(); stun_it != stuns.end(); ++stun_it) { |
1156 port_allocator_->SetIceServers(cricket_stuns, cricket_turns); | 1092 stun_hosts.push_back(stun_it->server); |
| 1093 } |
| 1094 |
| 1095 rtc::SocketAddress stun_addr; |
| 1096 if (!stun_hosts.empty()) { |
| 1097 stun_addr = stun_hosts.front(); |
| 1098 LOG(LS_INFO) << "SetConfiguration: StunServer Address: " |
| 1099 << stun_addr.ToString(); |
| 1100 } |
| 1101 |
| 1102 for (size_t i = 0; i < turns.size(); ++i) { |
| 1103 cricket::RelayCredentials credentials(turns[i].username, |
| 1104 turns[i].password); |
| 1105 cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); |
| 1106 cricket::ProtocolType protocol; |
| 1107 if (cricket::StringToProto(turns[i].transport_type.c_str(), &protocol)) { |
| 1108 relay_server.ports.push_back(cricket::ProtocolAddress( |
| 1109 turns[i].server, protocol, turns[i].secure)); |
| 1110 relay_server.credentials = credentials; |
| 1111 LOG(LS_INFO) << "SetConfiguration: TurnServer Address: " |
| 1112 << turns[i].server.ToString(); |
| 1113 } else { |
| 1114 LOG(LS_WARNING) << "Ignoring TURN server " << turns[i].server << ". " |
| 1115 << "Reason= Incorrect " << turns[i].transport_type |
| 1116 << " transport parameter."; |
| 1117 } |
| 1118 } |
1157 } | 1119 } |
1158 session_->SetIceConfig(session_->ParseIceConfig(config)); | 1120 session_->SetIceConfig(session_->ParseIceConfig(config)); |
1159 return session_->SetIceTransports(config.type); | 1121 return session_->SetIceTransports(config.type); |
1160 } | 1122 } |
1161 | 1123 |
1162 bool PeerConnection::AddIceCandidate( | 1124 bool PeerConnection::AddIceCandidate( |
1163 const IceCandidateInterface* ice_candidate) { | 1125 const IceCandidateInterface* ice_candidate) { |
1164 return session_->ProcessIceMessage(ice_candidate); | 1126 return session_->ProcessIceMessage(ice_candidate); |
1165 } | 1127 } |
1166 | 1128 |
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2004 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const { | 1966 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const { |
2005 for (const auto& channel : sctp_data_channels_) { | 1967 for (const auto& channel : sctp_data_channels_) { |
2006 if (channel->id() == sid) { | 1968 if (channel->id() == sid) { |
2007 return channel; | 1969 return channel; |
2008 } | 1970 } |
2009 } | 1971 } |
2010 return nullptr; | 1972 return nullptr; |
2011 } | 1973 } |
2012 | 1974 |
2013 } // namespace webrtc | 1975 } // namespace webrtc |
OLD | NEW |