l2test: Add support to BT_PHY
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 18 Feb 2020 21:35:57 +0000 (13:35 -0800)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:48 +0000 (14:30 +0530)
This makes l2test attempt to read BT_PHY socket option and print out
the supported packet types/PHY:

l2test[7282]: Connected to XX:XX:XX:XX:XX:XX (bredr, psm 4113, dcid 64)
l2test[7282]: Local device XX:XX:XX:XX:XX:XX (bredr, psm 4113, scid 64)
l2test[7282]: Options [imtu 672, omtu 672, flush_to 65535, mode 0, handle 256, class 0x000000, priority 0, rcvbuf 212992]
l2test[7282]: Supported PHY: 0x000001ff
          BR1M1SLOT
          BR1M3SLOT
          BR1M5SLOT
          EDR2M1SLOT
          EDR2M3SLOT
          EDR2M5SLOT
          EDR3M1SLOT
          EDR3M3SLOT
          EDR3M5SLOT

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
tools/l2test.c

index af01022..835ff4b 100755 (executable)
@@ -48,6 +48,7 @@
 #include "lib/l2cap.h"
 
 #include "src/shared/util.h"
+#include "monitor/display.h"
 
 #define NIBBLE_TO_ASCII(c)  ((c) < 0x0a ? (c) + 0x30 : (c) + 0x57)
 
@@ -316,14 +317,105 @@ static int setopts(int sk, struct l2cap_options *opts)
                                                        sizeof(opts->imtu));
 }
 
+bool use_color(void)
+{
+       return false;
+}
+
+static const struct bitfield_data phy_table[] = {
+       {  0, "BR1M1SLOT" },
+       {  1, "BR1M3SLOT" },
+       {  2, "BR1M5SLOT" },
+       {  3, "EDR2M1SLOT" },
+       {  4, "EDR2M3SLOT" },
+       {  5, "EDR2M5SLOT" },
+       {  6, "EDR3M1SLOT" },
+       {  7, "EDR3M3SLOT" },
+       {  8, "EDR3M5SLOT" },
+       {  9, "LE1MTX" },
+       { 10, "LE1MRX" },
+       { 11, "LE2MTX" },
+       { 12, "LE2MRX" },
+       { 13, "LECODEDTX" },
+       { 14, "LECODEDRX" },
+       {},
+};
+
+static int print_info(int sk, struct l2cap_options *opts)
+{
+       struct sockaddr_l2 addr;
+       socklen_t optlen;
+       struct l2cap_conninfo conn;
+       int prio, phy;
+       char ba[18];
+
+       /* Get connection information */
+       memset(&conn, 0, sizeof(conn));
+       optlen = sizeof(conn);
+
+       if (getsockopt(sk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &optlen) < 0) {
+               syslog(LOG_ERR, "Can't get L2CAP connection information: "
+                               "%s (%d)", strerror(errno), errno);
+               return -errno;
+       }
+
+       if (getsockopt(sk, SOL_SOCKET, SO_PRIORITY, &prio, &optlen) < 0) {
+               syslog(LOG_ERR, "Can't get socket priority: %s (%d)",
+                                                       strerror(errno), errno);
+               return -errno;
+       }
+
+       /* Check for remote address */
+       memset(&addr, 0, sizeof(addr));
+       optlen = sizeof(addr);
+
+       if (getpeername(sk, (struct sockaddr *) &addr, &optlen) < 0) {
+               syslog(LOG_ERR, "Can't get socket name: %s (%d)",
+                                                       strerror(errno), errno);
+               return -errno;
+       }
+
+       ba2str(&addr.l2_bdaddr, ba);
+       syslog(LOG_INFO, "Connected to %s (%s, psm %d, dcid %d)", ba,
+               get_lookup_str(bdaddr_types, addr.l2_bdaddr_type),
+               addr.l2_psm, addr.l2_cid);
+
+       /* Check for socket address */
+       memset(&addr, 0, sizeof(addr));
+       optlen = sizeof(addr);
+
+       if (getsockname(sk, (struct sockaddr *) &addr, &optlen) < 0) {
+               syslog(LOG_ERR, "Can't get socket name: %s (%d)",
+                                                       strerror(errno), errno);
+               return -errno;
+       }
+
+       ba2str(&addr.l2_bdaddr, ba);
+       syslog(LOG_INFO, "Local device %s (%s, psm %d, scid %d)", ba,
+               get_lookup_str(bdaddr_types, addr.l2_bdaddr_type),
+               addr.l2_psm, addr.l2_cid);
+
+       syslog(LOG_INFO, "Options [imtu %d, omtu %d, flush_to %d, mode %d, "
+               "handle %d, class 0x%02x%02x%02x, priority %d, rcvbuf %d]",
+               opts->imtu, opts->omtu, opts->flush_to, opts->mode,
+               conn.hci_handle, conn.dev_class[2], conn.dev_class[1],
+               conn.dev_class[0], prio, rcvbuf);
+
+
+       if (!getsockopt(sk, SOL_BLUETOOTH, BT_PHY, &phy, &optlen)) {
+               syslog(LOG_INFO, "Supported PHY: 0x%08x", phy);
+               print_bitfield(2, phy, phy_table);
+       }
+
+       return 0;
+}
+
 static int do_connect(char *svr)
 {
        struct sockaddr_l2 addr;
        struct l2cap_options opts;
-       struct l2cap_conninfo conn;
        socklen_t optlen;
        int sk, opt;
-       char ba[18];
 
        /* Create socket */
        sk = socket(PF_BLUETOOTH, socktype, BTPROTO_L2CAP);
@@ -461,64 +553,8 @@ static int do_connect(char *svr)
                goto error;
        }
 
