mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
[NET]: {get|set}sockopt compatibility layer
This patch extends {get|set}sockopt compatibility layer in order to
move protocol specific parts to their place and avoid huge universal
net/compat.c file in the future.
Signed-off-by: Dmitry Mishin <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
c750360938
commit
3fdadf7d27
29 changed files with 928 additions and 139 deletions
|
|
@ -192,6 +192,14 @@ extern int dccp_getsockopt(struct sock *sk, int level, int optname,
|
|||
char __user *optval, int __user *optlen);
|
||||
extern int dccp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
#ifdef CONFIG_COMPAT
|
||||
extern int compat_dccp_getsockopt(struct sock *sk,
|
||||
int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
extern int compat_dccp_setsockopt(struct sock *sk,
|
||||
int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
#endif
|
||||
extern int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg);
|
||||
extern int dccp_sendmsg(struct kiocb *iocb, struct sock *sk,
|
||||
struct msghdr *msg, size_t size);
|
||||
|
|
|
|||
|
|
@ -994,6 +994,10 @@ static struct inet_connection_sock_af_ops dccp_ipv4_af_ops = {
|
|||
.net_header_len = sizeof(struct iphdr),
|
||||
.setsockopt = ip_setsockopt,
|
||||
.getsockopt = ip_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_ip_setsockopt,
|
||||
.compat_getsockopt = compat_ip_getsockopt,
|
||||
#endif
|
||||
.addr2sockaddr = inet_csk_addr2sockaddr,
|
||||
.sockaddr_len = sizeof(struct sockaddr_in),
|
||||
};
|
||||
|
|
@ -1040,6 +1044,10 @@ static struct proto dccp_v4_prot = {
|
|||
.init = dccp_v4_init_sock,
|
||||
.setsockopt = dccp_setsockopt,
|
||||
.getsockopt = dccp_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_dccp_setsockopt,
|
||||
.compat_getsockopt = compat_dccp_getsockopt,
|
||||
#endif
|
||||
.sendmsg = dccp_sendmsg,
|
||||
.recvmsg = dccp_recvmsg,
|
||||
.backlog_rcv = dccp_v4_do_rcv,
|
||||
|
|
@ -1079,6 +1087,10 @@ static const struct proto_ops inet_dccp_ops = {
|
|||
.shutdown = inet_shutdown,
|
||||
.setsockopt = sock_common_setsockopt,
|
||||
.getsockopt = sock_common_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_sock_common_setsockopt,
|
||||
.compat_getsockopt = compat_sock_common_getsockopt,
|
||||
#endif
|
||||
.sendmsg = inet_sendmsg,
|
||||
.recvmsg = sock_common_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
|
|
|
|||
|
|
@ -1114,6 +1114,10 @@ static struct inet_connection_sock_af_ops dccp_ipv6_af_ops = {
|
|||
.net_header_len = sizeof(struct ipv6hdr),
|
||||
.setsockopt = ipv6_setsockopt,
|
||||
.getsockopt = ipv6_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_ipv6_setsockopt,
|
||||
.compat_getsockopt = compat_ipv6_getsockopt,
|
||||
#endif
|
||||
.addr2sockaddr = inet6_csk_addr2sockaddr,
|
||||
.sockaddr_len = sizeof(struct sockaddr_in6)
|
||||
};
|
||||
|
|
@ -1130,6 +1134,10 @@ static struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
|
|||
.net_header_len = sizeof(struct iphdr),
|
||||
.setsockopt = ipv6_setsockopt,
|
||||
.getsockopt = ipv6_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_ipv6_setsockopt,
|
||||
.compat_getsockopt = compat_ipv6_getsockopt,
|
||||
#endif
|
||||
.addr2sockaddr = inet6_csk_addr2sockaddr,
|
||||
.sockaddr_len = sizeof(struct sockaddr_in6)
|
||||
};
|
||||
|
|
@ -1167,6 +1175,10 @@ static struct proto dccp_v6_prot = {
|
|||
.init = dccp_v6_init_sock,
|
||||
.setsockopt = dccp_setsockopt,
|
||||
.getsockopt = dccp_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_dccp_setsockopt,
|
||||
.compat_getsockopt = compat_dccp_getsockopt,
|
||||
#endif
|
||||
.sendmsg = dccp_sendmsg,
|
||||
.recvmsg = dccp_recvmsg,
|
||||
.backlog_rcv = dccp_v6_do_rcv,
|
||||
|
|
@ -1204,6 +1216,10 @@ static struct proto_ops inet6_dccp_ops = {
|
|||
.shutdown = inet_shutdown,
|
||||
.setsockopt = sock_common_setsockopt,
|
||||
.getsockopt = sock_common_getsockopt,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_setsockopt = compat_sock_common_setsockopt,
|
||||
.compat_getsockopt = compat_sock_common_getsockopt,
|
||||
#endif
|
||||
.sendmsg = inet_sendmsg,
|
||||
.recvmsg = sock_common_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
|
|
|
|||
|
|
@ -455,18 +455,13 @@ out_free_val:
|
|||
goto out;
|
||||
}
|
||||
|
||||
int dccp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
{
|
||||
struct dccp_sock *dp;
|
||||
int err;
|
||||
int val;
|
||||
|
||||
if (level != SOL_DCCP)
|
||||
return inet_csk(sk)->icsk_af_ops->setsockopt(sk, level,
|
||||
optname, optval,
|
||||
optlen);
|
||||
|
||||
if (optlen < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -512,8 +507,34 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
|
|||
return err;
|
||||
}
|
||||
|
||||
int dccp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
{
|
||||
if (level != SOL_DCCP)
|
||||
return inet_csk(sk)->icsk_af_ops->setsockopt(sk, level,
|
||||
optname, optval,
|
||||
optlen);
|
||||
return do_dccp_setsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dccp_setsockopt);
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
int compat_dccp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
{
|
||||
if (level != SOL_DCCP) {
|
||||
if (inet_csk(sk)->icsk_af_ops->compat_setsockopt)
|
||||
return inet_csk(sk)->icsk_af_ops->compat_setsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
else
|
||||
return inet_csk(sk)->icsk_af_ops->setsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
}
|
||||
return do_dccp_setsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(compat_dccp_setsockopt);
|
||||
#endif
|
||||
|
||||
static int dccp_getsockopt_service(struct sock *sk, int len,
|
||||
__be32 __user *optval,
|
||||
int __user *optlen)
|
||||
|
|
@ -545,16 +566,12 @@ out:
|
|||
return err;
|
||||
}
|
||||
|
||||
int dccp_getsockopt(struct sock *sk, int level, int optname,
|
||||
static int do_dccp_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen)
|
||||
{
|
||||
struct dccp_sock *dp;
|
||||
int val, len;
|
||||
|
||||
if (level != SOL_DCCP)
|
||||
return inet_csk(sk)->icsk_af_ops->getsockopt(sk, level,
|
||||
optname, optval,
|
||||
optlen);
|
||||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
|
|
@ -587,8 +604,34 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int dccp_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen)
|
||||
{
|
||||
if (level != SOL_DCCP)
|
||||
return inet_csk(sk)->icsk_af_ops->getsockopt(sk, level,
|
||||
optname, optval,
|
||||
optlen);
|
||||
return do_dccp_getsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dccp_getsockopt);
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
int compat_dccp_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen)
|
||||
{
|
||||
if (level != SOL_DCCP) {
|
||||
if (inet_csk(sk)->icsk_af_ops->compat_setsockopt)
|
||||
return inet_csk(sk)->icsk_af_ops->compat_getsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
else
|
||||
return inet_csk(sk)->icsk_af_ops->getsockopt(sk,
|
||||
level, optname, optval, optlen);
|
||||
}
|
||||
return do_dccp_getsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(compat_dccp_getsockopt);
|
||||
#endif
|
||||
|
||||
int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
size_t len)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue