From d0b1119047d2044e39f06b1825687970875f23d5 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Fri, 24 Oct 2025 22:34:56 +0000 Subject: [PATCH 01/10] Reorganize error codes: --- draft-ietf-moq-transport.md | 85 ++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index bfdee4198..e3971e0cd 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2187,6 +2187,7 @@ REQUEST_ERROR Message { Length (16), Request ID (i), Error Code (i), + [Retry Interval (i)], Error Reason (Reason Phrase), } ~~~ @@ -2196,66 +2197,83 @@ REQUEST_ERROR Message { * Error Code: Identifies an integer error code for request failure. +* Retry Interval: The minimum time (in seconds) before the request SHOULD be +sent again. Present only if the Error Code is odd. + * Error Reason: Provides a text description of the request error. See - {{reason-phrase}}. + {{reason-phrase}}.i The application SHOULD use a relevant error code in REQUEST_ERROR, -as defined below. Most codepoints have identical meanings for various request -types, but some have request-specific meanings. +as defined below and assigned in {{iana-request-error}}. Most codepoints have +identical meanings for various request types, but some have request-specific +meanings. -INTERNAL_ERROR (0x0): +Odd error codes indicate the request is retryable with the same parameters at a +later time. If so, the sender of REQUEST_ERROR includes a Retry Interval in the +message. If it is sending more than one such message within a second or so, it +SHOULD jitter the Retry Interval to avoid a flood of retries. The Retry Interval +MAY be zero if the request can be retried immediately. + +If the sender has no information as to when a request is likely to be +successful, it MAY jitter around a default interval of 30 seconds. + +If a Retry Interval exceeds the lifetime of a necessary authentication token +used in the request, so that a retry at that time would faile, the sender SHOULD +use a non-retryable error code indicating a new authentication token is needed. + +INTERNAL_ERROR: : An implementation specific or generic error occurred. -UNAUTHORIZED (0x1): +UNAUTHORIZED: : The subscriber is not authorized to perform the requested action on the given track. -TIMEOUT (0x2): +TIMEOUT: : The subscription could not be completed before an implementation specific timeout. For example, a relay could not establish an upstream subscription within the timeout. -NOT_SUPPORTED (0x3): +NOT_SUPPORTED: : The endpoint does not support the type of request. -MALFORMED_AUTH_TOKEN (0x4): +MALFORMED_AUTH_TOKEN: : Invalid Auth Token serialization during registration (see {{authorization-token}}). -EXPIRED_AUTH_TOKEN (0x5): +EXPIRED_AUTH_TOKEN: : Authorization token has expired ({{authorization-token}}). Below are errors for use by the publisher. They can appear in response to SUBSCRIBE, FETCH, TRACK_STATUS, and SUBSCRIBE_NAMESPACE, unless otherwise noted. -DOES_NOT_EXIST (0x10): +DOES_NOT_EXIST: : The track or namespace is not available at the publisher. -INVALID_RANGE (0x11): +INVALID_RANGE: : In response to SUBSCRIBE or FETCH, specified Filter or range of Locations cannot be satisfied. -MALFORMED_TRACK (0x12): +MALFORMED_TRACK: : In response to a FETCH, a relay publisher detected the track was malformed (see {{malformed-tracks}}). The following are errors for use by the subscriber. They can appear in response to PUBLISH or PUBLISH_NAMESPACE, unless otherwise noted. -UNINTERESTED (0x20): +UNINTERESTED: : The subscriber is not interested in the track or namespace. Errors below can only be used in response to one message type. -PREFIX_OVERLAP (0x30): +PREFIX_OVERLAP: : In response to SUBSCRIBE_NAMESPACE, the namespace prefix overlaps with another SUBSCRIBE_NAMESPACE in the same session. -INVALID_JOINING_REQUEST_ID(0x32): +INVALID_JOINING_REQUEST_ID: : In response to a Joining FETCH, the referenced Request ID is not an `Established` Subscription. -UNKNOWN_STATUS_IN_RANGE(0x33): +UNKNOWN_STATUS_IN_RANGE: : In response to a FETCH, the requested range contains an object with unknown status. @@ -3889,19 +3907,28 @@ TODO: register the URI scheme and the ALPN and grease the Extension types | Name | Code | Specification | |:---------------------------|:----:|:--------------------------| -| INTERNAL_ERROR | 0x0 | {{message-request-error}} | -| UNAUTHORIZED | 0x1 | {{message-request-error}} | -| TIMEOUT | 0x2 | {{message-request-error}} | -| NOT_SUPPORTED | 0x3 | {{message-request-error}} | -| MALFORMED_AUTH_TOKEN | 0x4 | {{message-request-error}} | -| EXPIRED_AUTH_TOKEN | 0x5 | {{message-request-error}} | -| DOES_NOT_EXIST | 0x10 | {{message-request-error}} | -| INVALID_RANGE | 0x11 | {{message-request-error}} | -| MALFORMED_TRACK | 0x12 | {{message-request-error}} | -| UNINTERESTED | 0x20 | {{message-request-error}} | -| PREFIX_OVERLAP | 0x30 | {{message-request-error}} | -| INVALID_JOINING_REQUEST_ID | 0x32 | {{message-request-error}} | -| UNKNOWN_STATUS_IN_RANGE | 0x33 | {{message-request-error}} | +| INTERNAL_ERROR | 0x1 | {{message-request-error}} | +| UNAUTHORIZED | 0x2 | {{message-request-error}} | +| TIMEOUT | 0x3 | {{message-request-error}} | +| NOT_SUPPORTED | 0x4 | {{message-request-error}} | +| INVALID_RANGE | 0x5 | {{message-request-error}} | +| MALFORMED_AUTH_TOKEN | 0x6 | {{message-request-error}} | +| UNKNOWN_STATUS_IN_RANGE | 0x7 | {{message-request-error}} | +| EXPIRED_AUTH_TOKEN | 0x8 | {{message-request-error}} | +| MALFORMED_TRACK | 0x9 | {{message-request-error}} | +| UNINTERESTED | 0xa | {{message-request-error}} | +| DOES_NOT_EXIST | 0xb | {{message-request-error}} | +| PREFIX_OVERLAP | 0xc | {{message-request-error}} | +| INVALID_JOINING_REQUEST_ID | 0xe | {{message-request-error}} | + +As noted above, odd error codes are potentially retryable. + +The range of error codes including 0x100 to 0xffff is reserved for +implementation-speceific codes. + +The range of error codes starting with 0x10000 is reserved for +provisional error codes that are under consideration for a permanent +code point by the IETF. ### PUBLISH_DONE Codes {#iana-publish-done} From c07dc24a307b1719d8e47de770cf1337c93f228f Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Fri, 24 Oct 2025 22:36:53 +0000 Subject: [PATCH 02/10] typo --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index e3971e0cd..f32cc2cf0 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2201,7 +2201,7 @@ REQUEST_ERROR Message { sent again. Present only if the Error Code is odd. * Error Reason: Provides a text description of the request error. See - {{reason-phrase}}.i + {{reason-phrase}}. The application SHOULD use a relevant error code in REQUEST_ERROR, as defined below and assigned in {{iana-request-error}}. Most codepoints have From e856a66c9bcecde89363671fd9a90b7c051f93a9 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Fri, 24 Oct 2025 16:00:28 -0700 Subject: [PATCH 03/10] Update draft-ietf-moq-transport.md Co-authored-by: afrind --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index f32cc2cf0..8a0597407 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2218,7 +2218,7 @@ If the sender has no information as to when a request is likely to be successful, it MAY jitter around a default interval of 30 seconds. If a Retry Interval exceeds the lifetime of a necessary authentication token -used in the request, so that a retry at that time would faile, the sender SHOULD +used in the request, so that a retry at that time would fail, the sender SHOULD use a non-retryable error code indicating a new authentication token is needed. INTERNAL_ERROR: From 0ffa865a8b13d496e1f7dfd2d6fd5054c6a50448 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Wed, 29 Oct 2025 21:16:39 +0000 Subject: [PATCH 04/10] alan comments --- draft-ietf-moq-transport.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 8a0597407..17977ba2a 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2222,7 +2222,8 @@ used in the request, so that a retry at that time would fail, the sender SHOULD use a non-retryable error code indicating a new authentication token is needed. INTERNAL_ERROR: -: An implementation specific or generic error occurred. +: An implementation specific or generic error occurred. This might be retryable +or not, depending on the codepoint. UNAUTHORIZED: : The subscriber is not authorized to perform the requested action on the given @@ -2247,11 +2248,13 @@ Below are errors for use by the publisher. They can appear in response to SUBSCRIBE, FETCH, TRACK_STATUS, and SUBSCRIBE_NAMESPACE, unless otherwise noted. DOES_NOT_EXIST: -: The track or namespace is not available at the publisher. +: The track or namespace is not available at the publisher. This might be +retryable or not, if the target might exist later. INVALID_RANGE: : In response to SUBSCRIBE or FETCH, specified Filter or range of Locations -cannot be satisfied. +cannot be satisfied. This might be retryable if the range is expected to have +objects in the future. MALFORMED_TRACK: : In response to a FETCH, a relay publisher detected @@ -2261,7 +2264,8 @@ The following are errors for use by the subscriber. They can appear in response to PUBLISH or PUBLISH_NAMESPACE, unless otherwise noted. UNINTERESTED: -: The subscriber is not interested in the track or namespace. +: The subscriber is not interested in the track or namespace. This might be +retryable if it expects to be interested later. Errors below can only be used in response to one message type. @@ -3907,21 +3911,26 @@ TODO: register the URI scheme and the ALPN and grease the Extension types | Name | Code | Specification | |:---------------------------|:----:|:--------------------------| +| INTERNAL_ERROR | 0x0 | {{message-request-error}} | | INTERNAL_ERROR | 0x1 | {{message-request-error}} | | UNAUTHORIZED | 0x2 | {{message-request-error}} | | TIMEOUT | 0x3 | {{message-request-error}} | -| NOT_SUPPORTED | 0x4 | {{message-request-error}} | +| INVALID_RANGE | 0x4 | {{message-request-error}} | | INVALID_RANGE | 0x5 | {{message-request-error}} | -| MALFORMED_AUTH_TOKEN | 0x6 | {{message-request-error}} | +| NOT_SUPPORTED | 0x6 | {{message-request-error}} | | UNKNOWN_STATUS_IN_RANGE | 0x7 | {{message-request-error}} | -| EXPIRED_AUTH_TOKEN | 0x8 | {{message-request-error}} | +| MALFORMED_AUTH_TOKEN | 0x8 | {{message-request-error}} | | MALFORMED_TRACK | 0x9 | {{message-request-error}} | | UNINTERESTED | 0xa | {{message-request-error}} | -| DOES_NOT_EXIST | 0xb | {{message-request-error}} | -| PREFIX_OVERLAP | 0xc | {{message-request-error}} | -| INVALID_JOINING_REQUEST_ID | 0xe | {{message-request-error}} | - -As noted above, odd error codes are potentially retryable. +| UNINTERESTED | 0xb | {{message-request-error}} | +| DOES_NOT_EXIST | 0xc | {{message-request-error}} | +| DOES_NOT_EXIST | 0xd | {{message-request-error}} | +| EXPIRED_AUTH_TOKEN | 0xe | {{message-request-error}} | +| PREFIX_OVERLAP | 0x10 | {{message-request-error}} | +| INVALID_JOINING_REQUEST_ID | 0x12 | {{message-request-error}} | + +As noted above, odd error codes are potentially retryable. Some codes +have both retryable and non-retryable versions. The range of error codes including 0x100 to 0xffff is reserved for implementation-speceific codes. From e55c677b4deab94079e339e584f9a9e412c6abd0 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Wed, 29 Oct 2025 14:42:52 -0700 Subject: [PATCH 05/10] Update draft-ietf-moq-transport.md Co-authored-by: afrind --- draft-ietf-moq-transport.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 17977ba2a..ee7f114e9 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2211,7 +2211,8 @@ meanings. Odd error codes indicate the request is retryable with the same parameters at a later time. If so, the sender of REQUEST_ERROR includes a Retry Interval in the message. If it is sending more than one such message within a second or so, it -SHOULD jitter the Retry Interval to avoid a flood of retries. The Retry Interval +SHOULD apply randomization to each retry interval so that retries are spread out +over time, minimizing the risk of synchronized retry storms. The Retry Interval MAY be zero if the request can be retried immediately. If the sender has no information as to when a request is likely to be From b8e16264a4c4986e8a475ce6b6686be75cb470e6 Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Wed, 29 Oct 2025 14:43:00 -0700 Subject: [PATCH 06/10] Update draft-ietf-moq-transport.md Co-authored-by: afrind --- draft-ietf-moq-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index ee7f114e9..cb70cc520 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2216,7 +2216,7 @@ over time, minimizing the risk of synchronized retry storms. The Retry Interval MAY be zero if the request can be retried immediately. If the sender has no information as to when a request is likely to be -successful, it MAY jitter around a default interval of 30 seconds. +successful, it MAY apply randomization around a default interval of 30 seconds. If a Retry Interval exceeds the lifetime of a necessary authentication token used in the request, so that a retry at that time would fail, the sender SHOULD From e7008bdfb8d1529701a28460d54ee609dd89353f Mon Sep 17 00:00:00 2001 From: Martin Duke Date: Wed, 29 Oct 2025 21:44:16 +0000 Subject: [PATCH 07/10] Alan comments --- draft-ietf-moq-transport.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index cb70cc520..8a6aaa879 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2210,10 +2210,11 @@ meanings. Odd error codes indicate the request is retryable with the same parameters at a later time. If so, the sender of REQUEST_ERROR includes a Retry Interval in the -message. If it is sending more than one such message within a second or so, it -SHOULD apply randomization to each retry interval so that retries are spread out -over time, minimizing the risk of synchronized retry storms. The Retry Interval -MAY be zero if the request can be retried immediately. +message. If it is sending more than one such message within a second or so +across one or more sessions, it SHOULD apply randomization to each retry +interval so that retries are spread out over time, minimizing the risk of +synchronized retry storms. The Retry Interval MAY be zero if the request can be +retried immediately. If the sender has no information as to when a request is likely to be successful, it MAY apply randomization around a default interval of 30 seconds. From 8cf52336521520a6ee12f4b9e20907a25f30a651 Mon Sep 17 00:00:00 2001 From: afrind Date: Sat, 8 Nov 2025 08:03:30 -0800 Subject: [PATCH 08/10] Retry Interval always present, 0 means don't retry --- draft-ietf-moq-transport.md | 54 ++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 5245c5af8..f2c16b820 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2203,7 +2203,7 @@ REQUEST_ERROR Message { Length (16), Request ID (i), Error Code (i), - [Retry Interval (i)], + Retry Interval (i), Error Reason (Reason Phrase), } ~~~ @@ -2214,7 +2214,7 @@ REQUEST_ERROR Message { * Error Code: Identifies an integer error code for request failure. * Retry Interval: The minimum time (in seconds) before the request SHOULD be -sent again. Present only if the Error Code is odd. + sent again, plus one. If the value is 0, the request SHOULD NOT be retried. * Error Reason: Provides a text description of the request error. See {{reason-phrase}}. @@ -2224,28 +2224,27 @@ as defined below and assigned in {{iana-request-error}}. Most codepoints have identical meanings for various request types, but some have request-specific meanings. -Odd error codes indicate the request is retryable with the same parameters at a -later time. If so, the sender of REQUEST_ERROR includes a Retry Interval in the -message. If it is sending more than one such message within a second or so -across one or more sessions, it SHOULD apply randomization to each retry -interval so that retries are spread out over time, minimizing the risk of -synchronized retry storms. The Retry Interval MAY be zero if the request can be -retried immediately. +If request is retryable with the same parameters at a later time, the sender of +REQUEST_ERROR includes a non-zero Retry Interval in the message. If it is +sending more than one such message within a second or so across one or more +sessions, it SHOULD apply randomization to each retry interval so that retries +are spread out over time, minimizing the risk of synchronized retry storms. The +Retry Interval value MAY be one if the request can be retried immediately. If the sender has no information as to when a request is likely to be successful, it MAY apply randomization around a default interval of 30 seconds. If a Retry Interval exceeds the lifetime of a necessary authentication token used in the request, so that a retry at that time would fail, the sender SHOULD -use a non-retryable error code indicating a new authentication token is needed. +use an error code indicating a new authentication token is needed. INTERNAL_ERROR: : An implementation specific or generic error occurred. This might be retryable -or not, depending on the codepoint. +or not, depending on the imlementation conditions that caused the error. UNAUTHORIZED: : The subscriber is not authorized to perform the requested action on the given -track. +track. This might be retryable if the authorization token is not yet valid. TIMEOUT: : The subscription could not be completed before an implementation specific @@ -3935,25 +3934,18 @@ TODO: register the URI scheme and the ALPN and grease the Extension types | Name | Code | Specification | |:---------------------------|:----:|:--------------------------| | INTERNAL_ERROR | 0x0 | {{message-request-error}} | -| INTERNAL_ERROR | 0x1 | {{message-request-error}} | -| UNAUTHORIZED | 0x2 | {{message-request-error}} | -| TIMEOUT | 0x3 | {{message-request-error}} | -| INVALID_RANGE | 0x4 | {{message-request-error}} | -| INVALID_RANGE | 0x5 | {{message-request-error}} | -| NOT_SUPPORTED | 0x6 | {{message-request-error}} | -| UNKNOWN_STATUS_IN_RANGE | 0x7 | {{message-request-error}} | -| MALFORMED_AUTH_TOKEN | 0x8 | {{message-request-error}} | -| MALFORMED_TRACK | 0x9 | {{message-request-error}} | -| UNINTERESTED | 0xa | {{message-request-error}} | -| UNINTERESTED | 0xb | {{message-request-error}} | -| DOES_NOT_EXIST | 0xc | {{message-request-error}} | -| DOES_NOT_EXIST | 0xd | {{message-request-error}} | -| EXPIRED_AUTH_TOKEN | 0xe | {{message-request-error}} | -| PREFIX_OVERLAP | 0x10 | {{message-request-error}} | -| INVALID_JOINING_REQUEST_ID | 0x12 | {{message-request-error}} | - -As noted above, odd error codes are potentially retryable. Some codes -have both retryable and non-retryable versions. +| UNAUTHORIZED | 0x1 | {{message-request-error}} | +| TIMEOUT | 0x2 | {{message-request-error}} | +| NOT_SUPPORTED | 0x3 | {{message-request-error}} | +| MALFORMED_AUTH_TOKEN | 0x4 | {{message-request-error}} | +| EXPIRED_AUTH_TOKEN | 0x5 | {{message-request-error}} | +| DOES_NOT_EXIST | 0x10 | {{message-request-error}} | +| INVALID_RANGE | 0x11 | {{message-request-error}} | +| MALFORMED_TRACK | 0x12 | {{message-request-error}} | +| UNINTERESTED | 0x20 | {{message-request-error}} | +| PREFIX_OVERLAP | 0x30 | {{message-request-error}} | +| INVALID_JOINING_REQUEST_ID | 0x32 | {{message-request-error}} | +| UNKNOWN_STATUS_IN_RANGE | 0x33 | {{message-request-error}} | The range of error codes including 0x100 to 0xffff is reserved for implementation-speceific codes. From 0b9714c64cf01fdb3aa48642c9531aa54f436511 Mon Sep 17 00:00:00 2001 From: afrind Date: Sat, 8 Nov 2025 15:34:09 -0800 Subject: [PATCH 09/10] Apply suggestions from code review Co-authored-by: ianswett --- draft-ietf-moq-transport.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 1949f6ba4..699db2e57 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2224,12 +2224,12 @@ as defined below and assigned in {{iana-request-error}}. Most codepoints have identical meanings for various request types, but some have request-specific meanings. -If request is retryable with the same parameters at a later time, the sender of +If a request is retryable with the same parameters at a later time, the sender of REQUEST_ERROR includes a non-zero Retry Interval in the message. If it is sending more than one such message within a second or so across one or more sessions, it SHOULD apply randomization to each retry interval so that retries -are spread out over time, minimizing the risk of synchronized retry storms. The -Retry Interval value MAY be one if the request can be retried immediately. +are spread out over time, minimizing the risk of synchronized retry storms. A +Retry Interval value of 1 indicates the request can be retried immediately. If the sender has no information as to when a request is likely to be successful, it MAY apply randomization around a default interval of 30 seconds. @@ -2240,7 +2240,7 @@ use an error code indicating a new authentication token is needed. INTERNAL_ERROR: : An implementation specific or generic error occurred. This might be retryable -or not, depending on the imlementation conditions that caused the error. +or not, depending on the implementation conditions that caused the error. UNAUTHORIZED: : The subscriber is not authorized to perform the requested action on the given From b6299a589fccddc7566fb74b87c952dbcd8e68b5 Mon Sep 17 00:00:00 2001 From: afrind Date: Thu, 13 Nov 2025 11:44:25 -0800 Subject: [PATCH 10/10] Apply suggestions from code review --- draft-ietf-moq-transport.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/draft-ietf-moq-transport.md b/draft-ietf-moq-transport.md index 699db2e57..3f1ab0e81 100644 --- a/draft-ietf-moq-transport.md +++ b/draft-ietf-moq-transport.md @@ -2231,13 +2231,6 @@ sessions, it SHOULD apply randomization to each retry interval so that retries are spread out over time, minimizing the risk of synchronized retry storms. A Retry Interval value of 1 indicates the request can be retried immediately. -If the sender has no information as to when a request is likely to be -successful, it MAY apply randomization around a default interval of 30 seconds. - -If a Retry Interval exceeds the lifetime of a necessary authentication token -used in the request, so that a retry at that time would fail, the sender SHOULD -use an error code indicating a new authentication token is needed. - INTERNAL_ERROR: : An implementation specific or generic error occurred. This might be retryable or not, depending on the implementation conditions that caused the error.