|
@@ -1049,18 +1049,21 @@ set_rcvbuf:
|
|
break;
|
|
break;
|
|
|
|
|
|
case SO_ZEROCOPY:
|
|
case SO_ZEROCOPY:
|
|
- if (sk->sk_family != PF_INET && sk->sk_family != PF_INET6)
|
|
|
|
|
|
+ if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6) {
|
|
|
|
+ if (sk->sk_protocol != IPPROTO_TCP)
|
|
|
|
+ ret = -ENOTSUPP;
|
|
|
|
+ else if (sk->sk_state != TCP_CLOSE)
|
|
|
|
+ ret = -EBUSY;
|
|
|
|
+ } else if (sk->sk_family != PF_RDS) {
|
|
ret = -ENOTSUPP;
|
|
ret = -ENOTSUPP;
|
|
- else if (sk->sk_protocol != IPPROTO_TCP)
|
|
|
|
- ret = -ENOTSUPP;
|
|
|
|
- else if (sk->sk_state != TCP_CLOSE)
|
|
|
|
- ret = -EBUSY;
|
|
|
|
- else if (val < 0 || val > 1)
|
|
|
|
- ret = -EINVAL;
|
|
|
|
- else
|
|
|
|
- sock_valbool_flag(sk, SOCK_ZEROCOPY, valbool);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
|
|
+ }
|
|
|
|
+ if (!ret) {
|
|
|
|
+ if (val < 0 || val > 1)
|
|
|
|
+ ret = -EINVAL;
|
|
|
|
+ else
|
|
|
|
+ sock_valbool_flag(sk, SOCK_ZEROCOPY, valbool);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
default:
|
|
default:
|
|
ret = -ENOPROTOOPT;
|
|
ret = -ENOPROTOOPT;
|
|
break;
|
|
break;
|