#include "xlat/af_packet_types.h"
#include "xlat/bdaddr_types.h"
+#include "xlat/bluetooth_l2_cid.h"
#include "xlat/bluetooth_l2_psm.h"
#include "xlat/hci_channels.h"
tprints(")");
}
+static void
+print_bluetooth_l2_cid(const char *prefix, uint16_t cid)
+{
+ const uint16_t cid_he = btohs(cid);
+ const char *cid_name = xlookup(bluetooth_l2_cid, cid_he);
+ const bool cid_str = cid_name || (cid_he >= L2CAP_CID_DYN_START);
+
+ tprintf("%shtobs(", prefix);
+
+ if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV || !cid_str)
+ tprintf("%#x", cid_he);
+
+ if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
+ goto print_bluetooth_l2_cid_end;
+
+ if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE || !cid_str)
+ tprints(" /* ");
+
+ if (cid_name) {
+ tprints(cid_name);
+ } else if (cid_he >= L2CAP_CID_DYN_START) {
+ print_xlat(L2CAP_CID_DYN_START);
+ tprintf(" + %u", cid_he - L2CAP_CID_DYN_START);
+ } else {
+ tprints("L2CAP_CID_???");
+ }
+
+ if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE || !cid_str)
+ tprints(" */");
+
+print_bluetooth_l2_cid_end:
+ tprints(")");
+}
+
static void
print_sockaddr_data_bt(const void *const buf, const int addrlen)
{
case sizeof(struct sockaddr_l2): {
const struct sockaddr_l2 *const l2 = buf;
print_bluetooth_l2_psm("l2_psm=", l2->l2_psm);
- tprintf(", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
- ", l2_cid=htobs(%hu), l2_bdaddr_type=",
+ tprintf(", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x",
l2->l2_bdaddr.b[0], l2->l2_bdaddr.b[1],
l2->l2_bdaddr.b[2], l2->l2_bdaddr.b[3],
- l2->l2_bdaddr.b[4], l2->l2_bdaddr.b[5],
- btohs(l2->l2_cid));
+ l2->l2_bdaddr.b[4], l2->l2_bdaddr.b[5]);
+ print_bluetooth_l2_cid(", l2_cid=", l2->l2_cid);
+ tprints(", l2_bdaddr_type=");
printxval_index(bdaddr_types, l2->l2_bdaddr_type,
"BDADDR_???");
break;
printf("connect(-1, {sa_family=AF_BLUETOOTH"
", l2_psm=htobs(L2CAP_PSM_DYN_START + %hu)"
", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
- ", l2_cid=htobs(%hu), l2_bdaddr_type=0xce /* BDADDR_??? */}"
+ ", l2_cid=htobs(L2CAP_CID_DYN_START + %hu)"
+ ", l2_bdaddr_type=0xce /* BDADDR_??? */}"
", %u) = %d EBADF (%m)\n", h_psm - 0x1001,
c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
- h_cid, len, ret);
+ h_cid - 0x40, len, ret);
c_l2.l2_psm = htobs(1);
+ c_l2.l2_cid = htobs(1);
c_l2.l2_bdaddr_type = BDADDR_LE_RANDOM;
memcpy(l2, &c_l2, sizeof(c_l2));
ret = connect(-1, l2, len);
printf("connect(-1, {sa_family=AF_BLUETOOTH"
", l2_psm=htobs(L2CAP_PSM_SDP)"
", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
- ", l2_cid=htobs(%hu), l2_bdaddr_type=BDADDR_LE_RANDOM}"
- ", %u) = %d EBADF (%m)\n",
+ ", l2_cid=htobs(L2CAP_CID_SIGNALING)"
+ ", l2_bdaddr_type=BDADDR_LE_RANDOM}, %u) = %d EBADF (%m)\n",
c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
- h_cid, len, ret);
+ len, ret);
c_l2.l2_psm = htobs(0xbad);
+ c_l2.l2_cid = htobs(8);
c_l2.l2_bdaddr_type = 3;
memcpy(l2, &c_l2, sizeof(c_l2));
ret = connect(-1, l2, len);
printf("connect(-1, {sa_family=AF_BLUETOOTH"
", l2_psm=htobs(0xbad /* L2CAP_PSM_??? */)"
", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
- ", l2_cid=htobs(%hu), l2_bdaddr_type=0x3 /* BDADDR_??? */}"
+ ", l2_cid=htobs(0x8 /* L2CAP_CID_??? */)"
+ ", l2_bdaddr_type=0x3 /* BDADDR_??? */}"
", %u) = %d EBADF (%m)\n",
c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
- h_cid, len, ret);
+ len, ret);
}
#endif