Diff between e8e323e1fbd097672ad37580019055ec1ed752b3 and cff8c39fb53a931e406891391fb8e7e3c52678ae

Changed Files

File Additions Deletions Status
audio/avctp.c +3 -1 modified
audio/avrcp.c +15 -0 modified
audio/avrcp.h +2 -0 modified

Full Patch

diff --git a/audio/avctp.c b/audio/avctp.c
index 5bd5db1..dfad9fd 100644
--- a/audio/avctp.c
+++ b/audio/avctp.c
@@ -53,6 +53,7 @@
 #include "manager.h"
 #include "device.h"
 #include "avctp.h"
+#include "avrcp.h"
 
 #define QUIRK_NO_RELEASE 1 << 0
 
@@ -464,7 +465,8 @@ static gboolean session_cb(GIOChannel *chan, GIOCondition cond,
 	handler = find_handler(handlers, avc->opcode);
 	if (!handler) {
 		DBG("handler not found for 0x%02x", avc->opcode);
-		avc->code = AVC_CTYPE_REJECTED;
+		packet_size += avrcp_handle_vendor_reject(&code, operands);
+		avc->code = code;
 		goto done;
 	}
 
diff --git a/audio/avrcp.c b/audio/avrcp.c
index 4573133..8eba046 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
@@ -1092,6 +1092,21 @@ err_metadata:
 	return AVRCP_HEADER_LENGTH + 1;
 }
 
+size_t avrcp_handle_vendor_reject(uint8_t *code, uint8_t *operands)
+{
+    struct avrcp_header *pdu = (void *) operands;
+    uint32_t company_id = get_company_id(pdu->company_id);
+
+    *code = AVC_CTYPE_REJECTED;
+    pdu->params_len = htons(1);
+    pdu->params[0] = E_INTERNAL;
+
+    DBG("rejecting AVRCP PDU 0x%02X, company 0x%06X len 0x%04X",
+            pdu->pdu_id, company_id, pdu->params_len);
+
+    return AVRCP_HEADER_LENGTH + 1;
+}
+
 static struct avrcp_server *find_server(GSList *list, const bdaddr_t *src)
 {
 	for (; list; list = list->next) {
diff --git a/audio/avrcp.h b/audio/avrcp.h
index fb64f3b..8a09546 100644
--- a/audio/avrcp.h
+++ b/audio/avrcp.h
@@ -98,3 +98,5 @@ struct avrcp_player *avrcp_register_player(const bdaddr_t *src,
 void avrcp_unregister_player(struct avrcp_player *player);
 
 int avrcp_player_event(struct avrcp_player *player, uint8_t id, void *data);
+
+size_t avrcp_handle_vendor_reject(uint8_t *code, uint8_t *operands);