-       /* Get connection information */
-       memset(&conn, 0, sizeof(conn));
-       optlen = sizeof(conn);
-
-       if (getsockopt(sk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &optlen) < 0) {
-               syslog(LOG_ERR, "Can't get L2CAP connection information: %s (%d)",
-                                                       strerror(errno), errno);
-               goto error;
-       }
-
-       if (priority > 0 && setsockopt(sk, SOL_SOCKET, SO_PRIORITY, &priority,
-                                               sizeof(priority)) < 0) {
-               syslog(LOG_ERR, "Can't set socket priority: %s (%d)",
-                                                       strerror(errno), errno);
-               goto error;
-       }
-
-       if (getsockopt(sk, SOL_SOCKET, SO_PRIORITY, &opt, &optlen) < 0) {
-               syslog(LOG_ERR, "Can't get socket priority: %s (%d)",
-                                                       strerror(errno), errno);
-               goto error;
-       }
-
-       /* Check for remote address */
-       memset(&addr, 0, sizeof(addr));
-       optlen = sizeof(addr);
-
-       if (getpeername(sk, (struct sockaddr *) &addr, &optlen) < 0) {
-               syslog(LOG_ERR, "Can't get socket name: %s (%d)",
-                                                       strerror(errno), errno);
-               goto error;
-       }
-
-       ba2str(&addr.l2_bdaddr, ba);
-       syslog(LOG_INFO, "Connected to %s (%s, psm %d, scid %d)", ba,
-               get_lookup_str(bdaddr_types, addr.l2_bdaddr_type),
-               addr.l2_psm, addr.l2_cid);
-
-       /* Check for socket address */
-       memset(&addr, 0, sizeof(addr));
-       optlen = sizeof(addr);
-
-       if (getsockname(sk, (struct sockaddr *) &addr, &optlen) < 0) {
-               syslog(LOG_ERR, "Can't get socket name: %s (%d)",
-                                                       strerror(errno), errno);
+       if (print_info(sk, &opts) < 0)
                goto error;
-       }
-
-       ba2str(&addr.l2_bdaddr, ba);
-       syslog(LOG_INFO, "Local device %s (%s, psm %d, scid %d)", ba,
-               get_lookup_str(bdaddr_types, addr.l2_bdaddr_type),
-               addr.l2_psm, addr.l2_cid);
-
-       syslog(LOG_INFO, "Options [imtu %d, omtu %d, flush_to %d, "
-               "mode %d, handle %d, class 0x%02x%02x%02x, priority %d, rcvbuf %d]",
-               opts.imtu, opts.omtu, opts.flush_to, opts.mode, conn.hci_handle,
-               conn.dev_class[2], conn.dev_class[1], conn.dev_class[0], opt,
-               rcvbuf);
 
        omtu = (opts.omtu > buffer_size) ? buffer_size : opts.omtu;
        imtu = (opts.imtu > buffer_size) ? buffer_size : opts.imtu;
