Envoi de paquets UDP avec le module linux-kernel sans utiliser de sockets

J’écris un module de kernel qui crée un paquet IP. Maintenant, je veux envoyer ce paquet mais je n’ai pas créé de socket pour sa transmission.

Est-il possible de l’envoyer directement à l’aide des routines du kernel?

Comme j’ai suivi le code du kernel Linux pour la transmission de paquets, il existe une fonction définie dans net / core / dev.c nommée dev_hard_start_xmit () . pouvons-nous l’utiliser?

En fait, je ne veux pas utiliser de sockets.

Vous n’avez pas besoin d’un socket pour envoyer un paquet UDP dans le kernel, vous devez juste allouer un skb, construire l’en-tête IP et l’en-tête UDP vous-même, et enfin l’envoyer par dev_queue_xmit ().

skb = alloc_skb(len, GFP_ATOMIC); if (!skb) return; skb_put(skb, len); skb_push(skb, sizeof(*udph)); skb_reset_transport_header(skb); udph = udp_hdr(skb); udph->source = htons(....); udph->dest = htons(...); udph->len = htons(udp_len); udph->check = 0; udph->check = csum_tcpudp_magic(local_ip, remote_ip, udp_len, IPPROTO_UDP, csum_partial(udph, udp_len, 0)); if (udph->check == 0) udph->check = CSUM_MANGLED_0; skb_push(skb, sizeof(*iph)); skb_reset_network_header(skb); iph = ip_hdr(skb); /* iph->version = 4; iph->ihl = 5; */ put_unaligned(0x45, (unsigned char *)iph); iph->tos = 0; put_unaligned(htons(ip_len), &(iph->tot_len)); iph->id = htons(atomic_inc_return(&ip_ident)); iph->frag_off = 0; iph->ttl = 64; iph->protocol = IPPROTO_UDP; iph->check = 0; put_unaligned(local_ip, &(iph->saddr)); put_unaligned(remote_ip, &(iph->daddr)); iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); 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);