Browse Source

Changed non-drafts RFC links to canonical location rfc-editor.org

Paul-Louis Ageneau 3 years ago
parent
commit
7d150208c9

+ 14 - 14
README.md

@@ -137,31 +137,31 @@ The library implements the following communication protocols:
 WebRTC allows real-time data and media exchange between two devices through a Peer Connection (or RTCPeerConnection), a signaled peer-to-peer connection which can carry both Data Channels and media tracks. It is compatible with browsers Firefox, Chromium, and Safari, and other WebRTC libraries (see [webrtc-echoes](https://github.com/sipsorcery/webrtc-echoes)). Media transport is optional and can be disabled at compile time.
 WebRTC allows real-time data and media exchange between two devices through a Peer Connection (or RTCPeerConnection), a signaled peer-to-peer connection which can carry both Data Channels and media tracks. It is compatible with browsers Firefox, Chromium, and Safari, and other WebRTC libraries (see [webrtc-echoes](https://github.com/sipsorcery/webrtc-echoes)). Media transport is optional and can be disabled at compile time.
 
 
 Protocol stack:
 Protocol stack:
-- SCTP-based Data Channels ([RFC8831](https://datatracker.ietf.org/doc/html/rfc8831))
-- SRTP-based Media Transport ([RFC8834](https://datatracker.ietf.org/doc/html/rfc8834))
-- DTLS/UDP ([RFC7350](https://datatracker.ietf.org/doc/html/rfc7350) and [RFC8261](https://datatracker.ietf.org/doc/html/rfc8261))
-- ICE ([RFC8445](https://datatracker.ietf.org/doc/html/rfc8445)) with STUN ([RFC8489](https://datatracker.ietf.org/doc/html/rfc8489)) and its extension TURN ([RFC8656](https://datatracker.ietf.org/doc/html/rfc8656))
+- SCTP-based Data Channels ([RFC8831](https://www.rfc-editor.org/rfc/rfc8831.html))
+- SRTP-based Media Transport ([RFC8834](https://www.rfc-editor.org/rfc/rfc8834.html))
+- DTLS/UDP ([RFC7350](https://www.rfc-editor.org/rfc/rfc7350.html) and [RFC8261](https://www.rfc-editor.org/rfc/rfc8261.html))
+- ICE ([RFC8445](https://www.rfc-editor.org/rfc/rfc8445.html)) with STUN ([RFC8489](https://www.rfc-editor.org/rfc/rfc8489.html)) and its extension TURN ([RFC8656](https://www.rfc-editor.org/rfc/rfc8656.html))
 
 
 Features:
 Features:
-- Full IPv6 support (as mandated by [RFC8835](https://datatracker.ietf.org/doc/html/rfc8835))
-- Trickle ICE ([RFC8838](https://datatracker.ietf.org/doc/html/rfc8838))
-- JSEP-compatible session establishment with SDP ([RFC8829](https://datatracker.ietf.org/doc/html/rfc8829))
-- SCTP over DTLS with SDP offer/answer ([RFC8841](https://datatracker.ietf.org/doc/html/rfc8841))
-- DTLS with ECDSA or RSA keys ([RFC8824](https://datatracker.ietf.org/doc/html/rfc8827))
-- SRTP and SRTCP key derivation from DTLS ([RFC5764](https://datatracker.ietf.org/doc/html/rfc5764))
-- Differentiated Services QoS ([RFC8837](https://datatracker.ietf.org/doc/html/rfc8837)) where possible
+- Full IPv6 support (as mandated by [RFC8835](https://www.rfc-editor.org/rfc/rfc8835.html))
+- Trickle ICE ([RFC8838](https://www.rfc-editor.org/rfc/rfc8838.html))
+- JSEP-compatible session establishment with SDP ([RFC8829](https://www.rfc-editor.org/rfc/rfc8829.html))
+- SCTP over DTLS with SDP offer/answer ([RFC8841](https://www.rfc-editor.org/rfc/rfc8841.html))
+- DTLS with ECDSA or RSA keys ([RFC8824](https://www.rfc-editor.org/rfc/rfc8827.html))
+- SRTP and SRTCP key derivation from DTLS ([RFC5764](https://www.rfc-editor.org/rfc/rfc5764.html))
+- Differentiated Services QoS ([RFC8837](https://www.rfc-editor.org/rfc/rfc8837.html)) where possible
 - Multicast DNS candidates ([draft-ietf-rtcweb-mdns-ice-candidates-04](https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-mdns-ice-candidates-04))
 - Multicast DNS candidates ([draft-ietf-rtcweb-mdns-ice-candidates-04](https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-mdns-ice-candidates-04))
 - Multiplexing connections on a single UDP port with libjuice as ICE backend
 - Multiplexing connections on a single UDP port with libjuice as ICE backend
 
 
-Note only SDP BUNDLE mode is supported for media multiplexing ([RFC8843](https://datatracker.ietf.org/doc/html/rfc8843)). The behavior is equivalent to the JSEP bundle-only policy: the library always negociates one unique network component, where SRTP media streams are multiplexed with SRTCP control packets ([RFC5761](https://datatracker.ietf.org/doc/html/rfc5761)) and SCTP/DTLS data traffic ([RFC8261](https://datatracker.ietf.org/doc/html/rfc8261)).
+Note only SDP BUNDLE mode is supported for media multiplexing ([RFC8843](https://www.rfc-editor.org/rfc/rfc8843.html)). The behavior is equivalent to the JSEP bundle-only policy: the library always negociates one unique network component, where SRTP media streams are multiplexed with SRTCP control packets ([RFC5761](https://www.rfc-editor.org/rfc/rfc5761.html)) and SCTP/DTLS data traffic ([RFC8261](https://www.rfc-editor.org/rfc/rfc8261.html)).
 
 
 ### WebSocket
 ### WebSocket
 
 
 WebSocket is the protocol of choice for WebRTC signaling. The support is optional and can be disabled at compile time.
 WebSocket is the protocol of choice for WebRTC signaling. The support is optional and can be disabled at compile time.
 
 
 Protocol stack:
 Protocol stack:
-- WebSocket protocol ([RFC6455](https://datatracker.ietf.org/doc/html/rfc6455)), client and server side
-- HTTP over TLS ([RFC2818](https://datatracker.ietf.org/doc/html/rfc2818))
+- WebSocket protocol ([RFC6455](https://www.rfc-editor.org/rfc/rfc6455.html)), client and server side
+- HTTP over TLS ([RFC2818](https://www.rfc-editor.org/rfc/rfc2818.html))
 
 
 Features:
 Features:
 - IPv6 and IPv4/IPv6 dual-stack support
 - IPv6 and IPv4/IPv6 dual-stack support

+ 1 - 1
src/configuration.cpp

@@ -23,7 +23,7 @@
 namespace rtc {
 namespace rtc {
 
 
 IceServer::IceServer(const string &url) {
 IceServer::IceServer(const string &url) {
-	// Modified regex from RFC 3986, see https://datatracker.ietf.org/doc/html/rfc3986#appendix-B
+	// Modified regex from RFC 3986, see https://www.rfc-editor.org/rfc/rfc3986.html#appendix-B
 	static const char *rs =
 	static const char *rs =
 	    R"(^(([^:.@/?#]+):)?(/{0,2}((([^:@]*)(:([^@]*))?)@)?(([^:/?#]*)(:([^/?#]*))?))?([^?#]*)(\?([^#]*))?(#(.*))?)";
 	    R"(^(([^:.@/?#]+):)?(/{0,2}((([^:@]*)(:([^@]*))?)@)?(([^:/?#]*)(:([^/?#]*))?))?([^?#]*)(\?([^#]*))?(#(.*))?)";
 	static const std::regex r(rs, std::regex::extended);
 	static const std::regex r(rs, std::regex::extended);

+ 1 - 1
src/description.cpp

@@ -274,7 +274,7 @@ string Description::generateSdp(string_view eol) const {
 	sdp << "t=0 0" << eol;
 	sdp << "t=0 0" << eol;
 
 
 	// Bundle (RFC8843 Negotiating Media Multiplexing Using the Session Description Protocol)
 	// Bundle (RFC8843 Negotiating Media Multiplexing Using the Session Description Protocol)
-	// https://datatracker.ietf.org/doc/html/rfc8843
+	// https://www.rfc-editor.org/rfc/rfc8843.html
 	sdp << "a=group:BUNDLE";
 	sdp << "a=group:BUNDLE";
 	for (const auto &entry : mEntries)
 	for (const auto &entry : mEntries)
 		sdp << ' ' << entry->mid();
 		sdp << ' ' << entry->mid();

+ 2 - 2
src/impl/certificate.cpp

@@ -69,7 +69,7 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
 	// RFC 8827 WebRTC Security Architecture 6.5. Communications Security
 	// RFC 8827 WebRTC Security Architecture 6.5. Communications Security
 	// All implementations MUST support DTLS 1.2 with the TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
 	// All implementations MUST support DTLS 1.2 with the TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
 	// cipher suite and the P-256 curve
 	// cipher suite and the P-256 curve
-	// See https://datatracker.ietf.org/doc/html/rfc8827#section-6.5
+	// See https://www.rfc-editor.org/rfc/rfc8827.html#section-6.5
 	case CertificateType::Default:
 	case CertificateType::Default:
 	case CertificateType::Ecdsa: {
 	case CertificateType::Ecdsa: {
 		gnutls::check(gnutls_x509_privkey_generate(*privkey, GNUTLS_PK_ECDSA,
 		gnutls::check(gnutls_x509_privkey_generate(*privkey, GNUTLS_PK_ECDSA,
@@ -233,7 +233,7 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
 	// RFC 8827 WebRTC Security Architecture 6.5. Communications Security
 	// RFC 8827 WebRTC Security Architecture 6.5. Communications Security
 	// All implementations MUST support DTLS 1.2 with the TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
 	// All implementations MUST support DTLS 1.2 with the TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
 	// cipher suite and the P-256 curve
 	// cipher suite and the P-256 curve
-	// See https://datatracker.ietf.org/doc/html/rfc8827#section-6.5
+	// See https://www.rfc-editor.org/rfc/rfc8827.html#section-6.5
 	case CertificateType::Default:
 	case CertificateType::Default:
 	case CertificateType::Ecdsa: {
 	case CertificateType::Ecdsa: {
 		PLOG_VERBOSE << "Generating ECDSA P-256 key pair";
 		PLOG_VERBOSE << "Generating ECDSA P-256 key pair";

+ 1 - 1
src/impl/datachannel.cpp

@@ -37,7 +37,7 @@ using std::chrono::milliseconds;
 namespace rtc::impl {
 namespace rtc::impl {
 
 
 // Messages for the DataChannel establishment protocol (RFC 8832)
 // Messages for the DataChannel establishment protocol (RFC 8832)
-// See https://datatracker.ietf.org/doc/html/rfc8832
+// See https://www.rfc-editor.org/rfc/rfc8832.html
 
 
 enum MessageType : uint8_t {
 enum MessageType : uint8_t {
 	MESSAGE_OPEN_REQUEST = 0x00,
 	MESSAGE_OPEN_REQUEST = 0x00,

+ 3 - 3
src/impl/dtlssrtptransport.cpp

@@ -109,7 +109,7 @@ bool DtlsSrtpTransport::sendMedia(message_ptr message) {
 	             << unsigned(value2);
 	             << unsigned(value2);
 
 
 	// RFC 5761 Multiplexing RTP and RTCP 4. Distinguishable RTP and RTCP Packets
 	// RFC 5761 Multiplexing RTP and RTCP 4. Distinguishable RTP and RTCP Packets
-	// https://datatracker.ietf.org/doc/html/rfc5761#section-4
+	// https://www.rfc-editor.org/rfc/rfc5761.html#section-4
 	// It is RECOMMENDED to follow the guidelines in the RTP/AVP profile for the choice of RTP
 	// It is RECOMMENDED to follow the guidelines in the RTP/AVP profile for the choice of RTP
 	// payload type values, with the additional restriction that payload type values in the
 	// payload type values, with the additional restriction that payload type values in the
 	// range 64-95 MUST NOT be used. Specifically, dynamic RTP payload types SHOULD be chosen in
 	// range 64-95 MUST NOT be used. Specifically, dynamic RTP payload types SHOULD be chosen in
@@ -139,7 +139,7 @@ bool DtlsSrtpTransport::sendMedia(message_ptr message) {
 
 
 	if (message->dscp == 0) { // Track might override the value
 	if (message->dscp == 0) { // Track might override the value
 		// Set recommended medium-priority DSCP value
 		// Set recommended medium-priority DSCP value
-		// See https://datatracker.ietf.org/doc/html/rfc8837#section-5
+		// See https://www.rfc-editor.org/rfc/rfc8837.html#section-5
 		message->dscp = 36; // AF42: Assured Forwarding class 4, medium drop probability
 		message->dscp = 36; // AF42: Assured Forwarding class 4, medium drop probability
 	}
 	}
 
 
@@ -158,7 +158,7 @@ void DtlsSrtpTransport::incoming(message_ptr message) {
 		return;
 		return;
 
 
 	// RFC 5764 5.1.2. Reception
 	// RFC 5764 5.1.2. Reception
-	// https://datatracker.ietf.org/doc/html/rfc5764#section-5.1.2
+	// https://www.rfc-editor.org/rfc/rfc5764.html#section-5.1.2
 	// The process for demultiplexing a packet is as follows. The receiver looks at the first byte
 	// The process for demultiplexing a packet is as follows. The receiver looks at the first byte
 	// of the packet. [...] If the value is in between 128 and 191 (inclusive), then the packet is
 	// of the packet. [...] If the value is in between 128 and 191 (inclusive), then the packet is
 	// RTP (or RTCP [...]). If the value is between 20 and 63 (inclusive), the packet is DTLS.
 	// RTP (or RTCP [...]). If the value is between 20 and 63 (inclusive), the packet is DTLS.

+ 9 - 9
src/impl/dtlstransport.cpp

@@ -66,14 +66,14 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, certificate_ptr cer
 	try {
 	try {
 		// RFC 8261: SCTP performs segmentation and reassembly based on the path MTU.
 		// RFC 8261: SCTP performs segmentation and reassembly based on the path MTU.
 		// Therefore, the DTLS layer MUST NOT use any compression algorithm.
 		// Therefore, the DTLS layer MUST NOT use any compression algorithm.
-		// See https://datatracker.ietf.org/doc/html/rfc8261#section-5
+		// See https://www.rfc-editor.org/rfc/rfc8261.html#section-5
 		const char *priorities = "SECURE128:-VERS-SSL3.0:-ARCFOUR-128:-COMP-ALL:+COMP-NULL";
 		const char *priorities = "SECURE128:-VERS-SSL3.0:-ARCFOUR-128:-COMP-ALL:+COMP-NULL";
 		const char *err_pos = NULL;
 		const char *err_pos = NULL;
 		gnutls::check(gnutls_priority_set_direct(mSession, priorities, &err_pos),
 		gnutls::check(gnutls_priority_set_direct(mSession, priorities, &err_pos),
 		              "Failed to set TLS priorities");
 		              "Failed to set TLS priorities");
 
 
 		// RFC 8827: The DTLS-SRTP protection profile SRTP_AES128_CM_HMAC_SHA1_80 MUST be supported
 		// RFC 8827: The DTLS-SRTP protection profile SRTP_AES128_CM_HMAC_SHA1_80 MUST be supported
-		// See https://datatracker.ietf.org/doc/html/rfc8827#section-6.5
+		// See https://www.rfc-editor.org/rfc/rfc8827.html#section-6.5
 		gnutls::check(gnutls_srtp_set_profile(mSession, GNUTLS_SRTP_AES128_CM_HMAC_SHA1_80),
 		gnutls::check(gnutls_srtp_set_profile(mSession, GNUTLS_SRTP_AES128_CM_HMAC_SHA1_80),
 		              "Failed to set SRTP profile");
 		              "Failed to set SRTP profile");
 
 
@@ -183,7 +183,7 @@ void DtlsTransport::runRecvLoop() {
 		         !gnutls::check(ret, "DTLS handshake failed"));
 		         !gnutls::check(ret, "DTLS handshake failed"));
 
 
 		// RFC 8261: DTLS MUST support sending messages larger than the current path MTU
 		// RFC 8261: DTLS MUST support sending messages larger than the current path MTU
-		// See https://datatracker.ietf.org/doc/html/rfc8261#section-5
+		// See https://www.rfc-editor.org/rfc/rfc8261.html#section-5
 		gnutls_dtls_set_mtu(mSession, bufferSize + 1);
 		gnutls_dtls_set_mtu(mSession, bufferSize + 1);
 
 
 	} catch (const std::exception &e) {
 	} catch (const std::exception &e) {
@@ -208,7 +208,7 @@ void DtlsTransport::runRecvLoop() {
 
 
 			// RFC 8827: Implementations MUST NOT implement DTLS renegotiation and MUST reject it
 			// RFC 8827: Implementations MUST NOT implement DTLS renegotiation and MUST reject it
 			// with a "no_renegotiation" alert if offered.
 			// with a "no_renegotiation" alert if offered.
-			// See https://datatracker.ietf.org/doc/html/rfc8827#section-6.5
+			// See https://www.rfc-editor.org/rfc/rfc8827.html#section-6.5
 			if (ret == GNUTLS_E_REHANDSHAKE) {
 			if (ret == GNUTLS_E_REHANDSHAKE) {
 				do {
 				do {
 					std::lock_guard lock(mSendMutex);
 					std::lock_guard lock(mSendMutex);
@@ -377,9 +377,9 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, certificate_ptr cer
 
 
 		// RFC 8261: SCTP performs segmentation and reassembly based on the path MTU.
 		// RFC 8261: SCTP performs segmentation and reassembly based on the path MTU.
 		// Therefore, the DTLS layer MUST NOT use any compression algorithm.
 		// Therefore, the DTLS layer MUST NOT use any compression algorithm.
-		// See https://datatracker.ietf.org/doc/html/rfc8261#section-5
+		// See https://www.rfc-editor.org/rfc/rfc8261.html#section-5
 		// RFC 8827: Implementations MUST NOT implement DTLS renegotiation
 		// RFC 8827: Implementations MUST NOT implement DTLS renegotiation
-		// See https://datatracker.ietf.org/doc/html/rfc8827#section-6.5
+		// See https://www.rfc-editor.org/rfc/rfc8827.html#section-6.5
 		SSL_CTX_set_options(mCtx, SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION | SSL_OP_NO_QUERY_MTU |
 		SSL_CTX_set_options(mCtx, SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION | SSL_OP_NO_QUERY_MTU |
 		                              SSL_OP_NO_RENEGOTIATION);
 		                              SSL_OP_NO_RENEGOTIATION);
 
 
@@ -427,7 +427,7 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, certificate_ptr cer
 		SSL_set_tmp_ecdh(mSsl, ecdh.get());
 		SSL_set_tmp_ecdh(mSsl, ecdh.get());
 
 
 		// RFC 8827: The DTLS-SRTP protection profile SRTP_AES128_CM_HMAC_SHA1_80 MUST be supported
 		// RFC 8827: The DTLS-SRTP protection profile SRTP_AES128_CM_HMAC_SHA1_80 MUST be supported
-		// See https://datatracker.ietf.org/doc/html/rfc8827#section-6.5 Warning:
+		// See https://www.rfc-editor.org/rfc/rfc8827.html#section-6.5 Warning:
 		// SSL_set_tlsext_use_srtp() returns 0 on success and 1 on error
 		// SSL_set_tlsext_use_srtp() returns 0 on success and 1 on error
 		if (SSL_set_tlsext_use_srtp(mSsl, "SRTP_AES128_CM_SHA1_80"))
 		if (SSL_set_tlsext_use_srtp(mSsl, "SRTP_AES128_CM_SHA1_80"))
 			throw std::runtime_error("Failed to set SRTP profile: " +
 			throw std::runtime_error("Failed to set SRTP profile: " +
@@ -495,7 +495,7 @@ bool DtlsTransport::outgoing(message_ptr message) {
 		// DTLS handshake packet
 		// DTLS handshake packet
 		if (state() != DtlsTransport::State::Connected) {
 		if (state() != DtlsTransport::State::Connected) {
 			// Set recommended high-priority DSCP value
 			// Set recommended high-priority DSCP value
-			// See https://datatracker.ietf.org/doc/html/rfc8837#section-5
+			// See https://www.rfc-editor.org/rfc/rfc8837.html#section-5
 			message->dscp = 18; // AF21(18), Assured Forwarding class 2, low drop probability
 			message->dscp = 18; // AF21(18), Assured Forwarding class 2, low drop probability
 		} else {
 		} else {
 			message->dscp = mCurrentDscp;
 			message->dscp = mCurrentDscp;
@@ -536,7 +536,7 @@ void DtlsTransport::runRecvLoop() {
 
 
 					if (SSL_is_init_finished(mSsl)) {
 					if (SSL_is_init_finished(mSsl)) {
 						// RFC 8261: DTLS MUST support sending messages larger than the current path
 						// RFC 8261: DTLS MUST support sending messages larger than the current path
-						// MTU See https://datatracker.ietf.org/doc/html/rfc8261#section-5
+						// MTU See https://www.rfc-editor.org/rfc/rfc8261.html#section-5
 						SSL_set_mtu(mSsl, bufferSize + 1);
 						SSL_set_mtu(mSsl, bufferSize + 1);
 
 
 						PLOG_INFO << "DTLS handshake finished";
 						PLOG_INFO << "DTLS handshake finished";

+ 2 - 2
src/impl/icetransport.cpp

@@ -173,7 +173,7 @@ Description IceTransport::getLocalDescription(Description::Type type) const {
 
 
 	// RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of
 	// RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of
 	// setup:actpass.
 	// setup:actpass.
-	// See https://datatracker.ietf.org/doc/html/rfc5763#section-5
+	// See https://www.rfc-editor.org/rfc/rfc5763.html#section-5
 	Description desc(string(sdp), type,
 	Description desc(string(sdp), type,
 	                 type == Description::Type::Offer ? Description::Role::ActPass : mRole);
 	                 type == Description::Type::Offer ? Description::Role::ActPass : mRole);
 	desc.addIceOption("trickle");
 	desc.addIceOption("trickle");
@@ -586,7 +586,7 @@ Description IceTransport::getLocalDescription(Description::Type type) const {
 
 
 	// RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of
 	// RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of
 	// setup:actpass.
 	// setup:actpass.
-	// See https://datatracker.ietf.org/doc/html/rfc5763#section-5
+	// See https://www.rfc-editor.org/rfc/rfc5763.html#section-5
 	Description desc(string(sdp.get()), type,
 	Description desc(string(sdp.get()), type,
 	                 type == Description::Type::Offer ? Description::Role::ActPass : mRole);
 	                 type == Description::Type::Offer ? Description::Role::ActPass : mRole);
 	desc.addIceOption("trickle");
 	desc.addIceOption("trickle");

+ 3 - 3
src/impl/peerconnection.cpp

@@ -427,7 +427,7 @@ void PeerConnection::forwardMessage(message_ptr message) {
 		if (!iceTransport || !sctpTransport)
 		if (!iceTransport || !sctpTransport)
 			return;
 			return;
 
 
-		// See https://datatracker.ietf.org/doc/html/rfc8832
+		// See https://www.rfc-editor.org/rfc/rfc8832.html
 		const byte dataChannelOpenMessage{0x03};
 		const byte dataChannelOpenMessage{0x03};
 		uint16_t remoteParity = (iceTransport->role() == Description::Role::Active) ? 1 : 0;
 		uint16_t remoteParity = (iceTransport->role() == Description::Role::Active) ? 1 : 0;
 		if (message->type == Message::Control) {
 		if (message->type == Message::Control) {
@@ -599,7 +599,7 @@ shared_ptr<DataChannel> PeerConnection::emplaceDataChannel(string label, DataCha
 	} else {
 	} else {
 		// RFC 5763: The answerer MUST use either a setup attribute value of setup:active or
 		// RFC 5763: The answerer MUST use either a setup attribute value of setup:active or
 		// setup:passive. [...] Thus, setup:active is RECOMMENDED.
 		// setup:passive. [...] Thus, setup:active is RECOMMENDED.
-		// See https://datatracker.ietf.org/doc/html/rfc5763#section-5
+		// See https://www.rfc-editor.org/rfc/rfc5763.html#section-5
 		// Therefore, we assume passive role if we are the offerer.
 		// Therefore, we assume passive role if we are the offerer.
 		auto iceTransport = getIceTransport();
 		auto iceTransport = getIceTransport();
 		auto role = iceTransport ? iceTransport->role() : Description::Role::Passive;
 		auto role = iceTransport ? iceTransport->role() : Description::Role::Passive;
@@ -608,7 +608,7 @@ shared_ptr<DataChannel> PeerConnection::emplaceDataChannel(string label, DataCha
 		// which the corresponding incoming and outgoing streams are unused.  If the side is acting
 		// which the corresponding incoming and outgoing streams are unused.  If the side is acting
 		// as the DTLS client, it MUST choose an even stream identifier; if the side is acting as
 		// as the DTLS client, it MUST choose an even stream identifier; if the side is acting as
 		// the DTLS server, it MUST choose an odd one.
 		// the DTLS server, it MUST choose an odd one.
-		// See https://datatracker.ietf.org/doc/html/rfc8832#section-6
+		// See https://www.rfc-editor.org/rfc/rfc8832.html#section-6
 		stream = (role == Description::Role::Active) ? 0 : 1;
 		stream = (role == Description::Role::Active) ? 0 : 1;
 		while (mDataChannels.find(stream) != mDataChannels.end()) {
 		while (mDataChannels.find(stream) != mDataChannels.end()) {
 			if (stream >= 65535 - 2)
 			if (stream >= 65535 - 2)

+ 9 - 9
src/impl/sctptransport.cpp

@@ -34,7 +34,7 @@
 
 
 // RFC 8831: SCTP MUST support performing Path MTU discovery without relying on ICMP or ICMPv6 as
 // RFC 8831: SCTP MUST support performing Path MTU discovery without relying on ICMP or ICMPv6 as
 // specified in [RFC4821] by using probing messages specified in [RFC4820].
 // specified in [RFC4821] by using probing messages specified in [RFC4820].
-// See https://datatracker.ietf.org/doc/html/rfc8831#section-5
+// See https://www.rfc-editor.org/rfc/rfc8831.html#section-5
 //
 //
 // However, usrsctp does not implement Path MTU discovery, so we need to disable it for now.
 // However, usrsctp does not implement Path MTU discovery, so we need to disable it for now.
 // See https://github.com/sctplab/usrsctp/issues/205
 // See https://github.com/sctplab/usrsctp/issues/205
@@ -236,7 +236,7 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
 
 
 	// RFC 8831 6.6. Transferring User Data on a Data Channel
 	// RFC 8831 6.6. Transferring User Data on a Data Channel
 	// The sender SHOULD disable the Nagle algorithm (see [RFC1122) to minimize the latency
 	// The sender SHOULD disable the Nagle algorithm (see [RFC1122) to minimize the latency
-	// See https://datatracker.ietf.org/doc/html/rfc8831#section-6.6
+	// See https://www.rfc-editor.org/rfc/rfc8831.html#section-6.6
 	int nodelay = 1;
 	int nodelay = 1;
 	if (usrsctp_setsockopt(mSock, IPPROTO_SCTP, SCTP_NODELAY, &nodelay, sizeof(nodelay)))
 	if (usrsctp_setsockopt(mSock, IPPROTO_SCTP, SCTP_NODELAY, &nodelay, sizeof(nodelay)))
 		throw std::runtime_error("Could not set socket option SCTP_NODELAY, errno=" +
 		throw std::runtime_error("Could not set socket option SCTP_NODELAY, errno=" +
@@ -253,7 +253,7 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
 	// bit is not possible (for example, due to implementation restrictions), a safe value for the
 	// bit is not possible (for example, due to implementation restrictions), a safe value for the
 	// path MTU has to be used by the SCTP stack. It is RECOMMENDED that the safe value not exceed
 	// path MTU has to be used by the SCTP stack. It is RECOMMENDED that the safe value not exceed
 	// 1200 bytes.
 	// 1200 bytes.
-	// See https://datatracker.ietf.org/doc/html/rfc8261#section-5
+	// See https://www.rfc-editor.org/rfc/rfc8261.html#section-5
 #if USE_PMTUD
 #if USE_PMTUD
 	if (!config.mtu.has_value()) {
 	if (!config.mtu.has_value()) {
 #else
 #else
@@ -280,7 +280,7 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
 	// RFC 8831 6.2. SCTP Association Management
 	// RFC 8831 6.2. SCTP Association Management
 	// The number of streams negotiated during SCTP association setup SHOULD be 65535, which is the
 	// The number of streams negotiated during SCTP association setup SHOULD be 65535, which is the
 	// maximum number of streams that can be negotiated during the association setup.
 	// maximum number of streams that can be negotiated during the association setup.
-	// See https://datatracker.ietf.org/doc/html/rfc8831#section-6.2
+	// See https://www.rfc-editor.org/rfc/rfc8831.html#section-6.2
 	struct sctp_initmsg sinit = {};
 	struct sctp_initmsg sinit = {};
 	sinit.sinit_num_ostreams = 65535;
 	sinit.sinit_num_ostreams = 65535;
 	sinit.sinit_max_instreams = 65535;
 	sinit.sinit_max_instreams = 65535;
@@ -385,7 +385,7 @@ void SctpTransport::connect() {
 
 
 	// According to RFC 8841, both endpoints must initiate the SCTP association, in a
 	// According to RFC 8841, both endpoints must initiate the SCTP association, in a
 	// simultaneous-open manner, irrelevent to the SDP setup role.
 	// simultaneous-open manner, irrelevent to the SDP setup role.
-	// See https://datatracker.ietf.org/doc/html/rfc8841#section-9.3
+	// See https://www.rfc-editor.org/rfc/rfc8841.html#section-9.3
 	auto remote = getSockAddrConn(mPorts.remote);
 	auto remote = getSockAddrConn(mPorts.remote);
 	int ret = usrsctp_connect(mSock, reinterpret_cast<struct sockaddr *>(&remote), sizeof(remote));
 	int ret = usrsctp_connect(mSock, reinterpret_cast<struct sockaddr *>(&remote), sizeof(remote));
 	if (ret && errno != EINPROGRESS)
 	if (ret && errno != EINPROGRESS)
@@ -443,7 +443,7 @@ void SctpTransport::closeStream(unsigned int stream) {
 
 
 	// RFC 8831 6.7. Closing a Data Channel
 	// RFC 8831 6.7. Closing a Data Channel
 	// Closing of a data channel MUST be signaled by resetting the corresponding outgoing streams
 	// Closing of a data channel MUST be signaled by resetting the corresponding outgoing streams
-	// See https://datatracker.ietf.org/doc/html/rfc8831#section-6.7
+	// See https://www.rfc-editor.org/rfc/rfc8831.html#section-6.7
 	mSendQueue.push(make_message(0, Message::Reset, to_uint16(stream)));
 	mSendQueue.push(make_message(0, Message::Reset, to_uint16(stream)));
 
 
 	// This method must not call the buffered callback synchronously
 	// This method must not call the buffered callback synchronously
@@ -473,7 +473,7 @@ void SctpTransport::incoming(message_ptr message) {
 
 
 bool SctpTransport::outgoing(message_ptr message) {
 bool SctpTransport::outgoing(message_ptr message) {
 	// Set recommended medium-priority DSCP value
 	// Set recommended medium-priority DSCP value
-	// See https://datatracker.ietf.org/doc/html/rfc8837#section-5
+	// See https://www.rfc-editor.org/rfc/rfc8837.html#section-5
 	message->dscp = 10; // AF11: Assured Forwarding class 1, low drop probability
 	message->dscp = 10; // AF11: Assured Forwarding class 1, low drop probability
 	return Transport::outgoing(std::move(message));
 	return Transport::outgoing(std::move(message));
 }
 }
@@ -736,7 +736,7 @@ void SctpTransport::processData(binary &&data, uint16_t sid, PayloadId ppid) {
 	// RFC 8831: The usage of the PPIDs "WebRTC String Partial" and "WebRTC Binary Partial" is
 	// RFC 8831: The usage of the PPIDs "WebRTC String Partial" and "WebRTC Binary Partial" is
 	// deprecated. They were used for a PPID-based fragmentation and reassembly of user messages
 	// deprecated. They were used for a PPID-based fragmentation and reassembly of user messages
 	// belonging to reliable and ordered data channels.
 	// belonging to reliable and ordered data channels.
-	// See https://datatracker.ietf.org/doc/html/rfc8831#section-6.6
+	// See https://www.rfc-editor.org/rfc/rfc8831.html#section-6.6
 	// We handle those PPIDs at reception for compatibility reasons but shall never send them.
 	// We handle those PPIDs at reception for compatibility reasons but shall never send them.
 	switch (ppid) {
 	switch (ppid) {
 	case PPID_CONTROL:
 	case PPID_CONTROL:
@@ -860,7 +860,7 @@ void SctpTransport::processNotification(const union sctp_notification *notify, s
 		// If one side decides to close the data channel, it resets the corresponding outgoing
 		// If one side decides to close the data channel, it resets the corresponding outgoing
 		// stream. When the peer sees that an incoming stream was reset, it also resets its
 		// stream. When the peer sees that an incoming stream was reset, it also resets its
 		// corresponding outgoing stream.
 		// corresponding outgoing stream.
-		// See https://datatracker.ietf.org/doc/html/rfc8831#section-6.7
+		// See https://www.rfc-editor.org/rfc/rfc8831.html#section-6.7
 		if (flags & SCTP_STREAM_RESET_INCOMING_SSN) {
 		if (flags & SCTP_STREAM_RESET_INCOMING_SSN) {
 			const byte dataChannelCloseMessage{0x04};
 			const byte dataChannelCloseMessage{0x04};
 			for (int i = 0; i < count; ++i) {
 			for (int i = 0; i < count; ++i) {

+ 1 - 1
src/impl/track.cpp

@@ -175,7 +175,7 @@ bool Track::transportSend([[maybe_unused]] message_ptr message) {
 			throw std::runtime_error("Track is closed");
 			throw std::runtime_error("Track is closed");
 
 
 		// Set recommended medium-priority DSCP value
 		// Set recommended medium-priority DSCP value
-		// See https://datatracker.ietf.org/doc/html/rfc8837#section-5
+		// See https://www.rfc-editor.org/rfc/rfc8837.html#section-5
 		if (mMediaDescription.type() == "audio")
 		if (mMediaDescription.type() == "audio")
 			message->dscp = 46; // EF: Expedited Forwarding
 			message->dscp = 46; // EF: Expedited Forwarding
 		else
 		else

+ 1 - 1
src/impl/websocket.cpp

@@ -57,7 +57,7 @@ void WebSocket::open(const string &url) {
 	if (state != State::Closed)
 	if (state != State::Closed)
 		throw std::logic_error("WebSocket must be closed before opening");
 		throw std::logic_error("WebSocket must be closed before opening");
 
 
-	// Modified regex from RFC 3986, see https://datatracker.ietf.org/doc/html/rfc3986#appendix-B
+	// Modified regex from RFC 3986, see https://www.rfc-editor.org/rfc/rfc3986.html#appendix-B
 	static const char *rs =
 	static const char *rs =
 	    R"(^(([^:.@/?#]+):)?(/{0,2}((([^:@]*)(:([^@]*))?)@)?(([^:/?#]*)(:([^/?#]*))?))?([^?#]*)(\?([^#]*))?(#(.*))?)";
 	    R"(^(([^:.@/?#]+):)?(/{0,2}((([^:@]*)(:([^@]*))?)@)?(([^:/?#]*)(:([^/?#]*))?))?([^?#]*)(\?([^#]*))?(#(.*))?)";
 
 

+ 1 - 1
src/impl/wstransport.cpp

@@ -204,7 +204,7 @@ bool WsTransport::sendHttpError(int code) {
 }
 }
 
 
 // RFC6455 5.2. Base Framing Protocol
 // RFC6455 5.2. Base Framing Protocol
-// http://datatracker.ietf.org/doc/html/rfc6455#section-5.2
+// https://www.rfc-editor.org/rfc/rfc6455.html#section-5.2
 //
 //
 //  0                   1                   2                   3
 //  0                   1                   2                   3
 //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+ 1 - 1
src/rtcpreceivingsession.cpp

@@ -48,7 +48,7 @@ message_ptr RtcpReceivingSession::incoming(message_ptr ptr) {
 	if (ptr->type == Message::Binary) {
 	if (ptr->type == Message::Binary) {
 		auto rtp = reinterpret_cast<const RtpHeader *>(ptr->data());
 		auto rtp = reinterpret_cast<const RtpHeader *>(ptr->data());
 
 
-		// https://datatracker.ietf.org/doc/html/rfc3550#appendix-A.1
+		// https://www.rfc-editor.org/rfc/rfc3550.html#appendix-A.1
 		if (rtp->version() != 2) {
 		if (rtp->version() != 2) {
 			COUNTER_BAD_RTP_HEADER++;
 			COUNTER_BAD_RTP_HEADER++;
 			PLOG_VERBOSE << "RTP packet is not version 2";
 			PLOG_VERBOSE << "RTP packet is not version 2";