Поделиться через


Рекомендации по МБ уведомления IP-адресов драйвера Miniport

МБ минипорт драйверов, которые указывают EnableDhcp равно нулю в своих INF-файлах может использовать вспомогательный IP-адрес и связанные функции в режиме ядра для создания, изменения и удаления IP-адреса:

Чтобы использовать вспомогательные функции IP в режиме ядра, драйверы минипорта должны включать файл заголовка Netioapi.h и ссылку на Netio.lib.

Если драйверы минипорта указывают EnableDhcp равным нулю, они необходимы для выполнения следующих операций, чтобы уведомить службу МБ о любом из следующих событий:

  • Настройка IP-адреса для интерфейса МБ

  • Установка адреса шлюза по умолчанию

  • Обновление DNS-адресов

IP-адреса и шлюзы по умолчанию, заданные с помощью вспомогательного API IP-адресов, сохраняют сетевое подключение или события отключения или оба. Таким образом, если новый IP-адрес или шлюз по умолчанию или оба значения отличаются от значений, заданных в данный момент, драйвер мини-порта должен сначала очистить предыдущие значения, прежде чем задавать новые значения в событии сетевого подключения.

Обратите внимание, что драйверы Miniport могут найти LUID и Индекс интерфейса МБ из элементов NetLuid или IfIndex структуры NDIS_MINIPORT_INIT_PARAMETERS, передаваемой функции Miniport Driver MiniportInitializeEx.

Сброс IP-адреса и адреса шлюза

Некоторые изменения в стеке TCP/IP, такие как загрузка обязательного драйвера фильтра, могут удалять IP-адреса и адреса шлюза, заданные вспомогательными функциями IP-адресов. Драйверы мини-порта должны сбрасывать IP-адреса и адреса шлюзов, если изменения в стеке TCP/IP удаляют параметры.

Мини-порты должны использовать следующую процедуру, чтобы получать уведомления при удалении адресов и повторно сбрасывать их.

  1. Во время инициализации драйверов минипорта следует указать функцию обратного вызова для регистрации уведомлений об изменении IP-интерфейса с помощью NotifyIpInterfaceChange. Windows будет вызывать функцию при добавлении, удалении или изменении IP-интерфейса.

  2. Во время инициализации адаптера драйверы минипорта должны сохраняться в контексте локального адаптера минипорта значение LUID из структуры NDIS_MINIPORT_INIT_PARAMETERS, передаваемой в функцию MiniportInitializeEx драйвера miniportInitializeEx. Значение содержит NetLuid, определяющий интерфейс адаптера, который используется в обратном вызове уведомлений.

  3. В обратном вызове уведомлений Windows передает следующие параметры функции уведомлений, зарегистрированной в NotifyIpInterfaceChange:

    • Указатель на структуру MIB_IPINTERFACE_ROW, содержащую NetLuid интерфейса минипорта.
    • Тип уведомления, который может быть MibAddInstance, MibDeleteInstance или MibParameterNotification.

    Драйверы минипорта должны сбрасывать IP-адреса и адреса шлюза, если адаптер находится в подключенном состоянии, а тип уведомления — MibAddInstance, а NetLuid в MIB_IPINTERFACE_ROW соответствует одному из адаптеров драйвера минипорта, который был сохранен во время инициализации адаптера.

    Затем следуйте инструкциям по настройке IP-адреса интерфейса МБ и настройке процедур адресов шлюза по умолчанию, чтобы сбросить соответствующие адреса.

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

Настройка IP-адреса для интерфейса МБ

Чтобы задать IPv4-адрес, используйте следующую процедуру. Для задания IPv6-адреса можно использовать аналогичные вспомогательные функции IP-адресов.

  1. Используйте функцию вспомогательной функции IP-адреса GetUnicastIpAddressTable , чтобы найти все записи IP-адресов в системе.

  2. Для каждой записи, значение InterfaceLuid которой соответствует InterfaceLuid интерфейса МБ:

    1. Найдите запись IP-адреса, соответствующую IP-адресу, используемому в предыдущем подключении. При первом подключении не будет иметь предыдущий IP-адрес.
    2. Если новый IP-адрес отличается от предыдущего IP-адреса, удалите запись IP-адресов для предыдущих IP-адресов с помощью функции Helper IP-адреса DeleteUnicastIpAddressEntry.
    3. Если новый IP-адрес совпадает с предыдущим IP-адресом, убедитесь, что требуемая запись уже существует.
  3. Если минипорт-драйвер не обнаружил нужную запись IP-адреса в предыдущем цикле, он должен добавить новую запись.

    1. Используйте функцию помощника IP InitializeUnicastIpAddressEntry ДЛЯ инициализации структуры MIB_UNICASTIPADDRESS_ROW и задания следующих элементов структуры:

      1. Задайте элементы InterfaceLuid или InterfaceIndex соответствующим образом.
      2. Задайте элемент OnlinePrefixLength. Это число битов, имеющих значение одного в маске подсети. Например, если маска подсети имеет значение 255.255.255.0, Значение OnlinePrefixLength должно иметь значение 24.
      3. Задайте член адреса.
      4. Задайте для элемента PrefixOrigin значение IpPrefixOriginManual.
    2. Передайте инициализированную структуру MIB_UNICASTADDRESS_ROW функции Вспомогательной функции CreateUnicastIpAddressEntry IP, чтобы создать запись IP-адреса.

Задание адреса шлюза по умолчанию

Чтобы задать адрес шлюза IPv4, используйте следующую процедуру. Для задания адреса шлюза IPv6 можно использовать аналогичные вспомогательные функции IP-адресов.

  1. Используйте функцию вспомогательной функции IP-адреса GetIpForwardTable2 , чтобы получить все записи маршрутизации в системе.

  2. Для каждой записи, значение InterfaceLuid которой соответствует значению InterfaceLuid интерфейса МБ и DestinationPrefix равно "0.0.0.0.0/0", вызовите функцию helper IP DeleteIpForwardEntry2, чтобы удалить маршрут, если NextHop не равен новому адресу шлюза. В противном случае запись маршрутизации уже находится в системе.

  3. Если мини-драйвер не обнаружил нужную запись маршрутизации в предыдущем цикле, он должен добавить новую запись с помощью вспомогательной функции InitializeIpForwardEntry IP для инициализации структуры MIB_IPFORWARD_ROW2. Инициализировать следующие элементы структуры:

    InterfaceLuid или InterfaceIndex .

    Задайте для шлюза по умолчанию значение DestinationPrefix 0.0.0.0/0. (префикс = 0.0.0.0 и PrefixLength = 0)

    Задайте для NextHop IP-адрес шлюза по умолчанию.

    Другие члены имеют значения по умолчанию во время инициализации. Драйверы минипорта должны использовать значения по умолчанию для этих элементов.

  4. Передайте структуру MIB_IPFORWARD_ROW2 в функцию Помощника по IP-адресу CreateIpForwardEntry2, чтобы задать новый адрес шлюза по умолчанию.

Установка DNS-адресов

  • Задайте раздел реестра NameServer, как описано в МБ DNS Обновления, чтобы уведомить Windows об обновленных DNS-адресах.