Сетевые интерфейсы и водопроводчики протокола

В этой главе описываются сетевой интерфейс KPI. Этот интерфейс программирования позволяет KEXT присоединять новые сетевые интерфейсы, связываться с и управлять сетевыми интерфейсами и создавать новые виртуальные интерфейсы.

Механизм, рекомендуемый для поддержки новых интерфейсов, зависит от природы интерфейса. Рекомендуемые механизмы:

Эта глава также описывает водопроводчиков протокола. Водопроводчики протокола используются для присоединения сетевых протоколов к интерфейсам.

При создании поддержки интерфейсного типа, который штабель уже не поддерживает (такие как ATM), независимо от того, использует ли KEXT Набор I/O, необходимо зарегистрировать водопроводчиков протокола для присоединения существующих протоколов к новому интерфейсному типу.

Функциональность в сетевом интерфейсе используется и интерфейсным драйвером и стеками протоколов, как показано на рисунке 7-1.

  Сетевые интерфейсы рисунка 7-1 в сетевом стеке
Network Interfaces in the Networking Stack

Обратные вызовы сетевого интерфейса

Ваш сетевой интерфейс должен определить следующие обратные вызовы, которые вызывают протоколы и драйверы:

Хорошие примеры многих из этих функций могут быть найдены в bsd/net/ether_if_module.c в xnu (ядро) исходное дерево.

Установка и удаление сетевых интерфейсов

Следующие функции обычно вызываются (в следующем порядке) для поддержки динамической вставки и демонтажа сетевых интерфейсов:

  1. ifnet_allocate, который выделяет интерфейсную структуру.

  2. ifnet_attach, который присоединяет интерфейс к глобальному интерфейсному списку.

  3. bpfattach, который включает поддержку BPF в (дополнительном) интерфейсе.

  4. ifnet_detach, который удаляет интерфейс из глобального интерфейсного списка.

  5. ifnet_release, который выпускает ссылку на интерфейсную структуру. Если подсчет ссылок достигнет нуля (0), то структура будет освобождена. Этот выпуск соответствует ifnet_allocate вызовите ранее, и должен быть вызван после вызова ifnet_detach.

Связанная функция ifnet_reference может использоваться (обычно другим KEXTs) для увеличения подсчета ссылок интерфейсной структуры. Эти вызовы должны быть сбалансированы равным количеством вызовов к ifnet_release.

Водопроводчики протокола

Водопроводчики протокола, как упомянуто ранее, ответственны за присоединение протокола к сетевому интерфейсу. Когда протокол должен присоединить к интерфейсу, он вызывает функцию, ищущую водопроводчика, назначенного для того протокола и интерфейсного типа, затем вызывающую вертикальный обработчик того водопроводчика.

Водопроводчики протокола определяют следующие обратные вызовы, которые вызывают протоколы:

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

Примеры этих функций могут быть найдены в bsd/net/ether_inet_pr_module.c в xnu (ядро) исходное дерево.

Отправка данных

Следующие шаги описывают процесс отправки пакета, с помощью Ethernet в качестве носителя в качестве примера:

  1. ip_output подпрограмма в вызовах стека протоколов IP ifnet_output.

  2. ifnet_output вызовы функции водопроводчик протокола proto_media_preout функция. В случае IP, это вызовы функции inet_arp_lookup.

  3. Если кэш ARP не содержит запись для IP-адреса, inet_arp_lookup тогда вызывает водопроводчика протокола proto_media_send_arp обратный вызов для разрешения целевого IP-адреса в адрес управления доступом к среде (MAC).

  4. Когда proto_media_preout возвраты обратного вызова, ifnet_output вызовы функции сетевой интерфейс ifnet_framer_func функция. Эта функция структурирования предварительно ожидает интерфейсно-специфичные данные кадра к пакету.

  5. Если какие-либо интерфейсные фильтры присутствуют, их iff_output_func обратные вызовы вызывают последовательно.

  6. ifnet_output вызовы функции сетевой интерфейс ifnet_output_func обратный вызов, передающий пакет и освобождающий mbuf.

Получение данных

Следующие шаги описывают процесс получения пакета:

  1. Драйвер оборудования или его поддержка кодируют вызовы ifnet_input с указателями на ifnet структура (ifnet_t) и mbuf цепочка (mbuf_t).

  2. Пакет ставится в очередь. Обработка резюме на различном потоке.

  3. ifnet_input вызовы функции сетевой интерфейс ifnet_demux_func функция для интерфейса.

  4. Функция демультиплексирования идентифицирует кадр и возвращает a protocol_family_t значение для указания, какой протокол должен обработать пакет.

  5. ifnet_input вызовы функции присоединенные интерфейсные фильтры (если таковые имеются) последовательно.

  6. Любые пакеты, не соответствующие присоединенный протокол, отбрасываются, как любые разнородные пакеты.

  7. ifnet_input вызовы функции водопроводчик протокола proto_media_input функция. Водопроводчик является определенным для данной комбинации протокола/интерфейса.