Рекомендации по МБ уведомления 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 удаляют параметры.
Мини-порты должны использовать следующую процедуру, чтобы получать уведомления при удалении адресов и повторно сбрасывать их.
Во время инициализации драйверов минипорта следует указать функцию обратного вызова для регистрации уведомлений об изменении IP-интерфейса с помощью NotifyIpInterfaceChange. Windows будет вызывать функцию при добавлении, удалении или изменении IP-интерфейса.
Во время инициализации адаптера драйверы минипорта должны сохраняться в контексте локального адаптера минипорта значение LUID из структуры NDIS_MINIPORT_INIT_PARAMETERS, передаваемой в функцию MiniportInitializeEx драйвера miniportInitializeEx. Значение содержит NetLuid, определяющий интерфейс адаптера, который используется в обратном вызове уведомлений.
В обратном вызове уведомлений Windows передает следующие параметры функции уведомлений, зарегистрированной в NotifyIpInterfaceChange:
- Указатель на структуру MIB_IPINTERFACE_ROW, содержащую NetLuid интерфейса минипорта.
- Тип уведомления, который может быть MibAddInstance, MibDeleteInstance или MibParameterNotification.
Драйверы минипорта должны сбрасывать IP-адреса и адреса шлюза, если адаптер находится в подключенном состоянии, а тип уведомления — MibAddInstance, а NetLuid в MIB_IPINTERFACE_ROW соответствует одному из адаптеров драйвера минипорта, который был сохранен во время инициализации адаптера.
Затем следуйте инструкциям по настройке IP-адреса интерфейса МБ и настройке процедур адресов шлюза по умолчанию, чтобы сбросить соответствующие адреса.
Во время выгрузки драйвера минипорт драйверы должны отменить регистрацию функции обратного вызова уведомлений с помощью вспомогательной функции IP-адреса CancelMibChangeNotify2.
Настройка IP-адреса для интерфейса МБ
Чтобы задать IPv4-адрес, используйте следующую процедуру. Для задания IPv6-адреса можно использовать аналогичные вспомогательные функции IP-адресов.
Используйте функцию вспомогательной функции IP-адреса GetUnicastIpAddressTable , чтобы найти все записи IP-адресов в системе.
Для каждой записи, значение InterfaceLuid которой соответствует InterfaceLuid интерфейса МБ:
- Найдите запись IP-адреса, соответствующую IP-адресу, используемому в предыдущем подключении. При первом подключении не будет иметь предыдущий IP-адрес.
- Если новый IP-адрес отличается от предыдущего IP-адреса, удалите запись IP-адресов для предыдущих IP-адресов с помощью функции Helper IP-адреса DeleteUnicastIpAddressEntry.
- Если новый IP-адрес совпадает с предыдущим IP-адресом, убедитесь, что требуемая запись уже существует.
Если минипорт-драйвер не обнаружил нужную запись IP-адреса в предыдущем цикле, он должен добавить новую запись.
Используйте функцию помощника IP InitializeUnicastIpAddressEntry ДЛЯ инициализации структуры MIB_UNICASTIPADDRESS_ROW и задания следующих элементов структуры:
- Задайте элементы InterfaceLuid или InterfaceIndex соответствующим образом.
- Задайте элемент OnlinePrefixLength. Это число битов, имеющих значение одного в маске подсети. Например, если маска подсети имеет значение 255.255.255.0, Значение OnlinePrefixLength должно иметь значение 24.
- Задайте член адреса.
- Задайте для элемента PrefixOrigin значение IpPrefixOriginManual.
Передайте инициализированную структуру MIB_UNICASTADDRESS_ROW функции Вспомогательной функции CreateUnicastIpAddressEntry IP, чтобы создать запись IP-адреса.
Задание адреса шлюза по умолчанию
Чтобы задать адрес шлюза IPv4, используйте следующую процедуру. Для задания адреса шлюза IPv6 можно использовать аналогичные вспомогательные функции IP-адресов.
Используйте функцию вспомогательной функции IP-адреса GetIpForwardTable2 , чтобы получить все записи маршрутизации в системе.
Для каждой записи, значение InterfaceLuid которой соответствует значению InterfaceLuid интерфейса МБ и DestinationPrefix равно "0.0.0.0.0/0", вызовите функцию helper IP DeleteIpForwardEntry2, чтобы удалить маршрут, если NextHop не равен новому адресу шлюза. В противном случае запись маршрутизации уже находится в системе.
Если мини-драйвер не обнаружил нужную запись маршрутизации в предыдущем цикле, он должен добавить новую запись с помощью вспомогательной функции InitializeIpForwardEntry IP для инициализации структуры MIB_IPFORWARD_ROW2. Инициализировать следующие элементы структуры:
InterfaceLuid или InterfaceIndex .
Задайте для шлюза по умолчанию значение DestinationPrefix 0.0.0.0/0. (префикс = 0.0.0.0 и PrefixLength = 0)
Задайте для NextHop IP-адрес шлюза по умолчанию.
Другие члены имеют значения по умолчанию во время инициализации. Драйверы минипорта должны использовать значения по умолчанию для этих элементов.
Передайте структуру MIB_IPFORWARD_ROW2 в функцию Помощника по IP-адресу CreateIpForwardEntry2, чтобы задать новый адрес шлюза по умолчанию.
Установка DNS-адресов
- Задайте раздел реестра NameServer, как описано в МБ DNS Обновления, чтобы уведомить Windows об обновленных DNS-адресах.