Guard preferred_dscp with the network interface lock

Bug: webrtc:10389
Change-Id: I96112c2135c9c2d545140feeef6345f8a9b81086
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/126540
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Amit Hilbuch <amithi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27043}
This commit is contained in:
Steve Anton 2019-03-08 15:09:16 -08:00 committed by Commit Bot
parent 9a071d14aa
commit e25f595c0a
8 changed files with 29 additions and 42 deletions

View File

@ -35,10 +35,6 @@ int MediaChannel::GetRtpSendTimeExtnId() const {
return -1;
}
rtc::DiffServCodePoint MediaChannel::PreferredDscp() const {
return rtc::DSCP_DEFAULT;
}
void MediaChannel::SetFrameEncryptor(
uint32_t ssrc,
rtc::scoped_refptr<webrtc::FrameEncryptorInterface> frame_encryptor) {

View File

@ -280,23 +280,37 @@ class MediaChannel : public sigslot::has_slots<> {
const webrtc::RtpParameters& parameters) = 0;
protected:
virtual rtc::DiffServCodePoint PreferredDscp() const;
bool DscpEnabled() const { return enable_dscp_; }
// This method sets DSCP |value| on both RTP and RTCP channels.
int UpdateDscp() {
// This is the DSCP value used for both RTP and RTCP channels if DSCP is
// enabled. It can be changed at any time via |SetPreferredDscp|.
rtc::DiffServCodePoint PreferredDscp() const {
rtc::CritScope cs(&network_interface_crit_);
return preferred_dscp_;
}
int SetPreferredDscp(rtc::DiffServCodePoint preferred_dscp) {
rtc::CritScope cs(&network_interface_crit_);
if (preferred_dscp == preferred_dscp_) {
return 0;
}
preferred_dscp_ = preferred_dscp;
return UpdateDscp();
}
private:
// Apply the preferred DSCP setting to the underlying network interface RTP
// and RTCP channels. If DSCP is disabled, then apply the default DSCP value.
int UpdateDscp() RTC_EXCLUSIVE_LOCKS_REQUIRED(network_interface_crit_) {
rtc::DiffServCodePoint value =
enable_dscp_ ? PreferredDscp() : rtc::DSCP_DEFAULT;
int ret;
ret = SetOption(NetworkInterface::ST_RTP, rtc::Socket::OPT_DSCP, value);
enable_dscp_ ? preferred_dscp_ : rtc::DSCP_DEFAULT;
int ret = SetOption(NetworkInterface::ST_RTP, rtc::Socket::OPT_DSCP, value);
if (ret == 0) {
ret = SetOption(NetworkInterface::ST_RTCP, rtc::Socket::OPT_DSCP, value);
}
return ret;
}
private:
bool DoSendPacket(rtc::CopyOnWriteBuffer* packet,
bool rtcp,
const rtc::PacketOptions& options) {
@ -313,7 +327,10 @@ class MediaChannel : public sigslot::has_slots<> {
// from any MediaEngine threads. This critical section is to protect accessing
// of network_interface_ object.
rtc::CriticalSection network_interface_crit_;
NetworkInterface* network_interface_ = nullptr;
NetworkInterface* network_interface_ RTC_GUARDED_BY(network_interface_crit_) =
nullptr;
rtc::DiffServCodePoint preferred_dscp_
RTC_GUARDED_BY(network_interface_crit_) = rtc::DSCP_DEFAULT;
webrtc::MediaTransportInterface* media_transport_ = nullptr;
bool extmap_allow_mixed_ = false;
};

View File

@ -56,6 +56,7 @@ static const DataCodec* FindCodecByName(const std::vector<DataCodec>& codecs,
RtpDataMediaChannel::RtpDataMediaChannel(const MediaConfig& config)
: DataMediaChannel(config) {
Construct();
SetPreferredDscp(rtc::DSCP_AF41);
}
void RtpDataMediaChannel::Construct() {
@ -331,8 +332,4 @@ bool RtpDataMediaChannel::SendData(const SendDataParams& params,
return true;
}
rtc::DiffServCodePoint RtpDataMediaChannel::PreferredDscp() const {
return rtc::DSCP_AF41;
}
} // namespace cricket

View File

@ -89,7 +89,6 @@ class RtpDataMediaChannel : public DataMediaChannel {
virtual bool SendData(const SendDataParams& params,
const rtc::CopyOnWriteBuffer& payload,
SendDataResult* result);
virtual rtc::DiffServCodePoint PreferredDscp() const;
private:
void Construct();

View File

@ -524,7 +524,6 @@ WebRtcVideoChannel::WebRtcVideoChannel(
encoder_factory_(encoder_factory),
decoder_factory_(decoder_factory),
bitrate_allocator_factory_(bitrate_allocator_factory),
preferred_dscp_(rtc::DSCP_DEFAULT),
default_send_options_(options),
last_stats_log_ms_(-1),
discard_unknown_ssrc_packets_(webrtc::field_trial::IsEnabled(
@ -660,11 +659,6 @@ bool WebRtcVideoChannel::GetChangedSendParameters(
return true;
}
rtc::DiffServCodePoint WebRtcVideoChannel::PreferredDscp() const {
RTC_DCHECK_RUN_ON(&thread_checker_);
return preferred_dscp_;
}
bool WebRtcVideoChannel::SetSendParameters(const VideoSendParameters& params) {
RTC_DCHECK_RUN_ON(&thread_checker_);
TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetSendParameters");
@ -800,10 +794,7 @@ webrtc::RTCError WebRtcVideoChannel::SetRtpSendParameters(
return webrtc::RTCError(webrtc::RTCErrorType::INVALID_RANGE);
}
if (new_dscp != preferred_dscp_) {
preferred_dscp_ = new_dscp;
MediaChannel::UpdateDscp();
}
SetPreferredDscp(new_dscp);
}
return it->second->SetRtpParameters(parameters);

View File

@ -118,8 +118,6 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
~WebRtcVideoChannel() override;
// VideoMediaChannel implementation
rtc::DiffServCodePoint PreferredDscp() const override;
bool SetSendParameters(const VideoSendParameters& params) override;
bool SetRecvParameters(const VideoRecvParameters& params) override;
webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
@ -529,7 +527,6 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
// TODO(deadbeef): Don't duplicate information between
// send_params/recv_params, rtp_extensions, options, etc.
VideoSendParameters send_params_ RTC_GUARDED_BY(thread_checker_);
rtc::DiffServCodePoint preferred_dscp_ RTC_GUARDED_BY(thread_checker_);
VideoOptions default_send_options_ RTC_GUARDED_BY(thread_checker_);
VideoRecvParameters recv_params_ RTC_GUARDED_BY(thread_checker_);
int64_t last_stats_log_ms_ RTC_GUARDED_BY(thread_checker_);

View File

@ -1275,10 +1275,6 @@ WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
engine()->UnregisterChannel(this);
}
rtc::DiffServCodePoint WebRtcVoiceMediaChannel::PreferredDscp() const {
return preferred_dscp_;
}
bool WebRtcVoiceMediaChannel::SetSendParameters(
const AudioSendParameters& params) {
TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetSendParameters");
@ -1407,10 +1403,7 @@ webrtc::RTCError WebRtcVoiceMediaChannel::SetRtpSendParameters(
return webrtc::RTCError(webrtc::RTCErrorType::INVALID_RANGE);
}
if (new_dscp != preferred_dscp_) {
preferred_dscp_ = new_dscp;
MediaChannel::UpdateDscp();
}
SetPreferredDscp(new_dscp);
}
// TODO(minyue): The following legacy actions go into

View File

@ -155,8 +155,6 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
const AudioOptions& options() const { return options_; }
rtc::DiffServCodePoint PreferredDscp() const override;
bool SetSendParameters(const AudioSendParameters& params) override;
bool SetRecvParameters(const AudioRecvParameters& params) override;
webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
@ -275,7 +273,6 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
std::vector<AudioCodec> recv_codecs_;
int max_send_bitrate_bps_ = 0;
rtc::DiffServCodePoint preferred_dscp_ = rtc::DSCP_DEFAULT;
AudioOptions options_;
absl::optional<int> dtmf_payload_type_;
int dtmf_payload_freq_ = -1;