diff options
Diffstat (limited to 'net/bluetooth/l2cap_sock.c')
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index a20fcc3ddcd9..01d65bc99b0c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -534,6 +534,41 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, | |||
534 | err = -EFAULT; | 534 | err = -EFAULT; |
535 | break; | 535 | break; |
536 | 536 | ||
537 | case BT_SNDMTU: | ||
538 | if (!enable_lecoc) { | ||
539 | err = -EPROTONOSUPPORT; | ||
540 | break; | ||
541 | } | ||
542 | |||
543 | if (!bdaddr_type_is_le(chan->src_type)) { | ||
544 | err = -EINVAL; | ||
545 | break; | ||
546 | } | ||
547 | |||
548 | if (sk->sk_state != BT_CONNECTED) { | ||
549 | err = -ENOTCONN; | ||
550 | break; | ||
551 | } | ||
552 | |||
553 | if (put_user(chan->omtu, (u16 __user *) optval)) | ||
554 | err = -EFAULT; | ||
555 | break; | ||
556 | |||
557 | case BT_RCVMTU: | ||
558 | if (!enable_lecoc) { | ||
559 | err = -EPROTONOSUPPORT; | ||
560 | break; | ||
561 | } | ||
562 | |||
563 | if (!bdaddr_type_is_le(chan->src_type)) { | ||
564 | err = -EINVAL; | ||
565 | break; | ||
566 | } | ||
567 | |||
568 | if (put_user(chan->imtu, (u16 __user *) optval)) | ||
569 | err = -EFAULT; | ||
570 | break; | ||
571 | |||
537 | default: | 572 | default: |
538 | err = -ENOPROTOOPT; | 573 | err = -ENOPROTOOPT; |
539 | break; | 574 | break; |
@@ -834,6 +869,47 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, | |||
834 | 869 | ||
835 | break; | 870 | break; |
836 | 871 | ||
872 | case BT_SNDMTU: | ||
873 | if (!enable_lecoc) { | ||
874 | err = -EPROTONOSUPPORT; | ||
875 | break; | ||
876 | } | ||
877 | |||
878 | if (!bdaddr_type_is_le(chan->src_type)) { | ||
879 | err = -EINVAL; | ||
880 | break; | ||
881 | } | ||
882 | |||
883 | /* Setting is not supported as it's the remote side that | ||
884 | * decides this. | ||
885 | */ | ||
886 | err = -EPERM; | ||
887 | break; | ||
888 | |||
889 | case BT_RCVMTU: | ||
890 | if (!enable_lecoc) { | ||
891 | err = -EPROTONOSUPPORT; | ||
892 | break; | ||
893 | } | ||
894 | |||
895 | if (!bdaddr_type_is_le(chan->src_type)) { | ||
896 | err = -EINVAL; | ||
897 | break; | ||
898 | } | ||
899 | |||
900 | if (sk->sk_state == BT_CONNECTED) { | ||
901 | err = -EISCONN; | ||
902 | break; | ||
903 | } | ||
904 | |||
905 | if (get_user(opt, (u32 __user *) optval)) { | ||
906 | err = -EFAULT; | ||
907 | break; | ||
908 | } | ||
909 | |||
910 | chan->imtu = opt; | ||
911 | break; | ||
912 | |||
837 | default: | 913 | default: |
838 | err = -ENOPROTOOPT; | 914 | err = -ENOPROTOOPT; |
839 | break; | 915 | break; |