Доступ к беспроводному интерфейсу (802.11) на уровне MAC (Linux) - PullRequest
18 голосов
/ 08 февраля 2012

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

Вот что я хочу сделать: я хочу отправлять и получать пакеты данных с собственным протоколом (-ами) уровня 3 через беспроводной интерфейс (802.11) в системах Linux с C / C ++. Все идет нормально. Я не требую маяков, ассоциаций или каких-либо вещей, связанных с AP / SSID. Однако для передачи данных мне бы хотелось, чтобы уровень MAC вел себя «как обычно», то есть одноадресные пакеты - это ACK, повторные передачи, откат и т. Д. Я также хотел бы насладиться расширенными возможностями QoS (802.11e с 4 очередями и разные категории доступа). Случайный режим, с другой стороны, не имеет значения, мне требуются только широковещательные пакеты и пакеты, отправленные на конкретную станцию.

Каким будет правильный путь? Большая часть документации по доступу к сокетам, по-видимому, фокусируется на перехвате сети, и это не помогает. Я уже некоторое время играю с в режиме монитора , но из того, что я прочитал, полученные пакеты не подтверждены в режиме мониторинга и т. Д. Без режима монитора, что будет альтернативой? Используете режим ad hoc и unix raw сокеты? Или я должен возиться с драйверами?

Я не ищу полное решение, просто хорошие идеи, с чего начать. Я прочитал справочные страницы для socket (2), socket (7) и packet (7), но это не помогло относительно поведения уровня MAC в различных режимах.

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 13 мая 2012

802.11 - спецификация протокола уровня 2 (и 1). Он был спроектирован таким образом, который позволяет протоколам более высокого уровня рассматривать его как сеть Ethernet. Адресация и поведение в целом одинаковы. Поэтому для протокола уровня 3 вам вообще не нужно беспокоиться о 802.11, и вы должны писать свой код так, как будто вы ожидаете, что он будет работать в сети Ethernet.

Чтобы это заработало, вам сначала нужно подключиться к какой-либо беспроводной сети (что в принципе соответствует подключению провода к карте Ethernet). Здесь вы можете выбрать специальную (также известную как IBSS) или инфраструктурную (также известную как BSS) сеть (или PBSS после утверждения 802.11ad;).

Работа карт без какой-либо связи с сетью (просто выплевывание пакетов в эфир) не очень хорошая идея по нескольким причинам. Самое главное, что это очень зависит от оборудования и ненадежен. Вы все еще можете сделать это, используя интерфейс RF mon (режим монитора AKA) с одной стороны и внедрение пакетов (используя заголовок радиоленты) с другой, но я не рекомендую этого. Даже если у вас есть набор одинаковых карт, вы, скорее всего, столкнетесь с трудностями объяснения и случайным поведением в какой-то момент. Сетевые адаптеры 802.11 просто не предназначены для такого рода операций и поддерживают различное монтирование состояния внутри встроенного программного обеспечения (читайте о картах FullMAC и SoftMAC). Даже карты SoftMAC существенно различаются. Например, теоретически в режиме мониторинга, как вы сказали, карта не должна подтверждать получение пакетов. Однако существуют карты, которые в любом случае будут подтверждать получение кадра, потому что они основывают свое решение исключительно на том факте, что указанный кадр адресован им. Некоторые карты могут даже попытаться ACK всех кадров, которые они видят. То же самое произойдет и с ретрансляциями: некоторые карты будут отправлять введенный пакет только один раз (вот как это должно работать). В других сетевых картах повторные передачи обрабатываются аппаратным обеспечением (и встроенным программным обеспечением), и драйвер не может отключить его, поэтому вы получите автоматическую повторную передачу даже с введенными данными.

Придерживаясь уровня 3 и используя существующие режимы (например, ad hoc), вы получите все необходимые возможности и многое другое (QoS и т. Д.). Кадр Ethernet, который вы отправляете интерфейсу, будет «переведен» ядром в формат 802.11 с отображением QoS и т. Д.

Если вы хотите узнать о поведении MAC в различных режимах, вам придется либо прочитать код mac80211 , либо сам стандарт 802.11. http://linuxwireless.org Вики может помочь вам с несколькими вещами, но хакеры ядра обычно заняты написанием документации, отличной от комментариев в коде;)

Сама реализация протокола L3 также может выполняться как в режиме ядра, так и в режиме пользователя (с использованием необработанных сокетов). Как обычно, ядро ​​будет сложнее, но мощнее.

3 голосов
/ 12 мая 2012

Поскольку вы хотите создать собственный протокол сетевого уровня (замена IP), ключевое слово: «raw ethernet socket».Поэтому не обращайте внимания на «Raw IP socket».

Вот с чего начать:

int sockfd = socket( PF_PACKET, SOCK_RAW, htons(XXX) ); 

Правильная страница справочника: packet (7) .

Найдите дополнительную информацию, погуглив с ключевым словом.Один довольно полный пример здесь .

1 голос
/ 07 мая 2012

Возможно, вам нужно что-то вроде libpcap .

Libpcap позволяет вам читать / вводить необработанные пакеты из / в сетевой интерфейс.

0 голосов
/ 07 мая 2012

Звучит так, как будто вы перепутали медиа и транспортные слои.

802.11 - это то, что обычно называют «канальным», «физическим» или «мультимедийным» уровнем, то есть он имеет дело только с передачей необработанных дейтаграмм.

Такие понятия, как ACK, повторные передачи, откат (управление потоком) применяются к «транспортному» уровню, и эти конкретные термины тесно связаны с TCP / IP.

Создание собственного транспортного уровня с нуля очень сложно и почти наверняка не то, что вы хотите сделать. Если вместо этого вы хотите использовать существующий стек TCP / IP поверх вашей собственной пользовательской интерпретации 802.11, то вы, вероятно, захотите создать виртуальный сетевой интерфейс. Это будет действовать в качестве посредника между TCP / IP и медиа-уровнем.

Надеюсь, это даст вам лучший контекст и ключевые слова для поиска.

...