Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 17.3. Подробная структура net_device

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

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

17.3. Подробная структура net_device

hardorsoft 26.10.10 в 01:38

0

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

hardorsoft 26.10.10 в 01:39

0

17.3.1. Основная информация

hardorsoft 26.10.10 в 01:39

0

Первая часть структуры net_device состоит из следующих полей:

hardorsoft 26.10.10 в 01:39

0

char name[IFNAMSIZ];

hardorsoft 26.10.10 в 01:39

0

Имя устройства. Если имя содержит в себе строку %d.
register_netdev, для получения уникального имени, заменяет ее на
число, начиная с номера 0.

hardorsoft 26.10.10 в 01:39

0

unsigned long state;

hardorsoft 26.10.10 в 01:40

0

Состояние устройства. Состоит из нескольких флагов. Драйвер
обычно не работает с флагами напрямую. Для этого
предоставляются функции. Эти функции будут кратко рассмотрены,
при изучении операций драйвера.

hardorsoft 26.10.10 в 01:40

0

struct net_device *next;

hardorsoft 26.10.10 в 01:40

0

Указатель на следующее устройство в глобальном списке. Это поле
не должно затрагиваться драйвером.

hardorsoft 26.10.10 в 01:40

0

int (*init)(struct net_device *dev);

hardorsoft 26.10.10 в 01:40

0

Функция инициализации. Если этот указатель определен, функция
вызывается из register_netdev, для окончательной инициализации
структуры net_device. В настоящее время, драйверу не следует
использовать эту функцию, а выполнять инициализацию до
регистрации интерфейса.

hardorsoft 26.10.10 в 01:40

0

17.3.2. Аппаратная информация

hardorsoft 26.10.10 в 01:41

0

Приведенные здесь поля, содержат низкоуровневую аппаратную
информацию для относительно простых устройств. Это наследие ранних
Linux-сетей. Многие современные драйверы используют их (с возможным
исключением if_port). Приведем список полей:

hardorsoft 26.10.10 в 01:41

0

unsigned long rmem_end;
unsigned long rmem_start;
unsigned long mem_end;
unsigned long mem_start;

hardorsoft 26.10.10 в 01:41

0

Эти поля указывают на начало и конец памяти, используемой
устройством. Если устройство использует различные области
памяти для приема и передачи, то mem- это поля используемые для
передачи, а rmem- для приема. Поля rmem никогда не должно
ссылаться за пределы памяти принадлежащей драйверу. По
соглашению, -end поля указывают на конец, а -start поля – на
начало доступной встроенной памяти.

hardorsoft 26.10.10 в 01:41

0

unsigned long base_addr;

hardorsoft 26.10.10 в 01:42

0

Базовые адреса ввода-вывода сетевого интерфейса. Это поле
подобно предыдущему, но устанавливается драйвером при
тестировании устройства. Команда ifconfig может быть использована для просмотра и изменения текущего значения поля.
base_addr может задаваться из командной строки при загрузке
системы (через netdev = <параметр>), или во время загрузки
модуля. Поля работы с памятью, подобные описанным выше, не
используются ядром.

hardorsoft 26.10.10 в 01:42

0

unsigned char irq;

hardorsoft 26.10.10 в 01:42

0

Назначает номер прерывания. Значение dev->irq выводится
ifconfig, после регистрации интерфейсов. Это значение обычно
устанавливается при загрузке системы или модуля, и
модифицироваться посредством ifconfig.

hardorsoft 26.10.10 в 01:42

0

unsigned char if_port;

hardorsoft 26.10.10 в 01:42

0

Порт используемый в многопортовом устройстве. Например, это
поле используется устройствами поддерживающими два
коннектора ethernet: коаксиальный (IF_PORT_10BASE2) и витую пару
(IF_PORT_100BASET). Поле заполняется типом порта, который
определен в файле <linux></linux>netdevice.h>.

hardorsoft 26.10.10 в 01:43

0

unsigned char dma;

hardorsoft 26.10.10 в 01:43

0

Канал ПДП выделенный устройству. Поле считывается только с
какой-либо периферийной шины, такой как ISA. Не используется за
пределами драйвера устройства, кроме как для информационных
целей (в ifconfig).

hardorsoft 26.10.10 в 01:43

0

17.3.3. Информация интерфейса

hardorsoft 26.10.10 в 01:44

0

Большая часть информации об интерфейсе корректно
устанавливается функцией ether_setup (или другой функцией
подходящей для имеющегося типа аппаратуры). При использовании
Ethernet-карт, можно доверить этим универсальным функциям,
настройку большинства полей. Но поля flags и dev_addr специфичны и
должны определятся при инициализации.

hardorsoft 26.10.10 в 01:45

0

