TurnCustomizer - an interface for modifying stun messages sent by TurnPort

This patch adds an interface that allows modification of stun messages
sent by TurnPort. A user can inject a TurnCustomizer on the RTCConfig
and the TurnCustomizer will be invoked by TurnPort before sending
message. This allows user to e.g add custom attributes as described
in rtf5389.

BUG=webrtc:8313

Change-Id: I6f4333e9f8ff7fd20f32677be19285f15e1180b6
Reviewed-on: https://webrtc-review.googlesource.com/7618
Reviewed-by: Guido Urdaneta <guidou@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20233}
This commit is contained in:
Jonas Oreland
2017-10-10 14:01:40 +02:00
committed by Commit Bot
parent 2ff7ecfceb
commit bdcee28ee9
27 changed files with 559 additions and 36 deletions

View File

@ -67,9 +67,18 @@ bool StunMessage::SetTransactionID(const std::string& str) {
return true;
}
static bool ImplementationDefinedRange(int attr_type)
{
return attr_type >= 0xC000 && attr_type <= 0xFFFF;
}
void StunMessage::AddAttribute(std::unique_ptr<StunAttribute> attr) {
// Fail any attributes that aren't valid for this type of message.
RTC_DCHECK_EQ(attr->value_type(), GetAttributeValueType(attr->type()));
// Fail any attributes that aren't valid for this type of message,
// but allow any type for the range that is "implementation defined"
// in the RFC.
if (!ImplementationDefinedRange(attr->type())) {
RTC_DCHECK_EQ(attr->value_type(), GetAttributeValueType(attr->type()));
}
attr->SetOwner(this);
size_t attr_length = attr->length();
@ -398,8 +407,16 @@ StunAttributeValueType StunMessage::GetAttributeValueType(int type) const {
StunAttribute* StunMessage::CreateAttribute(int type, size_t length) /*const*/ {
StunAttributeValueType value_type = GetAttributeValueType(type);
return StunAttribute::Create(value_type, type, static_cast<uint16_t>(length),
this);
if (value_type != STUN_VALUE_UNKNOWN) {
return StunAttribute::Create(value_type, type,
static_cast<uint16_t>(length), this);
} else if (ImplementationDefinedRange(type)) {
// Read unknown attributes as STUN_VALUE_BYTE_STRING
return StunAttribute::Create(STUN_VALUE_BYTE_STRING, type,
static_cast<uint16_t>(length), this);
} else {
return NULL;
}
}
const StunAttribute* StunMessage::GetAttribute(int type) const {