2015-02-13 2 views
1

Я регистрация новых setsockopts() команда с nf_register_sockopt():Передача возвращаемого значения вызывающему абоненту setsockopts(), если copy_to_user() не работает?

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*.

Правильно ли это понимание? Если да, то как должен (userpace) вызывающий быть проинформирован о сбое copy_to_user()?

ответ

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? */ 
} 
+0

К сожалению, я не вижу, как этот ответ согласуется с ручными страниц. Последние инструктируют вернуть -1 на ошибку, а не -EFAULT (и, кроме возврата -1, также установить errno в соответствующее значение). – user3608247

+0

Мы говорим о пространстве пользователя или пространстве ядра? FYI: в пространстве ядра нет 'errno'. – 0andriy

+0

Интересно прочитать также: http://yarchive.net/comp/linux/errno.html – 0andriy

Смежные вопросы