| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 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 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 } | 616 } |
| 617 return nullptr; | 617 return nullptr; |
| 618 } | 618 } |
| 619 | 619 |
| 620 cricket::SecurePolicy WebRtcSession::SdesPolicy() const { | 620 cricket::SecurePolicy WebRtcSession::SdesPolicy() const { |
| 621 return webrtc_session_desc_factory_->SdesPolicy(); | 621 return webrtc_session_desc_factory_->SdesPolicy(); |
| 622 } | 622 } |
| 623 | 623 |
| 624 bool WebRtcSession::GetSslRole(const std::string& transport_name, | 624 bool WebRtcSession::GetSslRole(const std::string& transport_name, |
| 625 rtc::SSLRole* role) { | 625 rtc::SSLRole* role) { |
| 626 if (!local_desc_ || !remote_desc_) { | 626 if (!local_description() || !remote_description()) { |
| 627 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get " | 627 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get " |
| 628 << "SSL Role of the session."; | 628 << "SSL Role of the session."; |
| 629 return false; | 629 return false; |
| 630 } | 630 } |
| 631 | 631 |
| 632 return transport_controller_->GetSslRole(transport_name, role); | 632 return transport_controller_->GetSslRole(transport_name, role); |
| 633 } | 633 } |
| 634 | 634 |
| 635 bool WebRtcSession::GetSslRole(const cricket::BaseChannel* channel, | 635 bool WebRtcSession::GetSslRole(const cricket::BaseChannel* channel, |
| 636 rtc::SSLRole* role) { | 636 rtc::SSLRole* role) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 662 return false; | 662 return false; |
| 663 } | 663 } |
| 664 | 664 |
| 665 // Update the initial_offerer flag if this session is the initial_offerer. | 665 // Update the initial_offerer flag if this session is the initial_offerer. |
| 666 Action action = GetAction(desc->type()); | 666 Action action = GetAction(desc->type()); |
| 667 if (state() == STATE_INIT && action == kOffer) { | 667 if (state() == STATE_INIT && action == kOffer) { |
| 668 initial_offerer_ = true; | 668 initial_offerer_ = true; |
| 669 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLING); | 669 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| 670 } | 670 } |
| 671 | 671 |
| 672 local_desc_.reset(desc_temp.release()); | 672 if (action == kAnswer) { |
| 673 current_local_description_.reset(desc_temp.release()); |
| 674 pending_local_description_.reset(nullptr); |
| 675 current_remote_description_.reset(pending_remote_description_.release()); |
| 676 } else { |
| 677 pending_local_description_.reset(desc_temp.release()); |
| 678 } |
| 673 | 679 |
| 674 // Transport and Media channels will be created only when offer is set. | 680 // Transport and Media channels will be created only when offer is set. |
| 675 if (action == kOffer && !CreateChannels(local_desc_->description())) { | 681 if (action == kOffer && !CreateChannels(local_description()->description())) { |
| 676 // TODO(mallinath) - Handle CreateChannel failure, as new local description | 682 // TODO(mallinath) - Handle CreateChannel failure, as new local description |
| 677 // is applied. Restore back to old description. | 683 // is applied. Restore back to old description. |
| 678 return BadLocalSdp(desc->type(), kCreateChannelFailed, err_desc); | 684 return BadLocalSdp(desc->type(), kCreateChannelFailed, err_desc); |
| 679 } | 685 } |
| 680 | 686 |
| 681 // Remove unused channels if MediaContentDescription is rejected. | 687 // Remove unused channels if MediaContentDescription is rejected. |
| 682 RemoveUnusedChannels(local_desc_->description()); | 688 RemoveUnusedChannels(local_description()->description()); |
| 683 | 689 |
| 684 if (!UpdateSessionState(action, cricket::CS_LOCAL, err_desc)) { | 690 if (!UpdateSessionState(action, cricket::CS_LOCAL, err_desc)) { |
| 685 return false; | 691 return false; |
| 686 } | 692 } |
| 687 | 693 |
| 688 if (remote_desc_) { | 694 if (remote_description()) { |
| 689 // Now that we have a local description, we can push down remote candidates. | 695 // Now that we have a local description, we can push down remote candidates. |
| 690 UseCandidatesInSessionDescription(remote_desc_.get()); | 696 UseCandidatesInSessionDescription(remote_description()); |
| 691 } | 697 } |
| 692 | 698 |
| 693 pending_ice_restarts_.clear(); | 699 pending_ice_restarts_.clear(); |
| 694 | 700 |
| 695 if (error() != ERROR_NONE) { | 701 if (error() != ERROR_NONE) { |
| 696 return BadLocalSdp(desc->type(), GetSessionErrorMsg(), err_desc); | 702 return BadLocalSdp(desc->type(), GetSessionErrorMsg(), err_desc); |
| 697 } | 703 } |
| 698 return true; | 704 return true; |
| 699 } | 705 } |
| 700 | 706 |
| 701 bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc, | 707 bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc, |
| 702 std::string* err_desc) { | 708 std::string* err_desc) { |
| 703 ASSERT(signaling_thread()->IsCurrent()); | 709 ASSERT(signaling_thread()->IsCurrent()); |
| 704 | 710 |
| 705 // Takes the ownership of |desc| regardless of the result. | 711 // Takes the ownership of |desc| regardless of the result. |
| 706 std::unique_ptr<SessionDescriptionInterface> desc_temp(desc); | 712 std::unique_ptr<SessionDescriptionInterface> desc_temp(desc); |
| 707 | 713 |
| 708 // Validate SDP. | 714 // Validate SDP. |
| 709 if (!ValidateSessionDescription(desc, cricket::CS_REMOTE, err_desc)) { | 715 if (!ValidateSessionDescription(desc, cricket::CS_REMOTE, err_desc)) { |
| 710 return false; | 716 return false; |
| 711 } | 717 } |
| 712 | 718 |
| 713 std::unique_ptr<SessionDescriptionInterface> old_remote_desc( | 719 const SessionDescriptionInterface* old_remote_description = |
| 714 remote_desc_.release()); | 720 remote_description(); |
| 715 remote_desc_.reset(desc_temp.release()); | 721 // Grab ownership of the description being replaced for the remainder of this |
| 722 // method, since it's used below. |
| 723 std::unique_ptr<SessionDescriptionInterface> replaced_remote_description; |
| 724 Action action = GetAction(desc->type()); |
| 725 if (action == kAnswer) { |
| 726 replaced_remote_description.reset( |
| 727 pending_remote_description_ ? pending_remote_description_.release() |
| 728 : current_remote_description_.release()); |
| 729 current_remote_description_.reset(desc_temp.release()); |
| 730 pending_remote_description_.reset(nullptr); |
| 731 current_local_description_.reset(pending_local_description_.release()); |
| 732 } else { |
| 733 replaced_remote_description.reset(pending_remote_description_.release()); |
| 734 pending_remote_description_.reset(desc_temp.release()); |
| 735 } |
| 716 | 736 |
| 717 // Transport and Media channels will be created only when offer is set. | 737 // Transport and Media channels will be created only when offer is set. |
| 718 Action action = GetAction(desc->type()); | |
| 719 if (action == kOffer && !CreateChannels(desc->description())) { | 738 if (action == kOffer && !CreateChannels(desc->description())) { |
| 720 // TODO(mallinath) - Handle CreateChannel failure, as new local description | 739 // TODO(mallinath) - Handle CreateChannel failure, as new local description |
| 721 // is applied. Restore back to old description. | 740 // is applied. Restore back to old description. |
| 722 return BadRemoteSdp(desc->type(), kCreateChannelFailed, err_desc); | 741 return BadRemoteSdp(desc->type(), kCreateChannelFailed, err_desc); |
| 723 } | 742 } |
| 724 | 743 |
| 725 // Remove unused channels if MediaContentDescription is rejected. | 744 // Remove unused channels if MediaContentDescription is rejected. |
| 726 RemoveUnusedChannels(desc->description()); | 745 RemoveUnusedChannels(desc->description()); |
| 727 | 746 |
| 728 // NOTE: Candidates allocation will be initiated only when SetLocalDescription | 747 // NOTE: Candidates allocation will be initiated only when SetLocalDescription |
| 729 // is called. | 748 // is called. |
| 730 if (!UpdateSessionState(action, cricket::CS_REMOTE, err_desc)) { | 749 if (!UpdateSessionState(action, cricket::CS_REMOTE, err_desc)) { |
| 731 return false; | 750 return false; |
| 732 } | 751 } |
| 733 | 752 |
| 734 if (local_desc_ && !UseCandidatesInSessionDescription(desc)) { | 753 if (local_description() && !UseCandidatesInSessionDescription(desc)) { |
| 735 return BadRemoteSdp(desc->type(), kInvalidCandidates, err_desc); | 754 return BadRemoteSdp(desc->type(), kInvalidCandidates, err_desc); |
| 736 } | 755 } |
| 737 | 756 |
| 738 if (old_remote_desc) { | 757 if (old_remote_description) { |
| 739 for (const cricket::ContentInfo& content : | 758 for (const cricket::ContentInfo& content : |
| 740 old_remote_desc->description()->contents()) { | 759 old_remote_description->description()->contents()) { |
| 741 // Check if this new SessionDescription contains new ICE ufrag and | 760 // Check if this new SessionDescription contains new ICE ufrag and |
| 742 // password that indicates the remote peer requests an ICE restart. | 761 // password that indicates the remote peer requests an ICE restart. |
| 743 // TODO(deadbeef): When we start storing both the current and pending | 762 // TODO(deadbeef): When we start storing both the current and pending |
| 744 // remote description, this should reset pending_ice_restarts and compare | 763 // remote description, this should reset pending_ice_restarts and compare |
| 745 // against the current description. | 764 // against the current description. |
| 746 if (CheckForRemoteIceRestart(old_remote_desc.get(), desc, content.name)) { | 765 if (CheckForRemoteIceRestart(old_remote_description, desc, |
| 766 content.name)) { |
| 747 if (action == kOffer) { | 767 if (action == kOffer) { |
| 748 pending_ice_restarts_.insert(content.name); | 768 pending_ice_restarts_.insert(content.name); |
| 749 } | 769 } |
| 750 } else { | 770 } else { |
| 751 // We retain all received candidates only if ICE is not restarted. | 771 // We retain all received candidates only if ICE is not restarted. |
| 752 // When ICE is restarted, all previous candidates belong to an old | 772 // When ICE is restarted, all previous candidates belong to an old |
| 753 // generation and should not be kept. | 773 // generation and should not be kept. |
| 754 // TODO(deadbeef): This goes against the W3C spec which says the remote | 774 // TODO(deadbeef): This goes against the W3C spec which says the remote |
| 755 // description should only contain candidates from the last set remote | 775 // description should only contain candidates from the last set remote |
| 756 // description plus any candidates added since then. We should remove | 776 // description plus any candidates added since then. We should remove |
| 757 // this once we're sure it won't break anything. | 777 // this once we're sure it won't break anything. |
| 758 WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription( | 778 WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription( |
| 759 old_remote_desc.get(), content.name, desc); | 779 old_remote_description, content.name, desc); |
| 760 } | 780 } |
| 761 } | 781 } |
| 762 } | 782 } |
| 763 | 783 |
| 764 if (error() != ERROR_NONE) { | 784 if (error() != ERROR_NONE) { |
| 765 return BadRemoteSdp(desc->type(), GetSessionErrorMsg(), err_desc); | 785 return BadRemoteSdp(desc->type(), GetSessionErrorMsg(), err_desc); |
| 766 } | 786 } |
| 767 | 787 |
| 768 // Set the the ICE connection state to connecting since the connection may | 788 // Set the the ICE connection state to connecting since the connection may |
| 769 // become writable with peer reflexive candidates before any remote candidate | 789 // become writable with peer reflexive candidates before any remote candidate |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 SetState(source == cricket::CS_LOCAL ? STATE_SENTPRANSWER | 852 SetState(source == cricket::CS_LOCAL ? STATE_SENTPRANSWER |
| 833 : STATE_RECEIVEDPRANSWER); | 853 : STATE_RECEIVEDPRANSWER); |
| 834 if (!PushdownMediaDescription(cricket::CA_PRANSWER, source, err_desc)) { | 854 if (!PushdownMediaDescription(cricket::CA_PRANSWER, source, err_desc)) { |
| 835 SetError(ERROR_CONTENT, *err_desc); | 855 SetError(ERROR_CONTENT, *err_desc); |
| 836 } | 856 } |
| 837 if (error() != ERROR_NONE) { | 857 if (error() != ERROR_NONE) { |
| 838 return BadPranswerSdp(source, GetSessionErrorMsg(), err_desc); | 858 return BadPranswerSdp(source, GetSessionErrorMsg(), err_desc); |
| 839 } | 859 } |
| 840 } else if (action == kAnswer) { | 860 } else if (action == kAnswer) { |
| 841 const cricket::ContentGroup* local_bundle = | 861 const cricket::ContentGroup* local_bundle = |
| 842 local_desc_->description()->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); | 862 local_description()->description()->GetGroupByName( |
| 863 cricket::GROUP_TYPE_BUNDLE); |
| 843 const cricket::ContentGroup* remote_bundle = | 864 const cricket::ContentGroup* remote_bundle = |
| 844 remote_desc_->description()->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); | 865 remote_description()->description()->GetGroupByName( |
| 866 cricket::GROUP_TYPE_BUNDLE); |
| 845 if (local_bundle && remote_bundle) { | 867 if (local_bundle && remote_bundle) { |
| 846 // The answerer decides the transport to bundle on. | 868 // The answerer decides the transport to bundle on. |
| 847 const cricket::ContentGroup* answer_bundle = | 869 const cricket::ContentGroup* answer_bundle = |
| 848 (source == cricket::CS_LOCAL ? local_bundle : remote_bundle); | 870 (source == cricket::CS_LOCAL ? local_bundle : remote_bundle); |
| 849 if (!EnableBundle(*answer_bundle)) { | 871 if (!EnableBundle(*answer_bundle)) { |
| 850 LOG(LS_WARNING) << "Failed to enable BUNDLE."; | 872 LOG(LS_WARNING) << "Failed to enable BUNDLE."; |
| 851 return BadAnswerSdp(source, kEnableBundleFailed, err_desc); | 873 return BadAnswerSdp(source, kEnableBundleFailed, err_desc); |
| 852 } | 874 } |
| 853 } | 875 } |
| 854 // Only push down the transport description after enabling BUNDLE; we don't | 876 // Only push down the transport description after enabling BUNDLE; we don't |
| (...skipping 26 matching lines...) Expand all Loading... |
| 881 } | 903 } |
| 882 | 904 |
| 883 bool WebRtcSession::PushdownMediaDescription( | 905 bool WebRtcSession::PushdownMediaDescription( |
| 884 cricket::ContentAction action, | 906 cricket::ContentAction action, |
| 885 cricket::ContentSource source, | 907 cricket::ContentSource source, |
| 886 std::string* err) { | 908 std::string* err) { |
| 887 auto set_content = [this, action, source, err](cricket::BaseChannel* ch) { | 909 auto set_content = [this, action, source, err](cricket::BaseChannel* ch) { |
| 888 if (!ch) { | 910 if (!ch) { |
| 889 return true; | 911 return true; |
| 890 } else if (source == cricket::CS_LOCAL) { | 912 } else if (source == cricket::CS_LOCAL) { |
| 891 return ch->PushdownLocalDescription(local_desc_->description(), action, | 913 return ch->PushdownLocalDescription(local_description()->description(), |
| 892 err); | 914 action, err); |
| 893 } else { | 915 } else { |
| 894 return ch->PushdownRemoteDescription(remote_desc_->description(), action, | 916 return ch->PushdownRemoteDescription(remote_description()->description(), |
| 895 err); | 917 action, err); |
| 896 } | 918 } |
| 897 }; | 919 }; |
| 898 | 920 |
| 899 return (set_content(voice_channel()) && | 921 return (set_content(voice_channel()) && |
| 900 set_content(video_channel()) && | 922 set_content(video_channel()) && |
| 901 set_content(data_channel())); | 923 set_content(data_channel())); |
| 902 } | 924 } |
| 903 | 925 |
| 904 bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source, | 926 bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source, |
| 905 cricket::ContentAction action, | 927 cricket::ContentAction action, |
| 906 std::string* error_desc) { | 928 std::string* error_desc) { |
| 907 RTC_DCHECK(signaling_thread()->IsCurrent()); | 929 RTC_DCHECK(signaling_thread()->IsCurrent()); |
| 908 | 930 |
| 909 if (source == cricket::CS_LOCAL) { | 931 if (source == cricket::CS_LOCAL) { |
| 910 return PushdownLocalTransportDescription(local_desc_->description(), action, | 932 return PushdownLocalTransportDescription(local_description()->description(), |
| 911 error_desc); | 933 action, error_desc); |
| 912 } | 934 } |
| 913 return PushdownRemoteTransportDescription(remote_desc_->description(), action, | 935 return PushdownRemoteTransportDescription(remote_description()->description(), |
| 914 error_desc); | 936 action, error_desc); |
| 915 } | 937 } |
| 916 | 938 |
| 917 bool WebRtcSession::PushdownLocalTransportDescription( | 939 bool WebRtcSession::PushdownLocalTransportDescription( |
| 918 const SessionDescription* sdesc, | 940 const SessionDescription* sdesc, |
| 919 cricket::ContentAction action, | 941 cricket::ContentAction action, |
| 920 std::string* err) { | 942 std::string* err) { |
| 921 RTC_DCHECK(signaling_thread()->IsCurrent()); | 943 RTC_DCHECK(signaling_thread()->IsCurrent()); |
| 922 | 944 |
| 923 if (!sdesc) { | 945 if (!sdesc) { |
| 924 return false; | 946 return false; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1052 if (!maybe_set_transport(voice_channel()) || | 1074 if (!maybe_set_transport(voice_channel()) || |
| 1053 !maybe_set_transport(video_channel()) || | 1075 !maybe_set_transport(video_channel()) || |
| 1054 !maybe_set_transport(data_channel())) { | 1076 !maybe_set_transport(data_channel())) { |
| 1055 return false; | 1077 return false; |
| 1056 } | 1078 } |
| 1057 | 1079 |
| 1058 return true; | 1080 return true; |
| 1059 } | 1081 } |
| 1060 | 1082 |
| 1061 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { | 1083 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { |
| 1062 if (!remote_desc_) { | 1084 if (!remote_description()) { |
| 1063 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " | 1085 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " |
| 1064 << "without any remote session description."; | 1086 << "without any remote session description."; |
| 1065 return false; | 1087 return false; |
| 1066 } | 1088 } |
| 1067 | 1089 |
| 1068 if (!candidate) { | 1090 if (!candidate) { |
| 1069 LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL."; | 1091 LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL."; |
| 1070 return false; | 1092 return false; |
| 1071 } | 1093 } |
| 1072 | 1094 |
| 1073 bool valid = false; | 1095 bool valid = false; |
| 1074 bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid); | 1096 bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid); |
| 1075 if (!valid) { | 1097 if (!valid) { |
| 1076 return false; | 1098 return false; |
| 1077 } | 1099 } |
| 1078 | 1100 |
| 1079 // Add this candidate to the remote session description. | 1101 // Add this candidate to the remote session description. |
| 1080 if (!remote_desc_->AddCandidate(candidate)) { | 1102 if (!mutable_remote_description()->AddCandidate(candidate)) { |
| 1081 LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used."; | 1103 LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used."; |
| 1082 return false; | 1104 return false; |
| 1083 } | 1105 } |
| 1084 | 1106 |
| 1085 if (ready) { | 1107 if (ready) { |
| 1086 return UseCandidate(candidate); | 1108 return UseCandidate(candidate); |
| 1087 } else { | 1109 } else { |
| 1088 LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate."; | 1110 LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate."; |
| 1089 return true; | 1111 return true; |
| 1090 } | 1112 } |
| 1091 } | 1113 } |
| 1092 | 1114 |
| 1093 bool WebRtcSession::RemoveRemoteIceCandidates( | 1115 bool WebRtcSession::RemoveRemoteIceCandidates( |
| 1094 const std::vector<cricket::Candidate>& candidates) { | 1116 const std::vector<cricket::Candidate>& candidates) { |
| 1095 if (!remote_desc_) { | 1117 if (!remote_description()) { |
| 1096 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: ICE candidates can't be " | 1118 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: ICE candidates can't be " |
| 1097 << "removed without any remote session description."; | 1119 << "removed without any remote session description."; |
| 1098 return false; | 1120 return false; |
| 1099 } | 1121 } |
| 1100 | 1122 |
| 1101 if (candidates.empty()) { | 1123 if (candidates.empty()) { |
| 1102 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: candidates are empty."; | 1124 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: candidates are empty."; |
| 1103 return false; | 1125 return false; |
| 1104 } | 1126 } |
| 1105 | 1127 |
| 1106 size_t number_removed = remote_desc_->RemoveCandidates(candidates); | 1128 size_t number_removed = |
| 1129 mutable_remote_description()->RemoveCandidates(candidates); |
| 1107 if (number_removed != candidates.size()) { | 1130 if (number_removed != candidates.size()) { |
| 1108 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Failed to remove candidates. " | 1131 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Failed to remove candidates. " |
| 1109 << "Requested " << candidates.size() << " but only " | 1132 << "Requested " << candidates.size() << " but only " |
| 1110 << number_removed << " are removed."; | 1133 << number_removed << " are removed."; |
| 1111 } | 1134 } |
| 1112 | 1135 |
| 1113 // Remove the candidates from the transport controller. | 1136 // Remove the candidates from the transport controller. |
| 1114 std::string error; | 1137 std::string error; |
| 1115 bool res = transport_controller_->RemoveRemoteCandidates(candidates, &error); | 1138 bool res = transport_controller_->RemoveRemoteCandidates(candidates, &error); |
| 1116 if (!res && !error.empty()) { | 1139 if (!res && !error.empty()) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 void WebRtcSession::SetIceConfig(const cricket::IceConfig& config) { | 1173 void WebRtcSession::SetIceConfig(const cricket::IceConfig& config) { |
| 1151 transport_controller_->SetIceConfig(config); | 1174 transport_controller_->SetIceConfig(config); |
| 1152 } | 1175 } |
| 1153 | 1176 |
| 1154 void WebRtcSession::MaybeStartGathering() { | 1177 void WebRtcSession::MaybeStartGathering() { |
| 1155 transport_controller_->MaybeStartGathering(); | 1178 transport_controller_->MaybeStartGathering(); |
| 1156 } | 1179 } |
| 1157 | 1180 |
| 1158 bool WebRtcSession::GetLocalTrackIdBySsrc(uint32_t ssrc, | 1181 bool WebRtcSession::GetLocalTrackIdBySsrc(uint32_t ssrc, |
| 1159 std::string* track_id) { | 1182 std::string* track_id) { |
| 1160 if (!local_desc_) { | 1183 if (!local_description()) { |
| 1161 return false; | 1184 return false; |
| 1162 } | 1185 } |
| 1163 return webrtc::GetTrackIdBySsrc(local_desc_->description(), ssrc, track_id); | 1186 return webrtc::GetTrackIdBySsrc(local_description()->description(), ssrc, |
| 1187 track_id); |
| 1164 } | 1188 } |
| 1165 | 1189 |
| 1166 bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32_t ssrc, | 1190 bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32_t ssrc, |
| 1167 std::string* track_id) { | 1191 std::string* track_id) { |
| 1168 if (!remote_desc_) { | 1192 if (!remote_description()) { |
| 1169 return false; | 1193 return false; |
| 1170 } | 1194 } |
| 1171 return webrtc::GetTrackIdBySsrc(remote_desc_->description(), ssrc, track_id); | 1195 return webrtc::GetTrackIdBySsrc(remote_description()->description(), ssrc, |
| 1196 track_id); |
| 1172 } | 1197 } |
| 1173 | 1198 |
| 1174 std::string WebRtcSession::BadStateErrMsg(State state) { | 1199 std::string WebRtcSession::BadStateErrMsg(State state) { |
| 1175 std::ostringstream desc; | 1200 std::ostringstream desc; |
| 1176 desc << "Called in wrong state: " << GetStateString(state); | 1201 desc << "Called in wrong state: " << GetStateString(state); |
| 1177 return desc.str(); | 1202 return desc.str(); |
| 1178 } | 1203 } |
| 1179 | 1204 |
| 1180 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) { | 1205 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) { |
| 1181 ASSERT(signaling_thread()->IsCurrent()); | 1206 ASSERT(signaling_thread()->IsCurrent()); |
| 1182 if (!voice_channel_) { | 1207 if (!voice_channel_) { |
| 1183 LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; | 1208 LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; |
| 1184 return false; | 1209 return false; |
| 1185 } | 1210 } |
| 1186 uint32_t send_ssrc = 0; | 1211 uint32_t send_ssrc = 0; |
| 1187 // The Dtmf is negotiated per channel not ssrc, so we only check if the ssrc | 1212 // The Dtmf is negotiated per channel not ssrc, so we only check if the ssrc |
| 1188 // exists. | 1213 // exists. |
| 1189 if (!local_desc_ || | 1214 if (!local_description() || |
| 1190 !GetAudioSsrcByTrackId(local_desc_->description(), track_id, | 1215 !GetAudioSsrcByTrackId(local_description()->description(), track_id, |
| 1191 &send_ssrc)) { | 1216 &send_ssrc)) { |
| 1192 LOG(LS_ERROR) << "CanInsertDtmf: Track does not exist: " << track_id; | 1217 LOG(LS_ERROR) << "CanInsertDtmf: Track does not exist: " << track_id; |
| 1193 return false; | 1218 return false; |
| 1194 } | 1219 } |
| 1195 return voice_channel_->CanInsertDtmf(); | 1220 return voice_channel_->CanInsertDtmf(); |
| 1196 } | 1221 } |
| 1197 | 1222 |
| 1198 bool WebRtcSession::InsertDtmf(const std::string& track_id, | 1223 bool WebRtcSession::InsertDtmf(const std::string& track_id, |
| 1199 int code, int duration) { | 1224 int code, int duration) { |
| 1200 ASSERT(signaling_thread()->IsCurrent()); | 1225 ASSERT(signaling_thread()->IsCurrent()); |
| 1201 if (!voice_channel_) { | 1226 if (!voice_channel_) { |
| 1202 LOG(LS_ERROR) << "InsertDtmf: No audio channel exists."; | 1227 LOG(LS_ERROR) << "InsertDtmf: No audio channel exists."; |
| 1203 return false; | 1228 return false; |
| 1204 } | 1229 } |
| 1205 uint32_t send_ssrc = 0; | 1230 uint32_t send_ssrc = 0; |
| 1206 if (!VERIFY(local_desc_ && GetAudioSsrcByTrackId(local_desc_->description(), | 1231 if (!VERIFY(local_description() && |
| 1207 track_id, &send_ssrc))) { | 1232 GetAudioSsrcByTrackId(local_description()->description(), |
| 1233 track_id, &send_ssrc))) { |
| 1208 LOG(LS_ERROR) << "InsertDtmf: Track does not exist: " << track_id; | 1234 LOG(LS_ERROR) << "InsertDtmf: Track does not exist: " << track_id; |
| 1209 return false; | 1235 return false; |
| 1210 } | 1236 } |
| 1211 if (!voice_channel_->InsertDtmf(send_ssrc, code, duration)) { | 1237 if (!voice_channel_->InsertDtmf(send_ssrc, code, duration)) { |
| 1212 LOG(LS_ERROR) << "Failed to insert DTMF to channel."; | 1238 LOG(LS_ERROR) << "Failed to insert DTMF to channel."; |
| 1213 return false; | 1239 return false; |
| 1214 } | 1240 } |
| 1215 return true; | 1241 return true; |
| 1216 } | 1242 } |
| 1217 | 1243 |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1395 return; | 1421 return; |
| 1396 } | 1422 } |
| 1397 | 1423 |
| 1398 for (cricket::Candidates::const_iterator citer = candidates.begin(); | 1424 for (cricket::Candidates::const_iterator citer = candidates.begin(); |
| 1399 citer != candidates.end(); ++citer) { | 1425 citer != candidates.end(); ++citer) { |
| 1400 // Use transport_name as the candidate media id. | 1426 // Use transport_name as the candidate media id. |
| 1401 JsepIceCandidate candidate(transport_name, sdp_mline_index, *citer); | 1427 JsepIceCandidate candidate(transport_name, sdp_mline_index, *citer); |
| 1402 if (ice_observer_) { | 1428 if (ice_observer_) { |
| 1403 ice_observer_->OnIceCandidate(&candidate); | 1429 ice_observer_->OnIceCandidate(&candidate); |
| 1404 } | 1430 } |
| 1405 if (local_desc_) { | 1431 if (local_description()) { |
| 1406 local_desc_->AddCandidate(&candidate); | 1432 mutable_local_description()->AddCandidate(&candidate); |
| 1407 } | 1433 } |
| 1408 } | 1434 } |
| 1409 } | 1435 } |
| 1410 | 1436 |
| 1411 void WebRtcSession::OnTransportControllerCandidatesRemoved( | 1437 void WebRtcSession::OnTransportControllerCandidatesRemoved( |
| 1412 const std::vector<cricket::Candidate>& candidates) { | 1438 const std::vector<cricket::Candidate>& candidates) { |
| 1413 ASSERT(signaling_thread()->IsCurrent()); | 1439 ASSERT(signaling_thread()->IsCurrent()); |
| 1414 // Sanity check. | 1440 // Sanity check. |
| 1415 for (const cricket::Candidate& candidate : candidates) { | 1441 for (const cricket::Candidate& candidate : candidates) { |
| 1416 if (candidate.transport_name().empty()) { | 1442 if (candidate.transport_name().empty()) { |
| 1417 LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: " | 1443 LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: " |
| 1418 << "empty content name in candidate " | 1444 << "empty content name in candidate " |
| 1419 << candidate.ToString(); | 1445 << candidate.ToString(); |
| 1420 return; | 1446 return; |
| 1421 } | 1447 } |
| 1422 } | 1448 } |
| 1423 | 1449 |
| 1424 if (local_desc_) { | 1450 if (local_description()) { |
| 1425 local_desc_->RemoveCandidates(candidates); | 1451 mutable_local_description()->RemoveCandidates(candidates); |
| 1426 } | 1452 } |
| 1427 if (ice_observer_) { | 1453 if (ice_observer_) { |
| 1428 ice_observer_->OnIceCandidatesRemoved(candidates); | 1454 ice_observer_->OnIceCandidatesRemoved(candidates); |
| 1429 } | 1455 } |
| 1430 } | 1456 } |
| 1431 | 1457 |
| 1432 // Enabling voice and video channel. | 1458 // Enabling voice and video channel. |
| 1433 void WebRtcSession::EnableChannels() { | 1459 void WebRtcSession::EnableChannels() { |
| 1434 if (voice_channel_ && !voice_channel_->enabled()) | 1460 if (voice_channel_ && !voice_channel_->enabled()) |
| 1435 voice_channel_->Enable(true); | 1461 voice_channel_->Enable(true); |
| 1436 | 1462 |
| 1437 if (video_channel_ && !video_channel_->enabled()) | 1463 if (video_channel_ && !video_channel_->enabled()) |
| 1438 video_channel_->Enable(true); | 1464 video_channel_->Enable(true); |
| 1439 | 1465 |
| 1440 if (data_channel_ && !data_channel_->enabled()) | 1466 if (data_channel_ && !data_channel_->enabled()) |
| 1441 data_channel_->Enable(true); | 1467 data_channel_->Enable(true); |
| 1442 } | 1468 } |
| 1443 | 1469 |
| 1444 // Returns the media index for a local ice candidate given the content name. | 1470 // Returns the media index for a local ice candidate given the content name. |
| 1445 bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name, | 1471 bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name, |
| 1446 int* sdp_mline_index) { | 1472 int* sdp_mline_index) { |
| 1447 if (!local_desc_ || !sdp_mline_index) { | 1473 if (!local_description() || !sdp_mline_index) { |
| 1448 return false; | 1474 return false; |
| 1449 } | 1475 } |
| 1450 | 1476 |
| 1451 bool content_found = false; | 1477 bool content_found = false; |
| 1452 const ContentInfos& contents = local_desc_->description()->contents(); | 1478 const ContentInfos& contents = local_description()->description()->contents(); |
| 1453 for (size_t index = 0; index < contents.size(); ++index) { | 1479 for (size_t index = 0; index < contents.size(); ++index) { |
| 1454 if (contents[index].name == content_name) { | 1480 if (contents[index].name == content_name) { |
| 1455 *sdp_mline_index = static_cast<int>(index); | 1481 *sdp_mline_index = static_cast<int>(index); |
| 1456 content_found = true; | 1482 content_found = true; |
| 1457 break; | 1483 break; |
| 1458 } | 1484 } |
| 1459 } | 1485 } |
| 1460 return content_found; | 1486 return content_found; |
| 1461 } | 1487 } |
| 1462 | 1488 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1483 if (!ret) { | 1509 if (!ret) { |
| 1484 break; | 1510 break; |
| 1485 } | 1511 } |
| 1486 } | 1512 } |
| 1487 } | 1513 } |
| 1488 return ret; | 1514 return ret; |
| 1489 } | 1515 } |
| 1490 | 1516 |
| 1491 bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) { | 1517 bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) { |
| 1492 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); | 1518 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); |
| 1493 size_t remote_content_size = remote_desc_->description()->contents().size(); | 1519 size_t remote_content_size = |
| 1520 remote_description()->description()->contents().size(); |
| 1494 if (mediacontent_index >= remote_content_size) { | 1521 if (mediacontent_index >= remote_content_size) { |
| 1495 LOG(LS_ERROR) << "UseCandidate: Invalid candidate media index."; | 1522 LOG(LS_ERROR) << "UseCandidate: Invalid candidate media index."; |
| 1496 return false; | 1523 return false; |
| 1497 } | 1524 } |
| 1498 | 1525 |
| 1499 cricket::ContentInfo content = | 1526 cricket::ContentInfo content = |
| 1500 remote_desc_->description()->contents()[mediacontent_index]; | 1527 remote_description()->description()->contents()[mediacontent_index]; |
| 1501 std::vector<cricket::Candidate> candidates; | 1528 std::vector<cricket::Candidate> candidates; |
| 1502 candidates.push_back(candidate->candidate()); | 1529 candidates.push_back(candidate->candidate()); |
| 1503 // Invoking BaseSession method to handle remote candidates. | 1530 // Invoking BaseSession method to handle remote candidates. |
| 1504 std::string error; | 1531 std::string error; |
| 1505 if (transport_controller_->AddRemoteCandidates(content.name, candidates, | 1532 if (transport_controller_->AddRemoteCandidates(content.name, candidates, |
| 1506 &error)) { | 1533 &error)) { |
| 1507 // Candidates successfully submitted for checking. | 1534 // Candidates successfully submitted for checking. |
| 1508 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || | 1535 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || |
| 1509 ice_connection_state_ == | 1536 ice_connection_state_ == |
| 1510 PeerConnectionInterface::kIceConnectionDisconnected) { | 1537 PeerConnectionInterface::kIceConnectionDisconnected) { |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1828 if (!ValidateBundleSettings(sdesc->description())) { | 1855 if (!ValidateBundleSettings(sdesc->description())) { |
| 1829 return BadSdp(source, type, kBundleWithoutRtcpMux, err_desc); | 1856 return BadSdp(source, type, kBundleWithoutRtcpMux, err_desc); |
| 1830 } | 1857 } |
| 1831 | 1858 |
| 1832 // TODO(skvlad): When the local rtcp-mux policy is Require, reject any | 1859 // TODO(skvlad): When the local rtcp-mux policy is Require, reject any |
| 1833 // m-lines that do not rtcp-mux enabled. | 1860 // m-lines that do not rtcp-mux enabled. |
| 1834 | 1861 |
| 1835 // Verify m-lines in Answer when compared against Offer. | 1862 // Verify m-lines in Answer when compared against Offer. |
| 1836 if (action == kAnswer) { | 1863 if (action == kAnswer) { |
| 1837 const cricket::SessionDescription* offer_desc = | 1864 const cricket::SessionDescription* offer_desc = |
| 1838 (source == cricket::CS_LOCAL) ? remote_desc_->description() | 1865 (source == cricket::CS_LOCAL) ? remote_description()->description() |
| 1839 : local_desc_->description(); | 1866 : local_description()->description(); |
| 1840 if (!VerifyMediaDescriptions(sdesc->description(), offer_desc)) { | 1867 if (!VerifyMediaDescriptions(sdesc->description(), offer_desc)) { |
| 1841 return BadAnswerSdp(source, kMlineMismatch, err_desc); | 1868 return BadAnswerSdp(source, kMlineMismatch, err_desc); |
| 1842 } | 1869 } |
| 1843 } | 1870 } |
| 1844 | 1871 |
| 1845 return true; | 1872 return true; |
| 1846 } | 1873 } |
| 1847 | 1874 |
| 1848 bool WebRtcSession::ExpectSetLocalDescription(Action action) { | 1875 bool WebRtcSession::ExpectSetLocalDescription(Action action) { |
| 1849 return ((action == kOffer && state() == STATE_INIT) || | 1876 return ((action == kOffer && state() == STATE_INIT) || |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1883 // them unset while the session has them set from the previous negotiation. | 1910 // them unset while the session has them set from the previous negotiation. |
| 1884 // Not doing so may trigger the auto generation of transport description and | 1911 // Not doing so may trigger the auto generation of transport description and |
| 1885 // mess up DTLS identity information, ICE credential, etc. | 1912 // mess up DTLS identity information, ICE credential, etc. |
| 1886 bool WebRtcSession::ReadyToUseRemoteCandidate( | 1913 bool WebRtcSession::ReadyToUseRemoteCandidate( |
| 1887 const IceCandidateInterface* candidate, | 1914 const IceCandidateInterface* candidate, |
| 1888 const SessionDescriptionInterface* remote_desc, | 1915 const SessionDescriptionInterface* remote_desc, |
| 1889 bool* valid) { | 1916 bool* valid) { |
| 1890 *valid = true; | 1917 *valid = true; |
| 1891 | 1918 |
| 1892 const SessionDescriptionInterface* current_remote_desc = | 1919 const SessionDescriptionInterface* current_remote_desc = |
| 1893 remote_desc ? remote_desc : remote_desc_.get(); | 1920 remote_desc ? remote_desc : remote_description(); |
| 1894 | 1921 |
| 1895 if (!current_remote_desc) { | 1922 if (!current_remote_desc) { |
| 1896 return false; | 1923 return false; |
| 1897 } | 1924 } |
| 1898 | 1925 |
| 1899 size_t mediacontent_index = | 1926 size_t mediacontent_index = |
| 1900 static_cast<size_t>(candidate->sdp_mline_index()); | 1927 static_cast<size_t>(candidate->sdp_mline_index()); |
| 1901 size_t remote_content_size = | 1928 size_t remote_content_size = |
| 1902 current_remote_desc->description()->contents().size(); | 1929 current_remote_desc->description()->contents().size(); |
| 1903 if (mediacontent_index >= remote_content_size) { | 1930 if (mediacontent_index >= remote_content_size) { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 } | 2101 } |
| 2075 | 2102 |
| 2076 void WebRtcSession::OnDtlsHandshakeError(rtc::SSLHandshakeError error) { | 2103 void WebRtcSession::OnDtlsHandshakeError(rtc::SSLHandshakeError error) { |
| 2077 if (metrics_observer_) { | 2104 if (metrics_observer_) { |
| 2078 metrics_observer_->IncrementEnumCounter( | 2105 metrics_observer_->IncrementEnumCounter( |
| 2079 webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error), | 2106 webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error), |
| 2080 static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE)); | 2107 static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE)); |
| 2081 } | 2108 } |
| 2082 } | 2109 } |
| 2083 } // namespace webrtc | 2110 } // namespace webrtc |
| OLD | NEW |