Upgrade bluez5_37 :Merge the code from private
[platform/upstream/bluez.git] / src / shared / btsnoop.c
index d8be5ea..9dc1251 100644 (file)
@@ -71,10 +71,11 @@ struct btsnoop {
        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;
@@ -109,19 +110,21 @@ struct btsnoop *btsnoop_open(const char *path, unsigned long flags)
                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);
@@ -137,10 +140,10 @@ failed:
 }
 
 #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;
@@ -158,12 +161,12 @@ struct btsnoop *btsnoop_create(const char *path, uint32_t type)
                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) {
@@ -202,7 +205,7 @@ static int btsnoop_create_2(struct btsnoop *btsnoop)
 
        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) {
@@ -294,12 +297,12 @@ void btsnoop_unref(struct btsnoop *btsnoop)
        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,
@@ -360,6 +363,9 @@ static uint32_t get_flags_from_opcode(uint16_t opcode)
        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;
@@ -374,8 +380,8 @@ bool btsnoop_write_hci(struct btsnoop *btsnoop, struct timeval *tv,
        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;
 
@@ -387,7 +393,7 @@ bool btsnoop_write_hci(struct btsnoop *btsnoop, struct timeval *tv,
                        return false;
                break;
 
-       case BTSNOOP_TYPE_MONITOR:
+       case BTSNOOP_FORMAT_MONITOR:
                flags = (index << 16) | opcode;
                break;
 
@@ -406,8 +412,8 @@ bool btsnoop_write_phy(struct btsnoop *btsnoop, struct timeval *tv,
        if (!btsnoop)
                return false;
 
-       switch (btsnoop->type) {
-       case BTSNOOP_TYPE_SIMULATOR:
+       switch (btsnoop->format) {
+       case BTSNOOP_FORMAT_SIMULATOR:
                flags = (1 << 16) | frequency;
                break;
 
@@ -418,22 +424,6 @@ bool btsnoop_write_phy(struct btsnoop *btsnoop, struct timeval *tv,
        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)
@@ -452,14 +442,50 @@ 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);
+               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) {
@@ -544,13 +570,13 @@ bool btsnoop_read_hci(struct btsnoop *btsnoop, struct timeval *tv,
        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;
@@ -562,7 +588,7 @@ bool btsnoop_read_hci(struct btsnoop *btsnoop, struct timeval *tv,
                *opcode = get_opcode_from_flags(pkt_type, flags);
                break;
 
-       case BTSNOOP_TYPE_MONITOR:
+       case BTSNOOP_FORMAT_MONITOR:
                *index = flags >> 16;
                *opcode = flags & 0xffff;
                break;