Отправка необработанного пакета ethernet из модуля ядра
Я обнаружил, что мне нужно построить новую структуру sk_buff в модуле ядра и передать ее на мое сетевое устройство, но я не могу понять, как установить переменные структуры для простого необработанного пакета ethernet.
Это должно быть легко, но я был бы очень признателен, если бы кто-нибудь дал мне пример кода, как собрать sk_buff вместе.
1 ответ:
Взгляните на функцию
packet_sendmsg_spkt
вnet/packet/af_packet.c
для вдохновения. Самое сложное-это получитьstruct sock
, Если у вас нет сокета...Edit: добавлена базовая оболочка кода:
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; }