Diff between 0cef5a7996db8df569d04f2165f58e5aeed8441f and 0b83aa1cda133b8f24d4b4e0978dcbb556153b97

Changed Files

File Additions Deletions Status
src/shared/btsnoop.c +11 -3 modified

Full Patch

diff --git a/src/shared/btsnoop.c b/src/shared/btsnoop.c
index 2aa1b8d..2427f18 100644
--- a/src/shared/btsnoop.c
+++ b/src/shared/btsnoop.c
@@ -72,6 +72,7 @@ struct btsnoop {
 	uint16_t index;
 	bool aborted;
 	bool pklg_format;
+	bool pklg_v2;
 };
 
 struct btsnoop *btsnoop_open(const char *path, unsigned long flags)
@@ -108,12 +109,14 @@ struct btsnoop *btsnoop_open(const char *path, unsigned long flags)
 			goto failed;
 
 		/* Check for Apple Packet Logger format */
-		if (hdr.id[0] != 0x00 || hdr.id[1] != 0x00)
+		if (hdr.id[0] != 0x00 ||
+				(hdr.id[1] != 0x00 && hdr.id[1] != 0x01))
 			goto failed;
 
 		btsnoop->type = BTSNOOP_TYPE_MONITOR;
 		btsnoop->index = 0xffff;
 		btsnoop->pklg_format = true;
+		btsnoop->pklg_v2 = (hdr.id[1] == 0x01);
 
 		/* Apple Packet Logger format has no header */
 		lseek(btsnoop->fd, 0, SEEK_SET);
@@ -337,9 +340,14 @@ static bool pklg_read_hci(struct btsnoop *btsnoop, struct timeval *tv,
 		return false;
 	}
 
-	toread = be32toh(pkt.len) - 9;
+	if (btsnoop->pklg_v2) {
+		toread = le32toh(pkt.len) - (PKLG_PKT_SIZE - 4);
+		ts = le64toh(pkt.ts);
+	} else {
+		toread = be32toh(pkt.len) - (PKLG_PKT_SIZE - 4);
+		ts = be64toh(pkt.ts);
+	}
 
-	ts = be64toh(pkt.ts);
 	tv->tv_sec = ts >> 32;
 	tv->tv_usec = ts & 0xffffffff;