I/O Сетевая семья API
Сетевая семья определяет платформу для создания драйверов сетевых контроллеров. Это включает суперклассы для сетевых драйверов, передающих сетевые пакеты и от оборудования контроллеров, и для сетевых интерфейсов, служащих кусками, подключающими сетевой стек BSD к драйверу. Запись драйвера включает создание подкласса надлежащего суперкласса для драйвера контроллера. Сетевая семья в настоящее время поддерживает контроллеры Ethernet с абстрактным суперклассом для драйверов контроллера и конкретным интерфейсным классом. Также возможно добавить поддержку новых типов контроллера, таких как кольцо с маркерным доступом или FDDI, путем создания новых классов для драйверов и интерфейсов.
Сетевой драйвер является провайдером в сетевой семье, но это - также клиент любой шины подключения физического устройства к. Драйвер Ethernet CDC, например, использует кусок IOUSBDevice для соединения с Шиной USB. Для получения информации о клиентской установке см. документ, подходящий для того устройства.
Сетевая архитектура семьи
Сетевая семья включает небольшую группу базового драйвера и классов куска, вместе с узлом классов помощника и утилиты. Рисунок 2-1 показывает иерархию наследования для сетевой семьи. Основными классами драйвера является IONetworkController, который является суперклассом для любого вида сетевого драйвера и IOEthernetController, который является суперклассом для драйвера контроллера Ethernet. Объект сетевого контроллера публикует кусок, формирующий интерфейс между драйвером и Уровнем Интерфейса Канала передачи данных BSD или DLIL. Суперкласс для сетевого интерфейса, IONetworkInterface; класс IOEthernetInterface определяет интерфейс для контроллеров Ethernet. Вы создаете новый интерфейсный класс при расширении сетевой семьи для добавления поддержки нового сетевого аппаратного протокола, такого как FDDI.

Остающиеся классы являются главным образом помощниками или менеджерами данных для сетевого контроллера и интерфейсных объектов. Объект IONetworkStack подключает объект сетевого интерфейса к сетевому стеку BSD. Различные классы IOMBufMemoryCursor работают как классы IOMemoryCursor, используемые в остальной части Набора I/O, но на BSD mbuf_t структуры, а не на объектах IOMemoryDescriptor. IONetworkMedium описывает физический носитель ссылки аппаратных средств. IOOutputQueue и его подклассы, вместе с IOPacketQueue, выполняют пакетную организацию очередей для объектов сетевого контроллера. IONetworkData используется для содержания стандарта C структуры, используемые сетевым уровнем BSD так, чтобы драйвер Набора I/O мог получить доступ к ним.
Несколько других классов менее относятся к большинству сетевых драйверов. Когда компьютер отлаживается через Kernel Debugger Protocol (KDP), объект IOKernelDebugger используется вместо объекта сетевого интерфейса. Драйверы для встроенных сетевых контроллеров на компьютерах Macintosh включают поддержку KDP; сторонние драйверы редко должны поддерживать его. Объект IONetworkUserClient предоставляет прямой доступ программ пространства пользователя к сетевым службам. Так как сетевые службы обычно делаются доступными для целой системы, этот класс имеет также менее соответствующие для сторонних сетевых драйверов.
Драйвер в сетевой семье является подклассом абстрактного класса IONetworkController, обычно через промежуточный специфичный для протокола класс, такой как IOEthernetController. Рисунок 2-2 показывает упрощенное представление штабеля IORegistry для драйвера Ethernet. В этом числе драйвер является клиентом семьи, представляющей шину, которую плата контроллера использует, и провайдер к объекту сетевого интерфейса. Таким же образом как IONetworkController, IONetworkInterface является абстрактным суперклассом для интерфейсов с подклассами для определенных сетевых протоколов.

Объект сетевого интерфейса представляет универсальный интерфейс данному сетевому протоколу. В его роли провайдера это предлагает независящий от устройств сетевой интерфейс операционной системе, и в его роли клиента это полагается на драйвер для реализации его служб. Сетевая семья в настоящее время включает интерфейсный класс объекта для протокола Ethernet. Возможно добавить поддержку других протоколов путем создания новых подклассов абстрактного контроллера и интерфейсных классов.
Выше сетевого интерфейса уровень интерфейса канала передачи данных (DLIL) BSD. Интерфейсный объект представляет себя DLIL как стандартный интерфейс netif-стиля BSD, обеспечивая надлежащие обратные вызовы и вызов подпрограммы DLIL для обработки сетевого трафика. Драйверы не взаимодействуют с DLIL, но интерфейсы делают. При расширении сетевой семьи для добавления поддержки нового аппаратного протокола, необходимо будет взаимодействовать через интерфейс с DLIL. См. “Сетевое Руководство по программированию Расширений ядра” для получения дополнительной информации.

Сам драйвер использует несколько других классов и структур, определенных сетевой семьей и Набором I/O в целом. Они показаны на рисунке 2-3, представляющем более полное изображение того, как сетевой драйвер взаимодействует с этими объектами. Класс IOOutputQueue определяет абстрактный интерфейс для организации очередей пакетов, которые будут переданы; подклассы обеспечивают различные механизмы блокировки и синхронизации. Объекты IOMBufMemoryCursor помогают драйверу управлять BSD mbuf_t структуры, здание рассеивается/собирает списки и объединяющие буферы по мере необходимости. Объекты IONetworkMedium описывают физические носители ссылки аппаратных средств. Драйвер может собрать статистические данные с помощью двух структур, сохраняемых сетевым интерфейсом, IONetworkStats и специфичной для протокола структурой, в этом случае IOEthernetStats. Поскольку драйвер, обрабатывающий прерывания, сетевой драйвер обычно, создает свой собственный объект IOWorkLoop. Объект IONetworkStack модерирует регистрацию и deregistration интерфейсов, присваивая уникальные имена как ожидалось BSD (такой как en0) и выполнение другого netif бухгалтерского учета.
Запись Драйвера для Контроллера Ethernet описывает, как установить эти структуры для Вашего сетевого драйвера.