Отправка кадров Ethernet из модуля ядра

#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 элементарны.