Как отправить структуру из пространства пользователя в ядро ​​с помощью сокетов? - PullRequest
0 голосов
/ 25 июня 2019

Для проекта, в котором я хочу, чтобы данные доходили до ядра из пользовательского пространства, я уже создал новые сокеты для строк и целых чисел, но я застреваю со структурами. Как вы отправляете структуру из пользовательского пространства в ядро?

Я пытался использовать copy_from_user, но я думаю, что что-то не так в том, как я использую эту функцию. Поскольку я думаю, что copy_from_user должен работать, я прав в этом?

Структура, которую я пытаюсь отправить из пользовательского пространства в ядро:

struct mptcp_socket_info {
         __u8 threshold_s1;
         __u8 threshold_s2;
}

Код в ядре:

CASE: MPTCP_SOCKET_INFO: {
         if (optlen < 1)
                return EINVAL;

         lock_sock(sk);
         copy_from_user(tcp_sk(mptcp_meta_sk(sk))->mpcb->socket_info, optval, sizeof(struct mptcp_socket_info));
         release_sock(sk);
         return 0;
         }

Код в пользовательском пространстве:

        int sockfd, portno, n;
        struct sockaddr_in serv_addr;
        struct hostent *server;
        struct mptcp_socket_info socket_info;

        socket_info.threshold_s1 = 100;
        socket_info.threshold_s2 = 50;

-----
-----

        setsockopt(sockfd, SOL_TCP, MPTCP_SOCKET_INFO, &socket_info, sizeof(socket_info));

Когда я запускаю этот код, ядро ​​падает, и оно говорит, что оно падает, когда я пытаюсь установить значения в socketopt.

...