AVRCP: Reject SetAddressedPlayer command only if remote set invalid player ID
Implement HandleSetAddressedPlayer() to check if remote set valid
player ID and properly respond to remote.
Bug: 110632860
Test: PTS Test AVRCP/TG/MPS/BI-01-C AVRCP/TG/MPS/BV-02-C
Change-Id: Ice13e7ea97cdac369c4d021171a24bf9d96c9da8
Merged-In: Ice13e7ea97cdac369c4d021171a24bf9d96c9da8
diff --git a/packet/tests/avrcp/avrcp_test_packets.h b/packet/tests/avrcp/avrcp_test_packets.h
index e7e820b..304c43a 100644
--- a/packet/tests/avrcp/avrcp_test_packets.h
+++ b/packet/tests/avrcp/avrcp_test_packets.h
@@ -297,8 +297,12 @@
0x72, 0x74, 0x69, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6a, 0x00,
0x0a, 0x54, 0x65, 0x73, 0x74, 0x20, 0x41, 0x6c, 0x62, 0x75, 0x6d};
-// AVRCP Set Addressed Player Request with player_id = 1
+// AVRCP Set Addressed Player Request with player_id = 0
std::vector<uint8_t> set_addressed_player_request = {
+ 0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x60, 0x00, 0x00, 0x02, 0x00, 0x00};
+
+// AVRCP Set Addressed Player Request with player_id = 1
+std::vector<uint8_t> set_addressed_player_id_1_request = {
0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x60, 0x00, 0x00, 0x02, 0x00, 0x01};
// AVRCP Set Addressed Player Response with status success
diff --git a/packet/tests/avrcp/set_addressed_player_packet_test.cc b/packet/tests/avrcp/set_addressed_player_packet_test.cc
index 24d674a..a6ced9e 100644
--- a/packet/tests/avrcp/set_addressed_player_packet_test.cc
+++ b/packet/tests/avrcp/set_addressed_player_packet_test.cc
@@ -39,7 +39,7 @@
auto test_packet =
TestSetAddrPlayerPacket::Make(set_addressed_player_request);
- ASSERT_EQ(test_packet->GetPlayerId(), 0x0001u);
+ ASSERT_EQ(test_packet->GetPlayerId(), 0x0000u);
}
TEST(SetAddressedPlayerRequestTest, validTest) {
@@ -60,4 +60,4 @@
}
} // namespace avrcp
-} // namespace bluetooth
\ No newline at end of file
+} // namespace bluetooth
diff --git a/profile/avrcp/device.cc b/profile/avrcp/device.cc
index d2a985f..2dbe993 100644
--- a/profile/avrcp/device.cc
+++ b/profile/avrcp/device.cc
@@ -126,9 +126,9 @@
// this currently since the current implementation only has one
// player and the player will never change, but we need it for a
// more complete implementation.
- auto response = RejectBuilder::MakeBuilder(
- CommandPdu::SET_ADDRESSED_PLAYER, Status::INVALID_PLAYER_ID);
- send_message(label, false, std::move(response));
+ media_interface_->GetMediaPlayerList(base::Bind(
+ &Device::HandleSetAddressedPlayer, weak_ptr_factory_.GetWeakPtr(),
+ label, Packet::Specialize<SetAddressedPlayerRequest>(pkt)));
} break;
default: {
@@ -618,6 +618,24 @@
send_message(label, false, std::move(response));
}
+void Device::HandleSetAddressedPlayer(
+ uint8_t label, std::shared_ptr<SetAddressedPlayerRequest> pkt,
+ uint16_t curr_player, std::vector<MediaPlayerInfo> players) {
+ DEVICE_VLOG(2) << __func__ << ": PlayerId=" << pkt->GetPlayerId();
+
+ if (curr_player != pkt->GetPlayerId()) {
+ DEVICE_VLOG(2) << "Reject invalid addressed player ID";
+ auto response = RejectBuilder::MakeBuilder(CommandPdu::SET_ADDRESSED_PLAYER,
+ Status::INVALID_PLAYER_ID);
+ send_message(label, false, std::move(response));
+ return;
+ }
+
+ auto response =
+ SetAddressedPlayerResponseBuilder::MakeBuilder(Status::NO_ERROR);
+ send_message(label, false, std::move(response));
+}
+
void Device::BrowseMessageReceived(uint8_t label,
std::shared_ptr<BrowsePacket> pkt) {
DEVICE_VLOG(1) << __func__ << ": pdu=" << pkt->GetPdu();
diff --git a/profile/avrcp/device.h b/profile/avrcp/device.h
index 27f7674..5ef886d 100644
--- a/profile/avrcp/device.h
+++ b/profile/avrcp/device.h
@@ -210,6 +210,11 @@
virtual void HandlePlayItem(uint8_t label,
std::shared_ptr<PlayItemRequest> request);
+ // SET ADDRESSED PLAYER
+ virtual void HandleSetAddressedPlayer(
+ uint8_t label, std::shared_ptr<SetAddressedPlayerRequest> request,
+ uint16_t curr_player, std::vector<MediaPlayerInfo> players);
+
/********************
* MESSAGE REQUESTS
********************/
diff --git a/profile/avrcp/tests/avrcp_device_test.cc b/profile/avrcp/tests/avrcp_device_test.cc
index d50644c..12c36c2 100644
--- a/profile/avrcp/tests/avrcp_device_test.cc
+++ b/profile/avrcp/tests/avrcp_device_test.cc
@@ -713,10 +713,27 @@
test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
- auto set_addr_player_rsp = RejectBuilder::MakeBuilder(
+ MediaPlayerInfo info = {0, "Test Player", true};
+ std::vector<MediaPlayerInfo> list = {info};
+
+ EXPECT_CALL(interface, GetMediaPlayerList(_))
+ .WillRepeatedly(InvokeCb<0>(0, list));
+
+ auto set_addr_player_rej_rsp = RejectBuilder::MakeBuilder(
CommandPdu::SET_ADDRESSED_PLAYER, Status::INVALID_PLAYER_ID);
EXPECT_CALL(response_cb,
+ Call(1, false, matchPacket(std::move(set_addr_player_rej_rsp))))
+ .Times(1);
+
+ auto player_id_1_request =
+ TestAvrcpPacket::Make(set_addressed_player_id_1_request);
+ SendMessage(1, player_id_1_request);
+
+ auto set_addr_player_rsp =
+ SetAddressedPlayerResponseBuilder::MakeBuilder(Status::NO_ERROR);
+
+ EXPECT_CALL(response_cb,
Call(1, false, matchPacket(std::move(set_addr_player_rsp))))
.Times(1);