Upgrade bluez5_37 :Merge the code from private
[platform/upstream/bluez.git] / monitor / control.c
index e88a6e3..0d58ecd 100644 (file)
@@ -261,16 +261,34 @@ static void mgmt_local_name_changed(uint16_t len, const void *buf)
 static void mgmt_new_link_key(uint16_t len, const void *buf)
 {
        const struct mgmt_ev_new_link_key *ev = buf;
+       const char *type;
        char str[18];
+       static const char *types[] = {
+               "Combination key",
+               "Local Unit key",
+               "Remote Unit key",
+               "Debug Combination key",
+               "Unauthenticated Combination key from P-192",
+               "Authenticated Combination key from P-192",
+               "Changed Combination key",
+               "Unauthenticated Combination key from P-256",
+               "Authenticated Combination key from P-256",
+       };
 
        if (len < sizeof(*ev)) {
                printf("* Malformed New Link Key control\n");
                return;
        }
 
+       if (ev->key.type < NELEM(types))
+               type = types[ev->key.type];
+       else
+               type = "Reserved";
+
        ba2str(&ev->key.addr.bdaddr, str);
 
-       printf("@ New Link Key: %s (%d)\n", str, ev->key.addr.type);
+       printf("@ New Link Key: %s (%d) %s (%u)\n", str,
+                               ev->key.addr.type, type, ev->key.type);
 
        buf += sizeof(*ev);
        len -= sizeof(*ev);
@@ -884,7 +902,7 @@ void control_message(uint16_t opcode, const void *data, uint16_t size)
 static void data_callback(int fd, uint32_t events, void *user_data)
 {
        struct control_data *data = user_data;
-       unsigned char control[32];
+       unsigned char control[64];
        struct mgmt_hdr hdr;
        struct msghdr msg;
        struct iovec iov[2];
@@ -909,6 +927,8 @@ static void data_callback(int fd, uint32_t events, void *user_data)
                struct cmsghdr *cmsg;
                struct timeval *tv = NULL;
                struct timeval ctv;
+               struct ucred *cred = NULL;
+               struct ucred ccred;
                uint16_t opcode, index, pktlen;
                ssize_t len;
 
@@ -928,6 +948,11 @@ static void data_callback(int fd, uint32_t events, void *user_data)
                                memcpy(&ctv, CMSG_DATA(cmsg), sizeof(ctv));
                                tv = &ctv;
                        }
+
+                       if (cmsg->cmsg_type == SCM_CREDENTIALS) {
+                               memcpy(&ccred, CMSG_DATA(cmsg), sizeof(ccred));
+                               cred = &ccred;
+                       }
                }
 
                opcode = le16_to_cpu(hdr.opcode);
@@ -936,14 +961,16 @@ static void data_callback(int fd, uint32_t events, void *user_data)
 
                switch (data->channel) {
                case HCI_CHANNEL_CONTROL:
-                       packet_control(tv, index, opcode, data->buf, pktlen);
+                       packet_control(tv, cred, index, opcode,
+                                                       data->buf, pktlen);
                        break;
                case HCI_CHANNEL_MONITOR:
                        btsnoop_write_hci(btsnoop_file, tv, index, opcode,
                                                        data->buf, pktlen);
                        ellisys_inject_hci(tv, index, opcode,
                                                        data->buf, pktlen);
-                       packet_monitor(tv, index, opcode, data->buf, pktlen);
+                       packet_monitor(tv, cred, index, opcode,
+                                                       data->buf, pktlen);
                        break;
                }
        }
@@ -983,6 +1010,12 @@ static int open_socket(uint16_t channel)
                return -1;
        }
 
+       if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &opt, sizeof(opt)) < 0) {
+               perror("Failed to enable credentials");
+               close(fd);
+               return -1;
+       }
+
        return fd;
 }
 
@@ -1033,7 +1066,7 @@ static void client_callback(int fd, uint32_t events, void *user_data)
                        uint16_t opcode = le16_to_cpu(hdr->opcode);
                        uint16_t index = le16_to_cpu(hdr->index);
 
-                       packet_monitor(NULL, index, opcode,
+                       packet_monitor(NULL, NULL, index, opcode,
                                        data->buf + MGMT_HDR_SIZE, pktlen);
 
                        data->offset -= pktlen + MGMT_HDR_SIZE;
@@ -1131,10 +1164,10 @@ bool control_writer(const char *path)
 #endif
 {
 #ifdef __TIZEN_PATCH__
-       btsnoop_file = btsnoop_create(path, BTSNOOP_TYPE_MONITOR,
+       btsnoop_file = btsnoop_create(path, BTSNOOP_FORMAT_MONITOR,
                        rotate_count, file_size);
 #else
-       btsnoop_file = btsnoop_create(path, BTSNOOP_TYPE_MONITOR);
+       btsnoop_file = btsnoop_create(path, BTSNOOP_FORMAT_MONITOR);
 #endif
 
        return !!btsnoop_file;
@@ -1144,33 +1177,36 @@ void control_reader(const char *path)
 {
        unsigned char buf[BTSNOOP_MAX_PACKET_SIZE];
        uint16_t pktlen;
-       uint32_t type;
+       uint32_t format;
        struct timeval tv;
 
        btsnoop_file = btsnoop_open(path, BTSNOOP_FLAG_PKLG_SUPPORT);
        if (!btsnoop_file)
                return;
 
-       type = btsnoop_get_type(btsnoop_file);
+       format = btsnoop_get_format(btsnoop_file);
 
-       switch (type) {
-       case BTSNOOP_TYPE_HCI:
-       case BTSNOOP_TYPE_UART:
-       case BTSNOOP_TYPE_SIMULATOR:
+       switch (format) {
+       case BTSNOOP_FORMAT_HCI:
+       case BTSNOOP_FORMAT_UART:
+       case BTSNOOP_FORMAT_SIMULATOR:
                packet_del_filter(PACKET_FILTER_SHOW_INDEX);
                break;
 
-       case BTSNOOP_TYPE_MONITOR:
+       case BTSNOOP_FORMAT_MONITOR:
                packet_add_filter(PACKET_FILTER_SHOW_INDEX);
                break;
        }
 
+#ifdef __TIZEN_PATCH__
+       setenv("PAGER", "cat", 0);
+#endif
        open_pager();
 
-       switch (type) {
-       case BTSNOOP_TYPE_HCI:
-       case BTSNOOP_TYPE_UART:
-       case BTSNOOP_TYPE_MONITOR:
+       switch (format) {
+       case BTSNOOP_FORMAT_HCI:
+       case BTSNOOP_FORMAT_UART:
+       case BTSNOOP_FORMAT_MONITOR:
                while (1) {
                        uint16_t index, opcode;
 
@@ -1181,12 +1217,12 @@ void control_reader(const char *path)
                        if (opcode == 0xffff)
                                continue;
 
-                       packet_monitor(&tv, index, opcode, buf, pktlen);
+                       packet_monitor(&tv, NULL, index, opcode, buf, pktlen);
                        ellisys_inject_hci(&tv, index, opcode, buf, pktlen);
                }
                break;
 
-       case BTSNOOP_TYPE_SIMULATOR:
+       case BTSNOOP_FORMAT_SIMULATOR:
                while (1) {
                        uint16_t frequency;