ошибка: присвоение из несовместимого типа указателя [Ошибка= несовместимые типы указателей]

#linux-kernel #kernel-module

#linux-ядро #kernel-module

Вопрос:

Я работаю над модулем ядра Linux.

Структура tcpsp_conn определена в заголовочном файле следующим образом:

 struct tcpsp_conn {
...
struct timer_list timer; /* exp. timer*/
...
};
  

Затем я объявляю указатель на структуру и пытаюсь назначить функцию:

 struct tcpsp_conn *cp;
cp->timer.function = tcpsp_conn_expire;
  

функция tcpsp_conn_expire определяется таким же образом, как в struct timer_list ядра:

 static void tcpsp_conn_expire(unsigned long data)
  

Я не понимаю, почему я получаю эту ошибку:
ошибка: присвоение из несовместимого типа указателя [Ошибка= несовместимые типы указателей] cp->timer.function = tcpsp_conn_expire;

Похоже, что проблем с типами нет.

Ответ №1:

Тип вашей tcpsp_conn_expire функции отличается от типа .function поля timer_list структуры.

В новейшем ядре (начиная с версии 4.15) это функциональное поле объявляется с struct timer_list * аргументом вместо unsigned long следующего:

 struct timer_list {
    ...
    void            (*function)(struct timer_list *);
    ...
};
  

Имея такой аргумент, вы можете получить указатель на struct tcpsp_conn структуру, в которую встроен таймер, с помощью макроса container_of .

Комментарии:

1. Да, я только что заметил, что они отличаются. Я проверил более новое ядро, чем текущее, в котором я работаю. Моя ошибка 😉