Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 17.12. Custom ioctl Commands

Оглавление
Английский оригинал Перевод на русский

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

17.12. Пользовательские команды ioctl

hardorsoft 26.10.10 в 04:29

0

Мы видели, что системный вызов ioctl реализован для сокетов.
SIOCSIFADDR и SIOCSIFMAP являются примерами сокетной функции
ioctl. Теперь рассмотрим, как третий аргумент системного вызова
используется сетевым кодом.

hardorsoft 26.10.10 в 04:32

0

При выполнении системного вызова ioctl для сокета, управление
передается в функцию sock_ioctl, специфичную для протокола (где
"протокол" означает основной используемый сетевой протокол, например,
IP или AppleTalk). Номера команд определенны в "linux/sockios.h".

hardorsoft 26.10.10 в 04:33

0

Любая команда, не опознанная на уровне протокола, передается на
уровень устройства. Эта, специфичная для устройства, команда
передается третьим аргументом из пользовательского пространства, как
struct ifreq * (структура определена в "linux/if.h"). Команды
SIOCSIFADDR И SIOCSIFMAP воздействуют на структуру ifreq.
Дополнительный аргумент SIOCSIFMAP, хоть определен как ifmap, но
является полем ifreq.

hardorsoft 26.10.10 в 04:33

0

Дополнительно к стандартным вызовам, каждый интерфейс может
определять собственные команды ioctl. Интерфейс plip, например,
позволяет интерфейсу изменять его внутренние значения таймаута,
через ioctl. Реализация ioctl для сокетов поддерживает 16 приватных
команд интерфейса: с SIOCDEVPRIVATE по SIOCDEVPRIVATE+15

hardorsoft 26.10.10 в 04:34

0

(обратите
внимание, что, согласно <"linux/sockios.h">, команды SIOCDEVPRIVATE
не желательны; не ясно чем заменить их, и многие драйверы все еще
используют их).

hardorsoft 26.10.10 в 04:37

0

При обнаружении одной из этих команд, вызывается dev->do_ioctl
для соответствующего интерфейса. Функция получает тот же указатель
struct ifreq *, что и универсальная функция ioctl:

hardorsoft 26.10.10 в 04:35

0

int (*do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);

hardorsoft 26.10.10 в 04:35

0

Указатель ifr содержит адрес копии структуры пользователя в
пространстве ядра. После вызова do_ioctl, структура копируется обратно
в пространство пользователя. Поэтому драйвер может использовать
приватные команды, как для отправки, так и для принятия данных.

hardorsoft 26.10.10 в 04:36

0

Команды, специфичные устройству, могут использовать поля struct
ifreq. Но поля хранят стандартизированные значения, и маловероятно,
что драйвер cможет приспособить структуру для своих нужд. Поле
ifr_data является указателем caddr_t, который используется в
зависимости от специфики устройства. Драйвер и программа, вызвавшая
ioctl, должна иметь соглашения об использовании ifr_data. Например,
ppp-stats использует специфичные устройству команды, чтобы передать,
информацию от драйвера интерфейса ppp.

hardorsoft 26.10.10 в 04:36

0

Здесь не показана реализация функции do_ioctl, но приведенная
информация и примеры из ядра позволят вам написать ее при
необходимости. Имейте ввиду, что реализация plip не корректно
использует ifr_data, и не может служить примером реализации ioctl.

hardorsoft 26.10.10 в 04:36

0
Минутку...