Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
17.12. Пользовательские команды ioctl
hardorsoft
26.10.10 в 04:29
|
|
Мы видели, что системный вызов ioctl реализован для сокетов. SIOCSIFADDR и SIOCSIFMAP являются примерами сокетной функции ioctl. Теперь рассмотрим, как третий аргумент системного вызова используется сетевым кодом.
hardorsoft
26.10.10 в 04:32
|
|
При выполнении системного вызова ioctl для сокета, управление передается в функцию sock_ioctl, специфичную для протокола (где "протокол" означает основной используемый сетевой протокол, например, IP или AppleTalk). Номера команд определенны в "linux/sockios.h".
hardorsoft
26.10.10 в 04:33
|
|
Любая команда, не опознанная на уровне протокола, передается на уровень устройства. Эта, специфичная для устройства, команда передается третьим аргументом из пользовательского пространства, как struct ifreq * (структура определена в "linux/if.h"). Команды SIOCSIFADDR И SIOCSIFMAP воздействуют на структуру ifreq. Дополнительный аргумент SIOCSIFMAP, хоть определен как ifmap, но является полем ifreq.
hardorsoft
26.10.10 в 04:33
|
|
Дополнительно к стандартным вызовам, каждый интерфейс может определять собственные команды ioctl. Интерфейс plip, например, позволяет интерфейсу изменять его внутренние значения таймаута, через ioctl. Реализация ioctl для сокетов поддерживает 16 приватных команд интерфейса: с SIOCDEVPRIVATE по SIOCDEVPRIVATE+15
hardorsoft
26.10.10 в 04:34
|
|
(обратите внимание, что, согласно <"linux/sockios.h">, команды SIOCDEVPRIVATE не желательны; не ясно чем заменить их, и многие драйверы все еще используют их).
hardorsoft
26.10.10 в 04:37
|
|
При обнаружении одной из этих команд, вызывается dev->do_ioctl для соответствующего интерфейса. Функция получает тот же указатель struct ifreq *, что и универсальная функция ioctl:
hardorsoft
26.10.10 в 04:35
|
|
int (*do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
hardorsoft
26.10.10 в 04:35
|
|
Указатель ifr содержит адрес копии структуры пользователя в пространстве ядра. После вызова do_ioctl, структура копируется обратно в пространство пользователя. Поэтому драйвер может использовать приватные команды, как для отправки, так и для принятия данных.
hardorsoft
26.10.10 в 04:36
|
|
Команды, специфичные устройству, могут использовать поля struct ifreq. Но поля хранят стандартизированные значения, и маловероятно, что драйвер cможет приспособить структуру для своих нужд. Поле ifr_data является указателем caddr_t, который используется в зависимости от специфики устройства. Драйвер и программа, вызвавшая ioctl, должна иметь соглашения об использовании ifr_data. Например, ppp-stats использует специфичные устройству команды, чтобы передать, информацию от драйвера интерфейса ppp.
hardorsoft
26.10.10 в 04:36
|
|
Здесь не показана реализация функции do_ioctl, но приведенная информация и примеры из ядра позволят вам написать ее при необходимости. Имейте ввиду, что реализация plip не корректно использует ifr_data, и не может служить примером реализации ioctl.
hardorsoft
26.10.10 в 04:36
|
|