#frame #kernel-module #ethernet #network-interface
#кадр #kernel-module #ethernet #сетевой интерфейс
Вопрос:
У меня есть модуль ядра, который хотел бы отправлять готовые кадры Ethernet из пользовательского пространства, такие как пользовательский ARP и другие протоколы (я пытаюсь обойти стек tcp / ip в Linux и создать пользовательский для своих нужд). Кадры действительны и укомплектованы всем необходимым. Остается только каким-то образом отправить их в очередь на интерфейсе eth0. Каково наилучшее решение для этого?
Для захвата входящих пакетов я использую netfilter API с максимально ранним подключением. Я не могу использовать необработанные сокеты из пользовательского пространства из-за необходимости sudo, а также из-за моих пользовательских требований.
Редактировать: я смог достичь своих целей dev_queue_xmit()
. Тем не менее, мне все еще интересно, есть ли другое решение, которое напрямую обращается к драйверу.
static void SendFrame(void)
{
struct sk_buff* skb = dev_alloc_skb(1518);
skb->dev = __dev_get_by_name(amp;init_net, "eth0");
skb_reserve(skb, NET_IP_ALIGN);
skb->data = skb_put(skb, ethFrameBytes);
memcpy(skb->data, pEthFrame, ethFrameBytes);
if (dev_queue_xmit(skb) != NET_XMIT_SUCCESS)
{
printk(KERN_ERR, KERN_ERR "Error: unable to send the framen");
}
}
Комментарии:
1. На самом деле вы можете отправлять необработанные кадры L2 из пользовательского пространства, не возясь с ядром: man7.org/linux/man-pages/man7/packet.7.html
2. Не уверен, каковы ваши пользовательские требования. Что касается sudo, достаточно иметь возможность CAP_NET_RAW, которую вы можете предоставить своей программе через setcap. Необязательно иметь полный root.
3. К сожалению, как RAW, так и packet() отсутствуют. Я хотел бы получить прямой доступ к очереди драйверов / фреймов eth0. Кажется, что все в Linux выполняется с использованием skb, который может быть перенаправлен в их собственную очередь. Вероятно, мне следует придерживаться их, поскольку мои знания о встроенном Linux элементарны.