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);
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];
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;
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);
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;
}
}
return -1;
}
+ if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &opt, sizeof(opt)) < 0) {
+ perror("Failed to enable credentials");
+ close(fd);
+ return -1;
+ }
+
return fd;
}
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;
#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;
{
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;
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;