@@ -534,10 +570,8 @@ static void do_listen(void (*handler)(int sk))
 {
        struct sockaddr_l2 addr;
        struct l2cap_options opts;
-       struct l2cap_conninfo conn;
        socklen_t optlen;
        int sk, nsk, opt;
-       char ba[18];
 
        /* Create socket */
        sk = socket(PF_BLUETOOTH, socktype, BTPROTO_L2CAP);
@@ -687,62 +721,11 @@ static void do_listen(void (*handler)(int sk))
                        }
                }
 
-               /* Get connection information */
-               memset(&conn, 0, sizeof(conn));
-               optlen = sizeof(conn);
-
-               if (getsockopt(nsk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &optlen) < 0) {
-                       syslog(LOG_ERR, "Can't get L2CAP connection information: %s (%d)",
-                                                       strerror(errno), errno);
-                       if (!defer_setup) {
-                               close(nsk);
-                               goto error;
-                       }
-               }
-
-               if (priority > 0 && setsockopt(nsk, SOL_SOCKET, SO_PRIORITY,
-                                       &priority, sizeof(priority)) < 0) {
-                       syslog(LOG_ERR, "Can't set socket priority: %s (%d)",
-                                               strerror(errno), errno);
+               if (print_info(nsk, &opts) < 0) {
                        close(nsk);
                        goto error;
                }
 
-               optlen = sizeof(priority);
-               if (getsockopt(nsk, SOL_SOCKET, SO_PRIORITY, &opt, &optlen) < 0) {
-                       syslog(LOG_ERR, "Can't get socket priority: %s (%d)",
-                                                       strerror(errno), errno);
-                       goto error;
-               }
-
-               ba2str(&addr.l2_bdaddr, ba);
-               syslog(LOG_INFO, "Connect from %s (%s, psm %d, dcid %d)", ba,
-                               get_lookup_str(bdaddr_types, addr.l2_bdaddr_type),
-                               addr.l2_psm, addr.l2_cid);
-
-               /* Check for socket address */
-               memset(&addr, 0, sizeof(addr));
-               optlen = sizeof(addr);
-
-               if (getsockname(nsk, (struct sockaddr *) &addr, &optlen) < 0) {
-                       syslog(LOG_ERR, "Can't get socket name: %s (%d)",
-                                                       strerror(errno), errno);
-                       goto error;
-               }
-
-               ba2str(&addr.l2_bdaddr, ba);
-               syslog(LOG_INFO, "Local device %s (%s, psm %d, scid %d)", ba,
-                               get_lookup_str(bdaddr_types, addr.l2_bdaddr_type),
-                               addr.l2_psm, addr.l2_cid);
-
-               syslog(LOG_INFO, "Options [imtu %d, omtu %d, "
-                               "flush_to %d, mode %d, handle %d, "
-                               "class 0x%02x%02x%02x, priority %d, rcvbuf %d]",
-                               opts.imtu, opts.omtu, opts.flush_to,
-                               opts.mode, conn.hci_handle, conn.dev_class[2],
-                               conn.dev_class[1], conn.dev_class[0], opt,
-                               rcvbuf);
-
                omtu = (opts.omtu > buffer_size) ? buffer_size : opts.omtu;
                imtu = (opts.imtu > buffer_size) ? buffer_size : opts.imtu;