int ref_count;
int fd;
unsigned long flags;
- uint32_t type;
+ uint32_t format;
uint16_t index;
bool aborted;
bool pklg_format;
+ bool pklg_v2;
#ifdef __TIZEN_PATCH__
char *path;
int16_t rotate_count;
if (be32toh(hdr.version) != btsnoop_version)
goto failed;
- btsnoop->type = be32toh(hdr.type);
+ btsnoop->format = be32toh(hdr.type);
btsnoop->index = 0xffff;
} else {
if (!(btsnoop->flags & BTSNOOP_FLAG_PKLG_SUPPORT))
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->format = BTSNOOP_FORMAT_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);
}
#ifdef __TIZEN_PATCH__
-struct btsnoop *btsnoop_create(const char *path, uint32_t type,
+struct btsnoop *btsnoop_create(const char *path, uint32_t format,
int16_t rotate_count, ssize_t file_size)
#else
-struct btsnoop *btsnoop_create(const char *path, uint32_t type)
+struct btsnoop *btsnoop_create(const char *path, uint32_t format)
#endif
{
struct btsnoop *btsnoop;
return NULL;
}
- btsnoop->type = type;
+ btsnoop->format = format;
btsnoop->index = 0xffff;
memcpy(hdr.id, btsnoop_id, sizeof(btsnoop_id));
hdr.version = htobe32(btsnoop_version);
- hdr.type = htobe32(btsnoop->type);
+ hdr.type = htobe32(btsnoop->format);
written = write(btsnoop->fd, &hdr, BTSNOOP_HDR_SIZE);
if (written < 0) {
memcpy(hdr.id, btsnoop_id, sizeof(btsnoop_id));
hdr.version = htobe32(btsnoop_version);
- hdr.type = htobe32(btsnoop->type);
+ hdr.type = htobe32(btsnoop->format);
written = write(btsnoop->fd, &hdr, BTSNOOP_HDR_SIZE);
if (written < 0) {
free(btsnoop);
}
-uint32_t btsnoop_get_type(struct btsnoop *btsnoop)
+uint32_t btsnoop_get_format(struct btsnoop *btsnoop)
{
if (!btsnoop)
- return BTSNOOP_TYPE_INVALID;
+ return BTSNOOP_FORMAT_INVALID;
- return btsnoop->type;
+ return btsnoop->format;
}
bool btsnoop_write(struct btsnoop *btsnoop, struct timeval *tv,
case BTSNOOP_OPCODE_SCO_TX_PKT:
case BTSNOOP_OPCODE_SCO_RX_PKT:
break;
+ case BTSNOOP_OPCODE_OPEN_INDEX:
+ case BTSNOOP_OPCODE_CLOSE_INDEX:
+ break;
}
return 0xff;
if (!btsnoop)
return false;
- switch (btsnoop->type) {
- case BTSNOOP_TYPE_HCI:
+ switch (btsnoop->format) {
+ case BTSNOOP_FORMAT_HCI:
if (btsnoop->index == 0xffff)
btsnoop->index = index;
return false;
break;
- case BTSNOOP_TYPE_MONITOR:
+ case BTSNOOP_FORMAT_MONITOR:
flags = (index << 16) | opcode;
break;
if (!btsnoop)
return false;
- switch (btsnoop->type) {
- case BTSNOOP_TYPE_SIMULATOR:
+ switch (btsnoop->format) {
+ case BTSNOOP_FORMAT_SIMULATOR:
flags = (1 << 16) | frequency;
break;
return btsnoop_write(btsnoop, tv, flags, data, size);
}
-static uint16_t get_opcode_from_pklg(uint8_t type)
-{
- switch (type) {
- case 0x00:
- return BTSNOOP_OPCODE_COMMAND_PKT;
- case 0x01:
- return BTSNOOP_OPCODE_EVENT_PKT;
- case 0x02:
- return BTSNOOP_OPCODE_ACL_TX_PKT;
- case 0x03:
- return BTSNOOP_OPCODE_ACL_RX_PKT;
- }
-
- return 0xffff;
-}
-
static bool pklg_read_hci(struct btsnoop *btsnoop, struct timeval *tv,
uint16_t *index, uint16_t *opcode,
void *data, uint16_t *size)
return false;
}
- toread = be32toh(pkt.len) - 9;
+ if (btsnoop->pklg_v2) {
+ toread = le32toh(pkt.len) - (PKLG_PKT_SIZE - 4);
+
+ ts = le64toh(pkt.ts);
+ tv->tv_sec = ts & 0xffffffff;
+ tv->tv_usec = ts >> 32;
+ } else {
+ toread = be32toh(pkt.len) - (PKLG_PKT_SIZE - 4);
- ts = be64toh(pkt.ts);
- tv->tv_sec = ts >> 32;
- tv->tv_usec = ts & 0xffffffff;
+ ts = be64toh(pkt.ts);
+ tv->tv_sec = ts >> 32;
+ tv->tv_usec = ts & 0xffffffff;
+ }
- *index = 0;
- *opcode = get_opcode_from_pklg(pkt.type);
+ switch (pkt.type) {
+ case 0x00:
+ *index = 0x0000;
+ *opcode = BTSNOOP_OPCODE_COMMAND_PKT;
+ break;
+ case 0x01:
+ *index = 0x0000;
+ *opcode = BTSNOOP_OPCODE_EVENT_PKT;
+ break;
+ case 0x02:
+ *index = 0x0000;
+ *opcode = BTSNOOP_OPCODE_ACL_TX_PKT;
+ break;
+ case 0x03:
+ *index = 0x0000;
+ *opcode = BTSNOOP_OPCODE_ACL_RX_PKT;
+ break;
+ case 0x0b:
+ *index = 0x0000;
+ *opcode = BTSNOOP_OPCODE_VENDOR_DIAG;
+ break;
+ case 0xfc:
+ *index = 0xffff;
+ *opcode = BTSNOOP_OPCODE_SYSTEM_NOTE;
+ break;
+ default:
+ *index = 0xffff;
+ *opcode = 0xffff;
+ break;
+ }
len = read(btsnoop->fd, data, toread);
if (len < 0) {
tv->tv_sec = (ts / 1000000ll) + 946684800ll;
tv->tv_usec = ts % 1000000ll;
- switch (btsnoop->type) {
- case BTSNOOP_TYPE_HCI:
+ switch (btsnoop->format) {
+ case BTSNOOP_FORMAT_HCI:
*index = 0;
*opcode = get_opcode_from_flags(0xff, flags);
break;
- case BTSNOOP_TYPE_UART:
+ case BTSNOOP_FORMAT_UART:
len = read(btsnoop->fd, &pkt_type, 1);
if (len < 0) {
btsnoop->aborted = true;
*opcode = get_opcode_from_flags(pkt_type, flags);
break;
- case BTSNOOP_TYPE_MONITOR:
+ case BTSNOOP_FORMAT_MONITOR:
*index = flags >> 16;
*opcode = flags & 0xffff;
break;