|
@@ -1666,6 +1666,10 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
|
struct net *net = sock_net(sk);
|
|
struct net *net = sock_net(sk);
|
|
struct mr6_table *mrt;
|
|
struct mr6_table *mrt;
|
|
|
|
|
|
|
|
+ if (sk->sk_type != SOCK_RAW ||
|
|
|
|
+ inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+
|
|
mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
|
|
mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
|
|
if (!mrt)
|
|
if (!mrt)
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
@@ -1677,9 +1681,6 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
|
|
|
|
|
switch (optname) {
|
|
switch (optname) {
|
|
case MRT6_INIT:
|
|
case MRT6_INIT:
|
|
- if (sk->sk_type != SOCK_RAW ||
|
|
|
|
- inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
|
|
|
|
- return -EOPNOTSUPP;
|
|
|
|
if (optlen < sizeof(int))
|
|
if (optlen < sizeof(int))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
@@ -1815,6 +1816,10 @@ int ip6_mroute_getsockopt(struct sock *sk, int optname, char __user *optval,
|
|
struct net *net = sock_net(sk);
|
|
struct net *net = sock_net(sk);
|
|
struct mr6_table *mrt;
|
|
struct mr6_table *mrt;
|
|
|
|
|
|
|
|
+ if (sk->sk_type != SOCK_RAW ||
|
|
|
|
+ inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+
|
|
mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
|
|
mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
|
|
if (!mrt)
|
|
if (!mrt)
|
|
return -ENOENT;
|
|
return -ENOENT;
|