#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. Да, я только что заметил, что они отличаются. Я проверил более новое ядро, чем текущее, в котором я работаю. Моя ошибка 😉