Рассматриваются общие принципы взаимодействия сетевой подсистемы с драйвером devnp
Сетевая подсистема состоит из:
- Сетевого контроллера. Они бывают разного исполнения: IP ядро в SoC, PCI адаптер, USB адаптер.
- Сетевого драйвера. Библиотека, которая управляет сетевым контроллером и имплементирует API io-pkt-*.
- Сетевого менеджера io-pkt-*.
- Клиентского приложения. Конечное приложение, работающее с сокетами.
Имеет следующее представление:
+----------------------------+ +----------------------------+
| | | |
| | | |
| io-pkt-* -------- Клиентское приложение |
| | | |
| | | |
+--------------|-------------+ +----------------------------+
|
|
+--------------|-------------+
| |
| |
| devnp-eth.so |
| |
| |
+--------------|-------------+
|
|
+--------------|-------------+
| |
| |
| Сетевой контроллер |
| |
| |
+----------------------------+
При настройке и работе драйвер devnp использует следующие API:
- API io-pkt-* - регистрация драйвера, обработчики прерывания, периодические таймеры.
- API IF - настройка медиа режимов, API приёма-передачи.
- API pci-server - настройка сетевого контроллера на PCI-шине.
- API platform-control - управление тактированием и сбросом сетевого контролера (для SoC драйвера).
- API ioctl/devctl - динамическое управление сетевым интерфейсом (например с помощью ifconfig).
- libcache - библиотека для управления когерентностью кэша процессора.
- libnetdrvr - библиотека, содержащая API MDI (упрощённое управление PHY), API NIC (nicinfo, статистика nic).
- Драйвер подключается к сетевому стеку при помощи макроса CFATTACH_DECL() и точки входа IOPKT_DRVR_ENTRY_SYM_INIT().
- Реализует callback-функции сетевого стека
- device_entry - отвечает за базовую однократную инициализацию. Парсинг строки параметров, также поиск сетевых адаптеров на PCI шине и вызов device_attach для каждого из них.
- device_attach - отвечает за заполнение структур, маппирование периферии, инициализацию периферии и PHY, инициализацию колец дескрипторов, регистрацию остальных коллбеков io-pkt.
- device_init - отвечает за включение приёмо/передачи. Вызывается при ifconfig up интерфейса. Устанавливает флаги, указывающие на включение приёмо/передачи, запускает MAC уровень, в некоторых реализациях инициализирует кольца дескрипторов. Подключает обработчики прерываний.
- device_start - отвечает за передачу. Вызывается стеком, когда необходимо передать пакет. Подготавливает дескриптор к передаче пакета.
- device_ioctl - отвечает за ioctl вызовы. Необходим для настройки медиастатусов и режимов работы устройства с помощью ifconfig. Также копирование структуры при вызове nicinfo.
- device_stop - отвечает за отключение приёмо/передачи. Вызывается при ifconfig down интерфейса. Устанавливает флаги, указывающие на отключение приёмо/передачи, останавливает MAC уровень, в некоторых реализациях очищает кольца дескрипторов. Отсоединяет обработчики прерываний.
- device_detach - отвечает за отсоединение драйвера от стека. Вызывается при ifconfig destroy интерфейса. Отключает устройство, полностью освобождает ресурсы.
- device_shutdown - отвечает за аварийное завершение работы драйвера. Вызывается при каком-либо завершающем сигнале, например
SIGSEGV
.
- Подключает обработчики прерываний. Обработчик прерывания используется для: приёма/отправки пакетов; сигнализации об изменении состояние соединения (link); сигнализации об ошибках в работе MAC/PHY; и другого.
Предыдущий раздел: Библиотека разработки сетевых драйверов