diff options
Diffstat (limited to 'net/bluetooth')
| -rw-r--r-- | net/bluetooth/bnep/sock.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/sock.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/hci_conn.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/hci_core.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/hci_sock.c | 16 | ||||
| -rw-r--r-- | net/bluetooth/hidp/sock.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 13 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_sock.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/mgmt.c | 16 | ||||
| -rw-r--r-- | net/bluetooth/smp.c | 10 | 
10 files changed, 49 insertions, 26 deletions
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index 5e5f5b410e0..1eaacf10d19 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c @@ -58,7 +58,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long  	switch (cmd) {  	case BNEPCONNADD:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (copy_from_user(&ca, argp, sizeof(ca)))  			return -EFAULT; @@ -84,7 +84,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long  	case BNEPCONNDEL:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (copy_from_user(&cd, argp, sizeof(cd)))  			return -EFAULT; diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index 311668d1457..32dc83dcb6b 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c @@ -72,7 +72,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long  	switch (cmd) {  	case CMTPCONNADD:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (copy_from_user(&ca, argp, sizeof(ca)))  			return -EFAULT; @@ -97,7 +97,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long  	case CMTPCONNDEL:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (copy_from_user(&cd, argp, sizeof(cd)))  			return -EFAULT; diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 5ad7da21747..3c094e78dde 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -29,6 +29,7 @@  #include <net/bluetooth/bluetooth.h>  #include <net/bluetooth/hci_core.h>  #include <net/bluetooth/a2mp.h> +#include <net/bluetooth/smp.h>  static void hci_le_connect(struct hci_conn *conn)  { @@ -619,6 +620,9 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)  {  	BT_DBG("hcon %p", conn); +	if (conn->type == LE_LINK) +		return smp_conn_security(conn, sec_level); +  	/* For sdp we don't need the link key. */  	if (sec_level == BT_SECURITY_SDP)  		return 1; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index d4de5db18d5..0b997c8f965 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -734,6 +734,8 @@ static int hci_dev_do_close(struct hci_dev *hdev)  	cancel_work_sync(&hdev->le_scan); +	cancel_delayed_work(&hdev->power_off); +  	hci_req_cancel(hdev, ENODEV);  	hci_req_lock(hdev); diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 19fdac78e55..d5ace1eda3e 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -490,7 +490,7 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,  	switch (cmd) {  	case HCISETRAW:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))  			return -EPERM; @@ -510,12 +510,12 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,  	case HCIBLOCKADDR:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_sock_blacklist_add(hdev, (void __user *) arg);  	case HCIUNBLOCKADDR:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_sock_blacklist_del(hdev, (void __user *) arg);  	default: @@ -546,22 +546,22 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,  	case HCIDEVUP:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_dev_open(arg);  	case HCIDEVDOWN:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_dev_close(arg);  	case HCIDEVRESET:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_dev_reset(arg);  	case HCIDEVRESTAT:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_dev_reset_stat(arg);  	case HCISETSCAN: @@ -573,7 +573,7 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,  	case HCISETACLMTU:  	case HCISETSCOMTU:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		return hci_dev_cmd(cmd, argp);  	case HCIINQUIRY: diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c index 18b3f6892a3..b24fb3bd862 100644 --- a/net/bluetooth/hidp/sock.c +++ b/net/bluetooth/hidp/sock.c @@ -56,7 +56,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long  	switch (cmd) {  	case HIDPCONNADD:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (copy_from_user(&ca, argp, sizeof(ca)))  			return -EFAULT; @@ -91,7 +91,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long  	case HIDPCONNDEL:  		if (!capable(CAP_NET_ADMIN)) -			return -EACCES; +			return -EPERM;  		if (copy_from_user(&cd, argp, sizeof(cd)))  			return -EFAULT; diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index daa149b7003..38c00f14220 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -1008,7 +1008,7 @@ static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *c  	if (!conn)  		return; -	if (chan->mode == L2CAP_MODE_ERTM) { +	if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {  		__clear_retrans_timer(chan);  		__clear_monitor_timer(chan);  		__clear_ack_timer(chan); @@ -1199,14 +1199,15 @@ clean:  static void l2cap_conn_ready(struct l2cap_conn *conn)  {  	struct l2cap_chan *chan; +	struct hci_conn *hcon = conn->hcon;  	BT_DBG("conn %p", conn); -	if (!conn->hcon->out && conn->hcon->type == LE_LINK) +	if (!hcon->out && hcon->type == LE_LINK)  		l2cap_le_conn_ready(conn); -	if (conn->hcon->out && conn->hcon->type == LE_LINK) -		smp_conn_security(conn, conn->hcon->pending_sec_level); +	if (hcon->out && hcon->type == LE_LINK) +		smp_conn_security(hcon, hcon->pending_sec_level);  	mutex_lock(&conn->chan_lock); @@ -1219,8 +1220,8 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)  			continue;  		} -		if (conn->hcon->type == LE_LINK) { -			if (smp_conn_security(conn, chan->sec_level)) +		if (hcon->type == LE_LINK) { +			if (smp_conn_security(hcon, chan->sec_level))  				l2cap_chan_ready(chan);  		} else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 1497edd191a..34bbe1c5e38 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -616,7 +616,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch  				break;  			} -			if (smp_conn_security(conn, sec.level)) +			if (smp_conn_security(conn->hcon, sec.level))  				break;  			sk->sk_state = BT_CONFIG;  			chan->state = BT_CONFIG; diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index ad6613d17ca..eba022de3c2 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -2875,6 +2875,22 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered)  		if (scan)  			hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); +		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) { +			u8 ssp = 1; + +			hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &ssp); +		} + +		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) { +			struct hci_cp_write_le_host_supported cp; + +			cp.le = 1; +			cp.simul = !!(hdev->features[6] & LMP_SIMUL_LE_BR); + +			hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, +				     sizeof(cp), &cp); +		} +  		update_class(hdev);  		update_name(hdev, hdev->dev_name);  		update_eir(hdev); diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 901a616c808..8c225ef349c 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c @@ -267,10 +267,10 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send)  	mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type,  			 hcon->dst_type, reason); -	if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) { -		cancel_delayed_work_sync(&conn->security_timer); +	cancel_delayed_work_sync(&conn->security_timer); + +	if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))  		smp_chan_destroy(conn); -	}  }  #define JUST_WORKS	0x00 @@ -760,9 +760,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)  	return 0;  } -int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level) +int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)  { -	struct hci_conn *hcon = conn->hcon; +	struct l2cap_conn *conn = hcon->l2cap_data;  	struct smp_chan *smp = conn->smp_chan;  	__u8 authreq;  |