2014-02-21 5 views
0

Справочная информация. Я являюсь четвертым специалистом в области вычислительной техники в UCSB. Я занялся сетевыми и операционными системами. Я создал программу в пользовательском пространстве, которая передает UDP-пакеты в подсеть и принимает UDP-пакеты в adhoc-сети. То, что я пытаюсь сделать, - это преобразовать эту программу в модуль ядра, который будет работать с встроенной системой ARM с Angstrom Linux, версия ядра 2.6.39 (кросс-компиляция архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры архитектуры x86 - это проблема еще на один день). Причина этого перехода к ядру заключается в том, чтобы пролить некоторые из служебных функций пользовательского пространства и сделать как отправители, так и принимающую часть как можно быстрее.Отправка пакета UDP в модуле ядра

Я никогда не делал ничего подобного раньше ни на одном из курсов, которые я взял, поэтому, пожалуйста, скажите мне, что я говорю неправильно, бесполезно или неэффективно!

После исследования с Google я пришел к выводу, что типичный способ состоит в том, чтобы полностью уничтожить сокеты и работать с структурой sockbuf и заполнить необходимые заголовки самостоятельно. Это повлияет на способность транслировать пакеты в подсети? В настоящее время я пытаюсь следовать код здесь: UDP packet send with linux-kernel module without using sockets

Я понял, рассуждение позади большую часть кода, но последняя часть является то, что меня смущает:

eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); 
skb_reset_mac_header(skb); 
skb->protocol = eth->h_proto = htons(ETH_P_IP); 
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN); 
memcpy(eth->h_dest, remote_mac, ETH_ALEN); 

skb->dev = dev; 


dev_queue_xmit(skb); 
  • Все заголовок ethernet, кажется, построен исключительно из заголовков, определенных в ядре, кроме исходного MAC-адреса, это правильно? Я собираюсь транслировать мои пакеты, так что же именно следует помещать в поле MAC-адреса назначения?
  • Что еще более важно, что такое dev в строке skb->dev = dev;? Из моего исследования это указатель на драйвер устройства, с которым он связан. По моему мнению, я хотел бы, чтобы это указывало на драйвер беспроводного чип-устройства, поскольку я использую 802.11 для связи. Должен ли я создать свою собственную структуру dev для беспроводного драйвера? Если да, есть ли какие-либо рекомендации относительно того, как это сделать? Если нет, как я могу получить доступ к существующему драйверу устройства и использовать его в модуле ядра?

Я пробовал прокомментировать строку dev и запустить код, но неудивительно, что я получаю панику ядра, когда она выполняет dev_queue_xmit(skb);.

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

Спасибо заранее!

+0

Маке поле адреса источника должен иметь ту же самую информацию, как обычно: адрес устройства, как в вашем примере, является правильным. Поместите широковещательный адрес ethernet (FF: FF: FF: FF: FF: FF) в поле адреса адреса назначения. Я думаю, вы используете существующую структуру драйвера устройства и помещаете ее в skb, поэтому метод dev_queue_xmit будет знать, какой драйвер должен отправить пакет; но не уверен в этом. –

+0

Спасибо за отзыв. То, что вы сказали, имеет смысл. Хотя похоже, что мы оба мало знаем о драйверах устройств!Я ценю помощь, хотя :) –

+0

Я бы сказал, скорее, что драйверы устройств сильно зависят от устройства и платформы. –

ответ

1

Лучший способ не мешать протоколу, если вы не пытаетесь его модифицировать. Работайте на более высоком (сокетном) слое. Этот API можно найти в сети/укорочено

Это поможет: (открыть в новой вкладке браузера/окна для увеличения) Linux Kernel Network Flow

+0

Спасибо! Эта картина была чрезвычайно полезна в понимании потока программных вещей. Вы действительно думаете, что я должен вернуться к слою сокета? Я пытаюсь уменьшить как можно большую задержку при отправке/получении пакетов (в настоящее время я на уровне субмиллисекунд). Если вы считаете, что не хватает преимуществ, чтобы идти глубже, я попробую реализацию сокета. Спасибо! –

+0

Да, быть на уровне сокетов лучше, потому что иначе вы можете испортить протокол. Вы можете использовать для сокетов ядра для получения соответствующей полезной нагрузки (ethernet, ip и т. Д.). Кроме того, нет большого преимущества за счет сокращения пары вызовов функций. Накладные расходы будут незначительными, поскольку вы уже находитесь внутри ядра (в отличие от сокращения системных вызовов). Если ответ был полезен, отметьте его правильно и +1, чтобы другим было полезно выполнить поиск. – user31986

Смежные вопросы