ATT needs to know to link key type before run some of it procedures. Using the socket sec_level doesn't work because the socket may not reflect the real sec_level of the link. Reported-by: Anderson Lizardo <anderson.lizardo@xxxxxxxxxxxxx> Signed-off-by: Gustavo F. Padovan <padovan@xxxxxxxxxxxxxx> --- include/net/bluetooth/bluetooth.h | 5 +++++ net/bluetooth/l2cap_sock.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 4375043..be7a8ee 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -66,6 +66,11 @@ struct bt_security { #define BT_FLUSHABLE 8 +#define BT_CONNINFO 9 +struct bt_conninfo { + __u8 sec_level; +}; + #define BT_FLUSHABLE_OFF 0 #define BT_FLUSHABLE_ON 1 diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 484e717..f09fd97 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -467,7 +467,9 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __us static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { struct sock *sk = sock->sk; + struct hci_conn *hcon = l2cap_pi(sk)->conn->hcon; struct bt_security sec; + struct bt_conninfo conninfo; int len, err = 0; BT_DBG("sk %p", sk); @@ -516,6 +518,20 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch break; + case BT_CONNINFO: + if (sk->sk_state != BT_CONNECTED) { + err = -EINVAL; + break; + } + + conninfo.sec_level = hcon->sec_level; + + len = min_t(unsigned int, len, sizeof(conninfo)); + if (copy_to_user(optval, (char *) &conninfo, len)) + err = -EFAULT; + + break; + default: err = -ENOPROTOOPT; break; -- 1.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html