Не Ethernet-интерфейсы могут использовать вспомогательные
функции похожие на ether_setup. Файл <drivers></drivers>net/net_init.c>
экспортирует несколько таких функций, включая следующие:

hardorsoft 26.10.10 в 01:45

0

Не Ethernet-интерфейсы могут использовать вспомогательные
функции похожие на ether_setup. Файл <drivers></drivers>net/net_init.c>
экспортирует несколько таких функций, включая следующие:

hardorsoft 26.10.10 в 01:45

0

Настройка полей для устройств LocalTalk.

hardorsoft 26.10.10 в 01:45

0

void fc_setup(struct net_device *dev);

hardorsoft 26.10.10 в 01:45

0

Инициализация полей для оптоволоконных устройств.

hardorsoft 26.10.10 в 01:45

0

void fddi_setup(struct net_device *dev);

hardorsoft 26.10.10 в 01:46

0

Конфигурирование интерфейса для FDDI (Fiber Distributed Data
Interface - интерфейс для передачи распределённых данных по
волоконно-оптическим каналам) сетей.

hardorsoft 26.10.10 в 01:46

0

void hippi_setup(struct net_device *dev);

hardorsoft 26.10.10 в 01:46

0

Готовит поля для драйвера HIPPI (High-Performance Parallel Interface
- высокоскоростной параллельный интерфейс).

hardorsoft 26.10.10 в 01:46

0

void tr_setup(struct net_device *dev);

hardorsoft 26.10.10 в 01:46

0

Настройка для интерфейса сетевых
доступом (token ring).

hardorsoft 26.10.10 в 01:47

0

Эти классы охватывают большинство устройств. Если у вас есть что-
то еще, радикально новое и отличающееся, то вы должны в ручную
назначить следующие поля:

hardorsoft 26.10.10 в 01:50

0

unsigned short hard_header_len;

hardorsoft 26.10.10 в 01:50

0

Длинна аппаратного заголовка, количество октет в передаваемом
пакете до IP заголовка, или другая информация протокола. Для
Ethernet-интерфейсов hard_header_len = 14 (ETH_HLEN).

hardorsoft 26.10.10 в 01:50

0

unsigned mtu;

hardorsoft 26.10.10 в 01:50

0

Максимальный блок для передачи (MTU - Maximum Transfer Unit).
Это поле используется сетевым уровнем для управления передачей
пакетов. Для Ethernet MTU = 1500 октет (ETH_DATA_LEN). Это
значение может быть изменено с помощью ifconfig.

hardorsoft 26.10.10 в 01:51

0

unsigned long tx_queue_len;

hardorsoft 26.10.10 в 01:51

0

Максимальное количество фреймов, которые могут находиться в
очереди устройства на передачу. ether_setup устанавлиает это
значение равным 1000, но вы можете изменить его. Например, plip
использует 10, чтобы не расходовать системную память (plip имеет
меньшую производительность, чем настоящий интерфейс Ethernet).

hardorsoft 26.10.10 в 01:51

0

Максимальное количество фреймов, которые могут находиться в
очереди устройства на передачу. ether_setup устанавлиает это
значение равным 1000, но вы можете изменить его. Например, plip
использует 10, чтобы не расходовать системную память (plip имеет
меньшую производительность, чем настоящий интерфейс Ethernet).

hardorsoft 26.10.10 в 01:51

0

unsigned short type;

hardorsoft 26.10.10 в 01:51

0

Тип аппаратного интерфейса. Поле используется ARP для
определения, какое семейство аппаратной адресации
поддерживается интерфейсом. Для интерфейса Ethernet характерно
значение ARPHRD_ETHER, оно устанавливается в ether_setup.
Доступные типы определены в <linux></linux>if_arp.h>.

hardorsoft 26.10.10 в 01:51

0

unsigned char addr_len;
unsigned char broadcast[MAX_ADDR_LEN];
unsigned char dev_addr[MAX_ADDR_LEN];

hardorsoft 26.10.10 в 01:51

0

Длина аппаратного (MAC) адреса и аппаратный адрес устройства.
Длина адреса Ethernet составляет шесть октет (мы имеем ввиду
аппаратный ID интерфейса платы). И широковещательный адрес,
состоящий из шести октет 0xFF. ether_setup корректно определяет
значения этих полей. С другой стороны, MAC адрес должен быть
прочитан из самого устройства, и скопирован драйвером в dev_addr.
Аппаратный адрес используется для генерации корректного
заголовка Ethernet перед отправкой. Устройства snull не
используют физический интерфейс, и поэтому создается свой
аппаратный адрес.

hardorsoft 26.10.10 в 01:52

0

unsigned short flags;
int features;

hardorsoft 26.10.10 в 01:52

0

Флаги интерфейса (описаны ниже).

hardorsoft 26.10.10 в 01:52

0
Минутку...

Следующая страница →