Fix the definition of MoQT MAX_SUBSCRIBE_ID.
The provided value is one more than the maximum subscribe ID allowed, not the highest allowed.
PiperOrigin-RevId: 702040595
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc
index 5fda82e..772dbff 100644
--- a/quiche/quic/moqt/moqt_session.cc
+++ b/quiche/quic/moqt/moqt_session.cc
@@ -449,7 +449,7 @@
return false;
}
// TODO(martinduke): support authorization info
- if (next_subscribe_id_ > peer_max_subscribe_id_) {
+ if (next_subscribe_id_ >= peer_max_subscribe_id_) {
QUIC_DLOG(INFO) << ENDPOINT << "Tried to send SUBSCRIBE with ID "
<< next_subscribe_id_
<< " which is greater than the maximum ID "
@@ -624,7 +624,7 @@
Error(MoqtError::kProtocolViolation, "Received SUBSCRIBE from publisher");
return false;
}
- if (subscribe_id > local_max_subscribe_id_) {
+ if (subscribe_id >= local_max_subscribe_id_) {
QUIC_DLOG(INFO) << ENDPOINT << "Received SUBSCRIBE with too large ID";
Error(MoqtError::kTooManySubscribes,
"Received SUBSCRIBE with too large ID");
diff --git a/quiche/quic/moqt/moqt_session.h b/quiche/quic/moqt/moqt_session.h
index 628f188..33063ba 100644
--- a/quiche/quic/moqt/moqt_session.h
+++ b/quiche/quic/moqt/moqt_session.h
@@ -577,7 +577,7 @@
uint64_t next_remote_track_alias_ = 0;
// The next subscribe ID that the local endpoint can send.
uint64_t next_subscribe_id_ = 0;
- // The maximum subscribe ID that the local endpoint can send.
+ // The local endpoint can send subscribe IDs less than this value.
uint64_t peer_max_subscribe_id_ = 0;
// All open incoming subscriptions, indexed by track name, used to check for
@@ -617,7 +617,8 @@
// The minimum subscribe ID the peer can use that is monotonically increasing.
uint64_t next_incoming_subscribe_id_ = 0;
- // The maximum subscribe ID sent to the peer.
+ // The maximum subscribe ID sent to the peer. Peer-generated IDs must be less
+ // than this value.
uint64_t local_max_subscribe_id_ = 0;
// Must be last. Token used to make sure that the streams do not call into
diff --git a/quiche/quic/moqt/moqt_session_test.cc b/quiche/quic/moqt/moqt_session_test.cc
index 3298cfc..349c147 100644
--- a/quiche/quic/moqt/moqt_session_test.cc
+++ b/quiche/quic/moqt/moqt_session_test.cc
@@ -452,7 +452,7 @@
TEST_F(MoqtSessionTest, TooManySubscribes) {
MoqtSessionPeer::set_next_subscribe_id(&session_,
- kDefaultInitialMaxSubscribeId);
+ kDefaultInitialMaxSubscribeId - 1);
MockSubscribeRemoteTrackVisitor remote_track_visitor;
webtransport::test::MockStream mock_stream;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
@@ -462,7 +462,7 @@
Writev(ControlMessageOfType(MoqtMessageType::kSubscribe), _));
EXPECT_TRUE(session_.SubscribeCurrentGroup(FullTrackName("foo", "bar"),
&remote_track_visitor));
- EXPECT_FALSE(session_.SubscribeCurrentGroup(FullTrackName("foo", "bar"),
+ EXPECT_FALSE(session_.SubscribeCurrentGroup(FullTrackName("foo2", "bar2"),
&remote_track_visitor));
}
@@ -508,7 +508,7 @@
TEST_F(MoqtSessionTest, MaxSubscribeIdChangesResponse) {
MoqtSessionPeer::set_next_subscribe_id(&session_,
- kDefaultInitialMaxSubscribeId + 1);
+ kDefaultInitialMaxSubscribeId);
MockSubscribeRemoteTrackVisitor remote_track_visitor;
EXPECT_FALSE(session_.SubscribeCurrentGroup(FullTrackName("foo", "bar"),
&remote_track_visitor));
@@ -552,7 +552,7 @@
session_.GrantMoreSubscribes(1);
// Peer subscribes to (0, 0)
MoqtSubscribe request = {
- /*subscribe_id=*/kDefaultInitialMaxSubscribeId + 1,
+ /*subscribe_id=*/kDefaultInitialMaxSubscribeId,
/*track_alias=*/2,
/*full_track_name=*/FullTrackName({"foo", "bar"}),
/*subscriber_priority=*/0x80,