Delete Subscribe ID from MoQT Object headers new to draft-07 PiperOrigin-RevId: 690628260
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc index f15f380..3e0834d 100644 --- a/quiche/quic/moqt/moqt_framer.cc +++ b/quiche/quic/moqt/moqt_framer.cc
@@ -304,7 +304,6 @@ case MoqtForwardingPreference::kTrack: return (message.payload_length == 0) ? Serialize(WireVarInt62(message_type), - WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias), WireUint8(message.publisher_priority), WireVarInt62(message.group_id), @@ -312,7 +311,6 @@ WireVarInt62(message.payload_length), WireVarInt62(message.object_status)) : Serialize(WireVarInt62(message_type), - WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias), WireUint8(message.publisher_priority), WireVarInt62(message.group_id), @@ -321,7 +319,6 @@ case MoqtForwardingPreference::kSubgroup: return (message.payload_length == 0) ? Serialize(WireVarInt62(message_type), - WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias), WireVarInt62(message.group_id), WireVarInt62(*message.subgroup_id), @@ -330,7 +327,6 @@ WireVarInt62(message.payload_length), WireVarInt62(message.object_status)) : Serialize(WireVarInt62(message_type), - WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias), WireVarInt62(message.group_id), WireVarInt62(*message.subgroup_id), @@ -363,17 +359,15 @@ if (message.payload_length == 0) { return Serialize( WireVarInt62(MoqtDataStreamType::kObjectDatagram), - WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias), - WireVarInt62(message.group_id), WireVarInt62(message.object_id), - WireUint8(message.publisher_priority), + WireVarInt62(message.track_alias), WireVarInt62(message.group_id), + WireVarInt62(message.object_id), WireUint8(message.publisher_priority), WireVarInt62(message.payload_length), WireVarInt62(message.object_status)); } return Serialize( WireVarInt62(MoqtDataStreamType::kObjectDatagram), - WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias), - WireVarInt62(message.group_id), WireVarInt62(message.object_id), - WireUint8(message.publisher_priority), + WireVarInt62(message.track_alias), WireVarInt62(message.group_id), + WireVarInt62(message.object_id), WireUint8(message.publisher_priority), WireVarInt62(message.payload_length), WireBytes(payload)); }
diff --git a/quiche/quic/moqt/moqt_framer_test.cc b/quiche/quic/moqt/moqt_framer_test.cc index e73142f..b740d64 100644 --- a/quiche/quic/moqt/moqt_framer_test.cc +++ b/quiche/quic/moqt/moqt_framer_test.cc
@@ -288,7 +288,6 @@ TEST_F(MoqtFramerSimpleTest, BadObjectInput) { MoqtObject object = { // This is a valid object. - /*subscribe_id=*/3, /*track_alias=*/4, /*group_id=*/5, /*object_id=*/6, @@ -330,7 +329,6 @@ TEST_F(MoqtFramerSimpleTest, BadDatagramInput) { MoqtObject object = { // This is a valid datagram. - /*subscribe_id=*/3, /*track_alias=*/4, /*group_id=*/5, /*object_id=*/6, @@ -367,7 +365,6 @@ TEST_F(MoqtFramerSimpleTest, Datagram) { auto datagram = std::make_unique<ObjectDatagramMessage>(); MoqtObject object = { - /*subscribe_id=*/3, /*track_alias=*/4, /*group_id=*/5, /*object_id=*/6,
diff --git a/quiche/quic/moqt/moqt_messages.h b/quiche/quic/moqt/moqt_messages.h index eaca3d6..5a4064a 100644 --- a/quiche/quic/moqt/moqt_messages.h +++ b/quiche/quic/moqt/moqt_messages.h
@@ -324,7 +324,6 @@ // The data contained in every Object message, although the message type // implies some of the values. struct QUICHE_EXPORT MoqtObject { - uint64_t subscribe_id; uint64_t track_alias; uint64_t group_id; uint64_t object_id;
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc index 1af9f74..2c63356 100644 --- a/quiche/quic/moqt/moqt_parser.cc +++ b/quiche/quic/moqt/moqt_parser.cc
@@ -63,8 +63,7 @@ size_t ParseObjectHeader(quic::QuicDataReader& reader, MoqtObject& object, MoqtDataStreamType type) { - if (!reader.ReadVarInt62(&object.subscribe_id) || - !reader.ReadVarInt62(&object.track_alias)) { + if (!reader.ReadVarInt62(&object.track_alias)) { return 0; } if (type != MoqtDataStreamType::kStreamHeaderTrack &&
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc index fb9ed3c..3e6a0d9 100644 --- a/quiche/quic/moqt/moqt_parser_test.cc +++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -460,7 +460,7 @@ TEST_F(MoqtMessageSpecificTest, ThreePartObjectFirstIncomplete) { MoqtDataParser parser(&visitor_); auto message = std::make_unique<StreamHeaderSubgroupMessage>(); - EXPECT_TRUE(message->SetPayloadLength(50)); + EXPECT_TRUE(message->SetPayloadLength(51)); // first part parser.ProcessData(message->PacketSample().substr(0, 4), false); @@ -474,9 +474,9 @@ EXPECT_EQ(visitor_.messages_received_, 0); EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_)); EXPECT_FALSE(visitor_.end_of_message_); - // The value "47" is the overall wire image size of 55 minus the non-payload + // The value "48" is the overall wire image size of 55 minus the non-payload // part of the message. - EXPECT_EQ(visitor_.object_payload().length(), 47); + EXPECT_EQ(visitor_.object_payload().length(), 48); // third part includes FIN parser.ProcessData("bar", true); @@ -912,10 +912,10 @@ TEST_F(MoqtMessageSpecificTest, InvalidObjectStatus) { MoqtDataParser parser(&visitor_); char stream_header_subgroup[] = { - 0x04, // type field - 0x03, 0x04, 0x05, 0x08, // varints - 0x07, // publisher priority - 0x06, 0x00, 0x0f, // object middler; status = 0x0f + 0x04, // type field + 0x04, 0x05, 0x08, // varints + 0x07, // publisher priority + 0x06, 0x00, 0x0f, // object middler; status = 0x0f }; parser.ProcessData( absl::string_view(stream_header_subgroup, sizeof(stream_header_subgroup)),
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc index 63dbbfb..3236bae 100644 --- a/quiche/quic/moqt/moqt_session.cc +++ b/quiche/quic/moqt/moqt_session.cc
@@ -193,10 +193,10 @@ absl::string_view payload = ParseDatagram(datagram, message); QUICHE_DLOG(INFO) << ENDPOINT << "Received OBJECT message in datagram for subscribe_id " - << message.subscribe_id << " for track alias " - << message.track_alias << " with sequence " - << message.group_id << ":" << message.object_id - << " priority " << message.publisher_priority << " length " + << " for track alias " << message.track_alias + << " with sequence " << message.group_id << ":" + << message.object_id << " priority " + << message.publisher_priority << " length " << payload.size(); auto [full_track_name, visitor] = TrackPropertiesFromAlias(message); if (visitor != nullptr) { @@ -495,28 +495,34 @@ std::pair<FullTrackName, RemoteTrack::Visitor*> MoqtSession::TrackPropertiesFromAlias(const MoqtObject& message) { auto it = remote_tracks_.find(message.track_alias); - RemoteTrack::Visitor* visitor = nullptr; if (it == remote_tracks_.end()) { - // SUBSCRIBE_OK has not arrived yet, but deliver it. - auto subscribe_it = active_subscribes_.find(message.subscribe_id); - if (subscribe_it == active_subscribes_.end()) { + ActiveSubscribe* subscribe = nullptr; + // SUBSCRIBE_OK has not arrived yet, but deliver the object. Indexing + // active_subscribes_ by track alias would make this faster if the + // subscriber has tons of incomplete subscribes. + for (auto& open_subscribe : active_subscribes_) { + if (open_subscribe.second.message.track_alias == message.track_alias) { + subscribe = &open_subscribe.second; + break; + } + } + if (subscribe == nullptr) { return std::pair<FullTrackName, RemoteTrack::Visitor*>( {FullTrackName{}, nullptr}); } - ActiveSubscribe& subscribe = subscribe_it->second; - visitor = subscribe.visitor; - subscribe.received_object = true; - if (subscribe.forwarding_preference.has_value()) { - if (message.forwarding_preference != *subscribe.forwarding_preference) { + subscribe->received_object = true; + if (subscribe->forwarding_preference.has_value()) { + if (message.forwarding_preference != *subscribe->forwarding_preference) { Error(MoqtError::kProtocolViolation, "Forwarding preference changes mid-track"); return std::pair<FullTrackName, RemoteTrack::Visitor*>( {FullTrackName{}, nullptr}); } } else { - subscribe.forwarding_preference = message.forwarding_preference; + subscribe->forwarding_preference = message.forwarding_preference; } - return std::make_pair(subscribe.message.full_track_name, subscribe.visitor); + return std::make_pair(subscribe->message.full_track_name, + subscribe->visitor); } RemoteTrack& track = it->second; if (!track.CheckForwardingPreference(message.forwarding_preference)) { @@ -902,8 +908,7 @@ absl::string_view payload, bool end_of_message) { QUICHE_DVLOG(1) << ENDPOINT << "Received OBJECT message on stream " - << stream_->GetStreamId() << " for subscribe_id " - << message.subscribe_id << " for track alias " + << stream_->GetStreamId() << " for track alias " << message.track_alias << " with sequence " << message.group_id << ":" << message.object_id << " priority " << message.publisher_priority @@ -1269,7 +1274,6 @@ UpdateSendOrder(subscription); MoqtObject header; - header.subscribe_id = subscription_id_; header.track_alias = subscription.track_alias(); header.group_id = object.sequence.group; header.object_id = object.sequence.object; @@ -1350,7 +1354,6 @@ } MoqtObject header; - header.subscribe_id = subscription_id_; header.track_alias = track_alias(); header.group_id = object->sequence.group; header.object_id = object->sequence.object;
diff --git a/quiche/quic/moqt/moqt_session.h b/quiche/quic/moqt/moqt_session.h index 2fad2ac..e24268b 100644 --- a/quiche/quic/moqt/moqt_session.h +++ b/quiche/quic/moqt/moqt_session.h
@@ -488,8 +488,6 @@ std::string error_; // All the tracks the session is subscribed to, indexed by track_alias. - // Multiple subscribes to the same track are recorded in a single - // subscription. absl::flat_hash_map<uint64_t, RemoteTrack> remote_tracks_; // Look up aliases for remote tracks by name absl::flat_hash_map<FullTrackName, uint64_t> remote_track_aliases_;
diff --git a/quiche/quic/moqt/moqt_session_test.cc b/quiche/quic/moqt/moqt_session_test.cc index e4af115..643364c 100644 --- a/quiche/quic/moqt/moqt_session_test.cc +++ b/quiche/quic/moqt/moqt_session_test.cc
@@ -840,7 +840,6 @@ std::string payload = "deadbeef"; MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -866,7 +865,6 @@ std::string payload = "deadbeef"; MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -897,7 +895,6 @@ std::string payload = "deadbeef"; MoqtSessionPeer::CreateRemoteTrack(&session, ftn, &visitor_, 2); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -935,7 +932,6 @@ }; MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor_); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -993,7 +989,6 @@ }; MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -1054,7 +1049,6 @@ }; MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -1106,7 +1100,6 @@ }; MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -1184,7 +1177,7 @@ // Verify first six message fields are sent correctly bool correct_message = false; - const std::string kExpectedMessage = {0x04, 0x00, 0x02, 0x05, 0x00, 0x00}; + const std::string kExpectedMessage = {0x04, 0x02, 0x05, 0x00, 0x00}; EXPECT_CALL(mock_stream, Writev(_, _)) .WillOnce([&](absl::Span<const absl::string_view> data, const quiche::StreamWriteOptions& options) { @@ -1409,7 +1402,7 @@ // Publish in window. bool correct_message = false; uint8_t kExpectedMessage[] = { - 0x01, 0x00, 0x02, 0x05, 0x00, 0x00, 0x08, 0x64, + 0x01, 0x02, 0x05, 0x00, 0x00, 0x08, 0x64, 0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66, }; EXPECT_CALL(mock_session_, SendOrQueueDatagram(_)) @@ -1436,7 +1429,6 @@ std::string payload = "deadbeef"; MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -1446,7 +1438,7 @@ /*subgroup_id=*/std::nullopt, /*payload_length=*/8, }; - char datagram[] = {0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x64, + char datagram[] = {0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x64, 0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66}; EXPECT_CALL( visitor_, @@ -1463,7 +1455,6 @@ std::string payload = "deadbeef"; MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2); MoqtObject object = { - /*subscribe_id=*/1, /*track_alias=*/2, /*group_sequence=*/0, /*object_sequence=*/0, @@ -1617,22 +1608,22 @@ EXPECT_CALL(mock_stream0, Writev(_, _)) .WillOnce([&](absl::Span<const absl::string_view> data, const quiche::StreamWriteOptions& options) { - // The Group ID is the 4th byte of the stream. - EXPECT_EQ(static_cast<const uint8_t>(data[0][4]), 0); + // The Group ID is the 3rd byte of the stream. + EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 0); return absl::OkStatus(); }); EXPECT_CALL(mock_stream1, Writev(_, _)) .WillOnce([&](absl::Span<const absl::string_view> data, const quiche::StreamWriteOptions& options) { - // The Group ID is the 4th byte of the stream. - EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 1); + // The Group ID is the 3rd byte of the stream. + EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 1); return absl::OkStatus(); }); EXPECT_CALL(mock_stream2, Writev(_, _)) .WillOnce([&](absl::Span<const absl::string_view> data, const quiche::StreamWriteOptions& options) { - // The Group ID is the 4th byte of the stream. - EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 2); + // The Group ID is the 3rd byte of the stream. + EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 2); return absl::OkStatus(); }); session_.OnCanCreateNewOutgoingUnidirectionalStream(); @@ -1661,26 +1652,32 @@ } TEST_F(MoqtSessionTest, QueuedStreamPriorityChanged) { - FullTrackName ftn("foo", "bar"); - auto track = SetupPublisher(ftn, MoqtForwardingPreference::kSubgroup, - FullSequence(0, 0)); - EXPECT_CALL(*track, GetTrackStatus()) + FullTrackName ftn1("foo", "bar"); + auto track1 = SetupPublisher(ftn1, MoqtForwardingPreference::kSubgroup, + FullSequence(0, 0)); + FullTrackName ftn2("dead", "beef"); + auto track2 = SetupPublisher(ftn2, MoqtForwardingPreference::kSubgroup, + FullSequence(0, 0)); + EXPECT_CALL(*track1, GetTrackStatus()) .WillRepeatedly(Return(MoqtTrackStatusCode::kNotYetBegun)); - // Create two identical subscriptions with different priorities. + EXPECT_CALL(*track2, GetTrackStatus()) + .WillRepeatedly(Return(MoqtTrackStatusCode::kNotYetBegun)); MoqtObjectListener* subscription0 = - MoqtSessionPeer::AddSubscription(&session_, track, 0, 14, 0, 0); + MoqtSessionPeer::AddSubscription(&session_, track1, 0, 14, 0, 0); MoqtObjectListener* subscription1 = - MoqtSessionPeer::AddSubscription(&session_, track, 1, 14, 0, 0); + MoqtSessionPeer::AddSubscription(&session_, track2, 1, 15, 0, 0); MoqtSessionPeer::UpdateSubscriberPriority(&session_, 0, 1); MoqtSessionPeer::UpdateSubscriberPriority(&session_, 1, 2); - // Two arriving objects will queue four streams. + // Two published objects will queue four streams. EXPECT_CALL(mock_session_, CanOpenNextOutgoingUnidirectionalStream()) .WillOnce(Return(false)) .WillOnce(Return(false)) .WillOnce(Return(false)) .WillOnce(Return(false)); - EXPECT_CALL(*track, GetTrackStatus()) + EXPECT_CALL(*track1, GetTrackStatus()) + .WillRepeatedly(Return(MoqtTrackStatusCode::kInProgress)); + EXPECT_CALL(*track2, GetTrackStatus()) .WillRepeatedly(Return(MoqtTrackStatusCode::kInProgress)); subscription0->OnNewObjectAvailable(FullSequence(0, 0)); subscription1->OnNewObjectAvailable(FullSequence(0, 0)); @@ -1703,20 +1700,20 @@ EXPECT_CALL(mock_stream0, visitor()).WillOnce([&]() { return stream_visitor0.get(); }); - EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 0))) + EXPECT_CALL(*track1, GetCachedObject(FullSequence(0, 0))) .WillOnce( Return(PublishedObject{FullSequence(0, 0), MoqtObjectStatus::kNormal, - 127, MemSliceFromString("deadbeef")})); - EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 1))) + 127, MemSliceFromString("foobar")})); + EXPECT_CALL(*track1, GetCachedObject(FullSequence(0, 1))) .WillOnce(Return(std::nullopt)); EXPECT_CALL(mock_stream0, CanWrite()).WillRepeatedly(Return(true)); EXPECT_CALL(mock_stream0, Writev(_, _)) .WillOnce([&](absl::Span<const absl::string_view> data, const quiche::StreamWriteOptions& options) { - // Check subscribe ID is 0. - EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 0); + // Check track alias is 14. + EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 14); // Check Group ID is 0 - EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 0); + EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 0); return absl::OkStatus(); }); session_.OnCanCreateNewOutgoingUnidirectionalStream(); @@ -1739,20 +1736,20 @@ EXPECT_CALL(mock_stream1, visitor()).WillOnce([&]() { return stream_visitor1.get(); }); - EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 0))) + EXPECT_CALL(*track2, GetCachedObject(FullSequence(0, 0))) .WillOnce( Return(PublishedObject{FullSequence(0, 0), MoqtObjectStatus::kNormal, 127, MemSliceFromString("deadbeef")})); - EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 1))) + EXPECT_CALL(*track2, GetCachedObject(FullSequence(0, 1))) .WillOnce(Return(std::nullopt)); EXPECT_CALL(mock_stream1, CanWrite()).WillRepeatedly(Return(true)); EXPECT_CALL(mock_stream1, Writev(_, _)) .WillOnce([&](absl::Span<const absl::string_view> data, const quiche::StreamWriteOptions& options) { - // Check subscribe ID is 0. - EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 1); + // Check track alias is 15. + EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 15); // Check Group ID is 0 - EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 0); + EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 0); return absl::OkStatus(); }); session_.OnCanCreateNewOutgoingUnidirectionalStream();
diff --git a/quiche/quic/moqt/test_tools/moqt_test_message.h b/quiche/quic/moqt/test_tools/moqt_test_message.h index d0318bd..1138024 100644 --- a/quiche/quic/moqt/test_tools/moqt_test_message.h +++ b/quiche/quic/moqt/test_tools/moqt_test_message.h
@@ -164,10 +164,6 @@ public: bool EqualFieldValues(MessageStructuredData& values) const override { auto cast = std::get<MoqtObject>(values); - if (cast.subscribe_id != object_.subscribe_id) { - QUIC_LOG(INFO) << "OBJECT Track ID mismatch"; - return false; - } if (cast.track_alias != object_.track_alias) { QUIC_LOG(INFO) << "OBJECT Track ID mismatch"; return false; @@ -209,7 +205,6 @@ protected: MoqtObject object_ = { - /*subscribe_id=*/3, /*track_alias=*/4, /*group_id*/ 5, /*object_id=*/6, @@ -228,13 +223,13 @@ object_.forwarding_preference = MoqtForwardingPreference::kDatagram; } - void ExpandVarints() override { ExpandVarintsImpl("vvvvv-v---", false); } + void ExpandVarints() override { ExpandVarintsImpl("vvvv-v---", false); } private: - uint8_t raw_packet_[10] = { - 0x01, 0x03, 0x04, 0x05, 0x06, // varints - 0x07, // publisher priority - 0x03, 0x66, 0x6f, 0x6f, // payload = "foo" + uint8_t raw_packet_[9] = { + 0x01, 0x04, 0x05, 0x06, // varints + 0x07, // publisher priority + 0x03, 0x66, 0x6f, 0x6f, // payload = "foo" }; }; @@ -248,16 +243,16 @@ object_.payload_length = 3; } - void ExpandVarints() override { ExpandVarintsImpl("vvv-vvv", false); } + void ExpandVarints() override { ExpandVarintsImpl("vv-vvv", false); } private: // Some tests check that a FIN sent at the halfway point of a message results // in an error. Without the unnecessary expanded varint 0x0405, the halfway // point falls at the end of the Stream Header, which is legal. Expand the // varint so that the FIN would be illegal. - uint8_t raw_packet_[10] = { + uint8_t raw_packet_[9] = { 0x02, // type field - 0x03, 0x04, // varints + 0x04, // varints 0x07, // publisher priority 0x05, 0x06, // object middler 0x03, 0x66, 0x6f, 0x6f, // payload = "foo" @@ -291,7 +286,7 @@ object_.subgroup_id = 8; } - void ExpandVarints() override { ExpandVarintsImpl("vvvvv-vv", false); } + void ExpandVarints() override { ExpandVarintsImpl("vvvv-vv", false); } bool SetPayloadLength(uint8_t payload_length) { if (payload_length > 63) { @@ -299,15 +294,15 @@ return false; } object_.payload_length = payload_length; - raw_packet_[7] = payload_length; + raw_packet_[6] = payload_length; SetWireImage(raw_packet_, sizeof(raw_packet_)); return true; } private: - uint8_t raw_packet_[11] = { + uint8_t raw_packet_[10] = { 0x04, // type field - 0x03, 0x04, 0x05, 0x08, // varints + 0x04, 0x05, 0x08, // varints 0x07, // publisher priority 0x06, 0x03, 0x66, 0x6f, 0x6f, // object middler; payload = "foo" };