我正在使用nf_register_sockopt()
注册新的setsockopts()命令:
static struct nf_sockopt_ops my_sockopts = {
list: {NULL, NULL},
pf: PF_INET,
set_optmin: MY_OPT_MIN,
set_optmax: MY_OPT_MAX,
set: my_set_so,
get_optmin: 0,
get_optmax: 0,
get: NULL
};
nf_register_sockopt(&my_sockopts);
我想将(内核空间)函数my_set_so()
中的错误代码返回给用户空间。因此,我使用copy_to_user()
复制此代码:
int my_set_so(struct sock *sk, int cmd, void *param, unsigned int len) {
struct my_so_param user_data;
user_data.return_value = do_my_kernelspace_work();
if (copy_to_user(param, &user_data, sizeof(user_data)))
HOW TO INDICATE THE FAILURE HERE?
}
据我所知,根据手册页,setsockopt()
将返回一些系统错误代码,以防发生套接字级错误。如果错误出现在命令处理代码中,setsockopt()
仍然返回0,并且必须从void*
参数检查返回值。
这种理解是否正确?如果是,那么(用户空间)呼叫者应该如何被告知copy_to_user()
的失败?
答案 0 :(得分:1)
如果我理解你的问题,你必须返回-EFAULT
相应的手册页意味着
EFAULT optval指向的地址不在进程地址空间的有效部分中。对于getsockopt(),如果optlen不在进程地址空间的有效部分,也可能返回此错误。
所以,
int my_set_so(struct sock *sk, int cmd, void *param, unsigned int len) {
struct my_so_param user_data;
user_data.return_value = do_my_kernelspace_work();
if (copy_to_user(param, &user_data, sizeof(user_data)))
return -EFAULT; /* HOW TO INDICATE THE FAILURE HERE? */
}