![image](https://habrastorage.org/getpro/habr/post_images/04a/552/543/04a5525431045b912c3868a8509013d8.jpg)
На днях нашей компании исполняется 20 лет. Последние 15 лет из этих 20 мы делаем программы для анализа Wi-Fi-сетей. Часть этой работы – разработка драйверов для Wi-Fi-адаптеров, и в этой статье я расскажу, как команда разработчиков тестирует продукты своего труда, и как процесс тестирования эволюционировал за эти 15 лет вместе с эволюцией стандартов и адаптеров. Будет много картинок (то, что называют «geek porn») и технических подробностей.
Зачем вообще писать специальные драйверы?
Когда вы делаете софт для анализа сетей Wi-Fi (а мы делаем программу для инспектирования и моделирования сетей и анализатор пакетов Wi-Fi), вам нужно каким-то образом получать (читать, захватывать, сниффить, ловить… — всё это синонимы) пакеты Wi-Fi, которыми обмениваются близлежащие точки доступа и клиенты. Сделать это под Windows можно, только создав набор своих собственных драйверов для определенных чипсетов.
Что же не так с обычными стандартными драйверами, которые делает производитель адаптера? С точки зрения обычного пользователя, с ними всё хорошо. Есть только маленькая проблема – вы не можете его использовать для чтения Wi-Fi пакетов в режиме пассивного наблюдателя. А без этого вы не можете создать софт для анализа сетей. Вообще, это большая тема для отдельной статьи (и я ее напишу в этом году). Если вам интересно прямо сейчас, то я расскажу кратко в следующем абзаце, а если тема программирования вам не близка, просто пропустите его.
Лет десять назад под Windows появился новый API для пассивного чтения Wi-Fi пакетов, так называемый monitor mode. «Сниффить» пакеты на Windows можно было всегда, и никто не мешает вам запустить Wireshark и видеть пакеты, идущие через ваш беспроводный адаптер, но проблема в том, что вы увидите только свои пакеты и только дата-пакеты. Вся остальная информация (чужие пакеты, пакеты типа Beacon, информация по уровню сигнала в пакете и его дата-рейту, и т.п.) недоступна. Новый API был призван решить этот вопрос раз и навсегда. Но не решил: его не поддерживает нормально почти ни один чипсет основных вендоров, а сам API устарел еще в момент рождения и не развивается Microsoft. Короче говоря, с ним полная катастрофа. И если вы наткнулись на софт для анализа сетей Wi-Fi под Windows, продавцы которого утверждают, что он поддерживает любые или почти любые адаптеры Wi-Fi и не требует замены драйверов – вам точно впаривают то, что называется по-английски snake oil.
Писать специальные драйверы для мониторинга Wi-Fi сложно, долго и дорого. Количество компаний, которые занимаются этим, можно посчитать, используя пальцы одной руки.
Зачем тестировать связку адаптер-драйвер
Драйвер – это программа для взаимодействия с hardware (железом), специфичная для конкретного hardware. В процессе разработки драйвера программист должен убедиться, что драйвер корректно ловит пакеты, переключает частотные каналы и диапазоны, корректно реагирует на hibernate системы, верно подсчитывает уровни сигнала, и делает еще массу вещей, без которых невозможно анализировать Wi-Fi сеть.
Казалось бы, это довольно понятная и простая задача: воткнул адаптер в компьютер, а дальше разрабатывай и тестируй свой драйвер, сколько хочешь. В реальности, есть масса нюансов, о которых мы и расскажем.
Какой должна быть платформа для тестирования
Чтобы технологично тестировать драйверы, нужен некий test bed, то есть платформа для работы с разнообразным железом, которая должна соответствовать нескольким требованиям:
- Простое отключение одного и подключение другого адаптера.
- Возможность подключения к современным компьютерным интерфейсам.
- Низкие помехи от электронных компонентов.
- Мобильность. В процессе тестирования нужно иметь возможность перемещать Wi-Fi адаптер, меняя ориентацию его антенн в пространстве и меняя дистанцию до точки доступа (иначе вы не сможете нормально откалибровать уровень сигнала).
- Возможность подключения нескольких адаптеров одновременно (для USB).
Кроме того, бывает крайне полезно посмотреть, как работает стандартный драйвер, т.е. увидеть общение драйвера адаптера с компьютером на уровне шины, но мы оставим пока эту тему в стороне.
Археология и современность
Теперь пришло время рассказа непосредственно про железо. Вспомним былое, местами весьма древнее, и обсудим новое.
2003
Мы начали заниматься софтом для Wi-Fi в 2003 году (до этого мы делали софт только для проводных сетей). Начало нулевых был временем, когда Wi-Fi только-только начинал свой путь. Первый из семьи стандартов, 802.11, был принят еще в 1997 году. За ним последовали 802.11b и 802.11а в 1999, но в массы технология пошла значительно позже. Большинство ноутбуков продавались без встроенного Wi-Fi, но к ним можно было самостоятельно купить адаптеры: внешние, подключаемые к порту CardBus (PCMCIA) для ноутбуков, либо внутренние стандарта PCI. Небольшая часть high-end ноутбуков продавалась и со встроенными адаптерами miniPCI.
Нашим первым шагом была поддержка CardBus-адаптеров 802.11b. То были благословенные времена: почти все такие адаптеры были на чипсете Prism компании Intersil, сорс-код драйвера был доступен бесплатно для всех после подписания NDA, а максимальная скорость передачи данных на физическом уровне составляла 11 Mbps, т.е. реально можно было передавать данные со скоростью не более 1 мегабайта в секунду в идеальных условиях.
![Wi-Fi-адаптер CardBus с внешним антеннами](https://habrastorage.org/getpro/habr/post_images/c36/037/972/c360379722539d76be7be6ccf198cb67.jpg)
Wi-Fi-адаптер CardBus с внешним антеннами
Надо сказать, что адаптеры неплохо работали, имели хорошую чувствительность, особенно если была возможность подключения внешних антенн. С платформой для тестирования было тоже всё очень просто и безальтернативно: почти все ноутбуки имели один или два порта CardBus.
![Старинный ноутбук с портами PCMCIA](https://habrastorage.org/getpro/habr/post_images/cff/822/102/cff8221022fa8323fb5d05e77fc70a5a.jpg)
Вы еще помните этих мамонтов по 3-4 килограмма?
Все, что нам оставалось – вставить адаптер в такой внешний порт.
![Адаптер CardBus и соответствующий слот древней машины](https://habrastorage.org/getpro/habr/post_images/523/9b8/caf/5239b8caf0bdc4732236f235d1d32764.jpg)
Адаптер CardBus и соответствующий слот древней машины
2007
На смену далеко не миниатюрным CardBus-адаптерам приходит более изящный стандарт ExpressCard на шине PCI Express. На рынке появляются 34-миллиметровые ExpressCard-адаптеры Wi-Fi, причем уже 802.11g и 802.11a. Скорости растут, применяются новые схемы модуляции.
![Wi-Fi-адаптеры ExpressCard](https://habrastorage.org/getpro/habr/post_images/36a/89f/df8/36a89fdf8814480adbe8f64669896a83.jpg)
Wi-Fi-адаптеры ExpressCard
ExpressCard, как и CardBus, вполне удобен для тестирования. Карты легко менять, ноутбуки мобильны, на рынке нет недостатка в моделях с портами ExpressCard.
Десктопы тоже не стоят на месте, в 2007 принят стандарт PCI Express 2.0, так что внутри десктопов уже часто появляются PCIe-адаптеры с внешними антеннами. Их тестировать не так удобно (снять крышку корпуса, заменить PCIe-адаптер, вернуть всё на место).
2010
Мы начинаем поддержку Wi-Fi-адаптеров USB 2.0. Это очень удобный форм-фактор как для тестирования, так и для использования конечными пользователями. Всё, что нужно – порт USB, или несколько портов, если вы используете несколько адаптеров.
На арену выходит легендарный адаптер Proxim ORiNOCO 8494 стандарта 802.11n, основанный на чипсете производства Atheros Communications, тогда еще не поглощённой Qualcomm. Этот адаптер использовали все профессиональные программы для Wi-Fi site surveys. У него отличная чувствительность.
![Легендарный USB-адаптер Proxim ORiNOCO 8494](https://habrastorage.org/getpro/habr/post_images/135/2fc/823/1352fc8231e1c267d517d0ff162f3e9e.jpg)
Легендарный USB-адаптер Proxim ORiNOCO 8494
Возможность подключить сразу несколько адаптеров – большой плюс, это ускоряет время сканирования каналов, если речь идет о программах для site survey, и позволяет, например, анализировать поведение клиентов при роуминге, если речь идёт о пакетных анализаторах.
Тем не менее, не стоит забывать, что типичный USB-адаптер Wi-Fi потребляет от 200 до 300 mA, и если вы используете пассивный USB-хаб, воткнув в него три адаптера, то вы легко можете выйти за предельные для USB 2.0 500 mA.
![Измеритель PortaPow для определения потребляемого адаптером тока](https://habrastorage.org/getpro/habr/post_images/478/612/3e2/4786123e2fac160a40ca5e671466429b.jpg)
Измеритель PortaPow для определения потребляемого адаптером тока
Радиочастотных помех от хабов USB 2.0 практически нет, и, помимо вопроса о потребляемом токе, единственное, о чем вам надо позаботиться – это расположение портов на хабе. Порты должны быть расположены так, чтобы в соседние порты можно было вставить адаптеры одновременно (если порты расположены слишком близко, вставить адаптеры просто не получится).
Следующей проблемой в 2010 году для нас стало появление адаптеров MiniPCIe, которые пришли на смену MiniPCI в ноутбуках. Начали мы с того, что разбирали ноутбуки, чтобы протестировать новый адаптер. Какая это была боль – рассказывать, наверное, не надо. Замена адаптера в ноутбуке – это небыстрый и нудный процесс, причем можно наткнуться на много подводных камней. Во-первых, если в «родном» адаптере ноутбука стоял адаптер с двумя антеннами, а нам хотелось протестировать модель с тремя антеннами, нормального решения не было. Во-вторых, часть производителей ноутбуков занимается откровенным вредительством, жестко прошивая в BIOS те модели адаптеров, которые ноутбук поддерживает. И если новый адаптер не попадает в такой white list, то он просто не распознается. В-третьих, вам может просто не повезти, и вы что-нибудь сломаете внутри.
В какой-то момент нам пришлось использовать десктопы с платой-переходником PCIe <-> MiniPCIe. Но решение это не было идеальным: мобильность устройства всё же важна. Идеальное же решение нашлось у тайваньских ребят из фирмы Bplus Technology, которые, среди большого ассортимента очень интересных отладочных решений, предлагали вот такую прекрасную плату:
![Плата для тестирования с разъемом MiniPCIe](https://habrastorage.org/getpro/habr/post_images/7a5/2dd/961/7a52dd96106117a846ccf5e4da107d0a.jpg)
Плата для тестирования с разъемом MiniPCIe, подключаемая через адаптер ExpressCard
Эта плата стала просто спасением на много лет. Test bed получился великолепным: адаптеры можно менять в два счета, сохранена мобильность, помех нет, а сама плата стоит совсем недорого. Всё что нужно – ноутбук со слотом ExpressCard, но в те годы это не было проблемой.
![Плата в подключенном состоянии](https://habrastorage.org/getpro/habr/post_images/949/d13/621/949d13621f5becd7717dc8a7767482d5.jpg)
Плата в подключенном состоянии, адаптер ExpressCard вставлен в ноутбук
2013
К 2013 году Wi-Fi полностью завоевал мир. Все ноутбуки поголовно оснащены интегрированными модулями Wi-Fi, и эти модули, на волне всеобщей миниатюризации, начинают выпускаться в новом форм-факторе, M.2 (он же NGFF). Карты M.2 меньше привычных MiniPCIe и имеют другой разъем.
![Плата с разъемом MiniPCIe, модуль MiniPCIe, модуль M.2](https://habrastorage.org/getpro/habr/post_images/322/981/7d4/3229817d445538d87e4fa5627317bf91.jpg)
Плата с разъемом MiniPCIe, модуль MiniPCIe, модуль M.2
Очень хочется продолжить использование нашего прекрасного комплекта для тестирования, и Bplus Technologies снова приходит на помощь. Они выпускают переходник MiniPCIe <-> M.2, и мы легко делаем вот такой толстый бутерброд:
![«Бутерброд» из платы MiniPCIe, переходника MiniPCIe <-> M.2, Wi-Fi-адаптера M.2 и подключенные к нему omni-антенны](https://habrastorage.org/getpro/habr/post_images/064/2bc/7cc/0642bc7ccc3dbe71ee7306a8b78de42c.jpg)
«Бутерброд» из платы MiniPCIe, переходника MiniPCIe <-> M.2, Wi-Fi-адаптера M.2 и подключенные к нему omni-антенны
Ноутбуков с ExpressCard на рынке уже почти не остается, но у нас есть запас таких старых машин, хотя уже понятно, что скоро придется искать новое решение. Но об этом ниже.
2014
В декабре 2013 года ратифицирован стандарт 802.11ac, и в 2014 году на рынке появляется много адаптеров 802.11ac, причем уже USB 3.0. Зачем адаптерам USB 3.0? Потому что скорости шины 2.0 уже не хватает. Трехпотоковые (3 spatial streams) адаптеры 802.11n могли обеспечивать максимальную скорость 450 Mbps на физическом уровне, а вот адаптеры 802.11ac уже могут давать 867 Mbps (два потока, ширина канала 80 MHz) или 1300 Mbps (три потока, ширина канала 80 MHz) и даже в теории 2340 Mbps (три потока, ширина канала 160 MHz, только таких нет в природе).
Единственная проблема с USB 3.0 заключается в том, что устройства USB 3.0 (кабели, коннекторы, схемотехника) способны генерировать довольно мощный широкополосный радиочастотный шум, который делает адаптеры гораздо менее чувствительными, поскольку понижается отношение сигнал/шум. В отсутствие хорошего экранирования, этот эффект можно легко наблюдать. Скриншот, приведенный ниже, сделан с помощью TamoGraph Site Survey и анализатора спектра Wi-Spy. На скриншоте показана типичная картина работы нескольких сетей в диапазоне 2.4 GHz (амплитуды вверху и так называемый waterfall view внизу). Видно, что порог шума находится примерно на уровне –95 dBm.
![Помехи от USB-хаба отсутствуют](https://habrastorage.org/getpro/habr/post_images/ada/146/b94/ada146b9477dc7b8aad693e436300fee.png)
Помехи от USB-хаба отсутствуют
Теперь попробуем приблизить Wi-Spy к хабу или внешнему диску USB 3.0. Картина радикально меняется:
![Мощные помехи от USB-хаба](https://habrastorage.org/getpro/habr/post_images/8b3/618/378/8b361837835db2a70b767fd734b8040c.png)
Мощные помехи от USB-хаба
Рядом с хабом наблюдается очень приличный шум, примерно на уровне -77 dBm. Если учесть, что минимальное отношение сигнал/шум, при котором Wi-Fi еще как-то может работать, составляет около 4 dB, то при такой картинке адаптер не сможет соединиться с сетью, если сигнал от точки доступа будет ниже -73 dBm. Чтобы обойти эту проблему, стоит попробовать разные хабы или использовать дополнительные USB-кабели, удаляющие адаптер от источников RF-шума.
Вы спросите, как же при таких помехах живут адаптеры USB 3.0? Они живут очень интересной жизнью. Взять, к примеру, адаптеры на чипсете Realtek: когда адаптер не ассоциирован, он работает в режиме USB 2.0, сканируя каналы и находя близлежащие сети. Когда адаптер подключается к сети, то специальный системный сервис Windows переинициализирует устройство, переключая его в режим USB 3.0. В этом режиме адаптер остается до тех пор, пока он не диссоциируется, после чего он снова возвращается в режим USB 2.0. Вот такие безумные танцы.
2018
Время идет вперед, и если с тестированием USB-адаптеров никаких новых проблем не появляется (разъемы USB Type-C не в счет, копеечный переходник решает проблему), то в отношении MiniPCIe и M.2 назревает кризис. Жить дальше со старой связкой «ноутбук со слотом ExpressCard + плата MiniPCIe с интерфейсом ExpressCard» становится невыносимо. Во-первых, старые ноутбуки уже не тянут Windows 10. Во-вторых, они могут умереть в любой момент, оставив нас у разбитого корыта, поскольку искать на блошином рынке древние ноутбуки на замену совершенно не хочется.
Надо найти новое решение. Мобильное, желательно и под Windows и под macOS, с современным интерфейсом для подключения. Естественно, с возможностью Direct Memory Access (DMA). Самое простое – вставить плату-переходник PCIe <-> MiniPCIe в десктоп, но тогда на мобильности надо поставить крест. Таскать на себе десктоп по офису очень полезно для здоровья, но не очень продуктивно. Кроме того, мы вообще сейчас уходим от десктопов в сторону ноутбуков и Intel NUC; десктопы в значительной степени потеряли смысл в последние годы.
Итак, что нам остается? Конечно же не USB, потому что, увы, нельзя сделать мостик PCIe <-> USB. Тогда Thunderbolt: он есть в новых ноутбуках и NUC’ах, и он должен сделать возможным мостик PCIe <-> Thunderbolt. Хорошо, направление поиска – некий девайс для подключения адаптера PCIe через Thunderbolt.
Ищем, ищем и находим красавца: Startech Thunderbolt 3 PCIe Expansion Chassis. Естественно, его разработчикам даже в самых буйных фантазиях не могла прийти в голову мысль, что кто-то захочет вставить в это шасси карту Wi-Fi. На сайте, собственно, описаны все те фантазии, которые посетили разработчиков: «The Thunderbolt 3 PCIe chassis makes it easy to expand your system with the capabilities you need to work at peak productivity. You can add many types of PCI Express cards, such as a PCIe USB 3.1/3.0/2.0 and USB-C, SSD, network, eSATA, FireWire or video capture cards». Теоретически, Wi-Fi должен взлететь. Практически… ну вы знаете как бывает практически. Если у компонента есть хоть малейший шанс не заработать по любой причине (драйвер, firmware, микросхемы), то он обязательно не заработает.
Мы написали в саппорт. Саппорт, объяснимо, был совершенно не готов к вопросу по Wi-Fi. Сказали, что пробовали Ethernet-адаптеры, но Wi-Fi – никогда. Ну что же, попробуем за них мы. Посылка приезжает быстро, и нам остается только снять внешний корпус и вставить PCIe-плату с переходником на M.2.
![image](https://habrastorage.org/getpro/habr/post_images/ba1/7dc/799/ba17dc7996c81cd2246610f46c2dc714.jpg)
Внутренности Startech TB31PCIEX16
В переходник надо вставить адаптер Wi-Fi и прикрутить его. Дальше подключаем к плате антенны (через микроскопические коннекторы, без лупы не справиться), прикручиваем антенны к скобе PCIe-платы, чтобы вывести их наружу, и подключаем весь юнит к питанию и Thunderbolt-порту ноутбука.
![image](https://habrastorage.org/getpro/habr/post_images/f17/582/5aa/f175825aadfe9269dbc52b1c7ba41d2a.jpg)
Startech TB31PCIEX16 в собранном виде
И оно заработало. Не сразу, конечно, такие железяки обычно сразу не сдаются. Пришлось сначала обновить firmware контроллера Thunderbolt в компьютере. Но потом всё пошло как по маслу.
Будущее
Мы внимательно следим за развитием индустрии. Следующий интерфейс на подходе – M.2 CNVio, который используется, к примеру, в самых новых адаптерах Intel 9560. Следующий Wi-Fi стандарт – 802.11ax. Будем решать проблемы по мере поступления.