Отправьте необработанный пакет Ethernet из модуля ядра

Я узнал, что должен создать новое sk_buff структура в модуле ядра и передаче, которая это к моему сетевому устройству, но что я не могу выяснить, - как установить переменные структуры для простого необработанного пакета Ethernet.

Это должно быть легко, но я был бы очень признателен, если кто-то мог бы дать мне пример кода того, как поместить sk_buff вместе.

10
задан red0ct 9 July 2019 в 15:42
поделиться

1 ответ

Взгляните на функцию packet_sendmsg_spkt в net / packet / af_packet.c для вдохновения. Сложнее всего получить struct sock , если у вас нет сокета ...

Изменить: Добавлена ​​базовая оболочка кода:

int sendpacket(struct socket *sock, struct net_device *dev, __be16 proto, void *data, size_t len)
{
    struct sock *sk = sock->sk;
    struct sk_buff *skb;

    if (!(dev->flags & IFF_UP))
        return -ENETDOWN;

    if (len > dev->mtu + dev->hard_header_len)
        return -EMSGSIZE;

    skb = sock_wmalloc(sk, len + LL_RESERVED_SPACE(dev), 0, GFP_KERNEL);

    if (skb == NULL)
        return -ENOBUFS;

    /* FIXME: Save some space for broken drivers that write a
     * hard header at transmission time by themselves. PPP is the
     * notable one here. This should really be fixed at the driver level.
     */
    skb_reserve(skb, LL_RESERVED_SPACE(dev));
    skb_reset_network_header(skb);

    /* Try to align data part correctly */
    if (dev->header_ops) {
        skb->data -= dev->hard_header_len;
        skb->tail -= dev->hard_header_len;
        if (len < dev->hard_header_len)
            skb_reset_network_header(skb);
    }

    memcpy(skb_put(skb, len), data, len);
    skb->protocol = proto;
    skb->dev = dev;
    skb->priority = sk->sk_priority;

    dev_queue_xmit(skb);

    return len;
}
10
ответ дан 4 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: