2023-03-23 10:44:26

by Simon Mikuda

[permalink] [raw]
Subject: [PATCH BlueZ 2/9] btgatt-client: Add option to connect to ATT over BR/EDR

---
tools/btgatt-client.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
index 58a03bd48..cce978869 100644
--- a/tools/btgatt-client.c
+++ b/tools/btgatt-client.c
@@ -35,6 +35,7 @@
#include "src/shared/gatt-client.h"

#define ATT_CID 4
+#define ATT_PSM 31

#define PRLOG(...) \
printf(__VA_ARGS__); print_prompt();
@@ -1406,7 +1407,7 @@ static void signal_cb(int signum, void *user_data)
}
}

-static int l2cap_le_att_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
+static int l2cap_att_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
int sec)
{
int sock;
@@ -1419,8 +1420,9 @@ static int l2cap_le_att_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
ba2str(src, srcaddr_str);
ba2str(dst, dstaddr_str);

- printf("btgatt-client: Opening L2CAP LE connection on ATT "
+ printf("btgatt-client: Opening L2CAP %s connection on ATT "
"channel:\n\t src: %s\n\tdest: %s\n",
+ (dst_type == BDADDR_BREDR ? "BR/EDR" : "LE"),
srcaddr_str, dstaddr_str);
}

@@ -1433,7 +1435,10 @@ static int l2cap_le_att_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
/* Set up source address */
memset(&srcaddr, 0, sizeof(srcaddr));
srcaddr.l2_family = AF_BLUETOOTH;
- srcaddr.l2_cid = htobs(ATT_CID);
+ if (dst_type == BDADDR_BREDR)
+ srcaddr.l2_psm = htobs(ATT_PSM);
+ else
+ srcaddr.l2_cid = htobs(ATT_CID);
srcaddr.l2_bdaddr_type = 0;
bacpy(&srcaddr.l2_bdaddr, src);

@@ -1456,7 +1461,10 @@ static int l2cap_le_att_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
/* Set up destination address */
memset(&dstaddr, 0, sizeof(dstaddr));
dstaddr.l2_family = AF_BLUETOOTH;
- dstaddr.l2_cid = htobs(ATT_CID);
+ if (dst_type == BDADDR_BREDR)
+ dstaddr.l2_psm = htobs(ATT_PSM);
+ else
+ dstaddr.l2_cid = htobs(ATT_CID);
dstaddr.l2_bdaddr_type = dst_type;
bacpy(&dstaddr.l2_bdaddr, dst);

@@ -1482,7 +1490,7 @@ static void usage(void)
printf("Options:\n"
"\t-i, --index <id>\t\tSpecify adapter index, e.g. hci0\n"
"\t-d, --dest <addr>\t\tSpecify the destination address\n"
- "\t-t, --type [random|public] \tSpecify the LE address type\n"
+ "\t-t, --type [random|public|bredr] \tSpecify the address type\n"
"\t-m, --mtu <mtu> \t\tThe ATT MTU to use\n"
"\t-s, --security-level <sec> \tSet security level (low|medium|"
"high|fips)\n"
@@ -1558,9 +1566,11 @@ int main(int argc, char *argv[])
dst_type = BDADDR_LE_RANDOM;
else if (strcmp(optarg, "public") == 0)
dst_type = BDADDR_LE_PUBLIC;
+ else if (strcmp(optarg, "bredr") == 0)
+ dst_type = BDADDR_BREDR;
else {
fprintf(stderr,
- "Allowed types: random, public\n");
+ "Allowed types: random, public, bredr\n");
return EXIT_FAILURE;
}
break;
@@ -1616,7 +1626,7 @@ int main(int argc, char *argv[])

mainloop_init();

- fd = l2cap_le_att_connect(&src_addr, &dst_addr, dst_type, sec);
+ fd = l2cap_att_connect(&src_addr, &dst_addr, dst_type, sec);
if (fd < 0)
return EXIT_FAILURE;

--
2.34.1