|
@@ -534,6 +534,41 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
|
|
err = -EFAULT;
|
|
err = -EFAULT;
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case BT_SNDMTU:
|
|
|
|
+ if (!enable_lecoc) {
|
|
|
|
+ err = -EPROTONOSUPPORT;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!bdaddr_type_is_le(chan->src_type)) {
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (sk->sk_state != BT_CONNECTED) {
|
|
|
|
+ err = -ENOTCONN;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (put_user(chan->omtu, (u16 __user *) optval))
|
|
|
|
+ err = -EFAULT;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case BT_RCVMTU:
|
|
|
|
+ if (!enable_lecoc) {
|
|
|
|
+ err = -EPROTONOSUPPORT;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!bdaddr_type_is_le(chan->src_type)) {
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (put_user(chan->imtu, (u16 __user *) optval))
|
|
|
|
+ err = -EFAULT;
|
|
|
|
+ break;
|
|
|
|
+
|
|
default:
|
|
default:
|
|
err = -ENOPROTOOPT;
|
|
err = -ENOPROTOOPT;
|
|
break;
|
|
break;
|
|
@@ -834,6 +869,47 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
|
|
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case BT_SNDMTU:
|
|
|
|
+ if (!enable_lecoc) {
|
|
|
|
+ err = -EPROTONOSUPPORT;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!bdaddr_type_is_le(chan->src_type)) {
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Setting is not supported as it's the remote side that
|
|
|
|
+ * decides this.
|
|
|
|
+ */
|
|
|
|
+ err = -EPERM;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case BT_RCVMTU:
|
|
|
|
+ if (!enable_lecoc) {
|
|
|
|
+ err = -EPROTONOSUPPORT;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!bdaddr_type_is_le(chan->src_type)) {
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (sk->sk_state == BT_CONNECTED) {
|
|
|
|
+ err = -EISCONN;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (get_user(opt, (u32 __user *) optval)) {
|
|
|
|
+ err = -EFAULT;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ chan->imtu = opt;
|
|
|
|
+ break;
|
|
|
|
+
|
|
default:
|
|
default:
|
|
err = -ENOPROTOOPT;
|
|
err = -ENOPROTOOPT;
|
|
break;
|
|
break;
|