Справочная информация. Я являюсь четвертым специалистом в области вычислительной техники в 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);
.
Опять же, я никогда раньше не делал ничего подобного, поэтому любые советы были бы полезными, даже если это означает полностью изменить мой подход! Я также понимаю, что это может быть ниша вопроса, но любое руководство ценится!
Спасибо заранее!
Маке поле адреса источника должен иметь ту же самую информацию, как обычно: адрес устройства, как в вашем примере, является правильным. Поместите широковещательный адрес ethernet (FF: FF: FF: FF: FF: FF) в поле адреса адреса назначения. Я думаю, вы используете существующую структуру драйвера устройства и помещаете ее в skb, поэтому метод dev_queue_xmit будет знать, какой драйвер должен отправить пакет; но не уверен в этом. –
Спасибо за отзыв. То, что вы сказали, имеет смысл. Хотя похоже, что мы оба мало знаем о драйверах устройств!Я ценю помощь, хотя :) –
Я бы сказал, скорее, что драйверы устройств сильно зависят от устройства и платформы. –