Paquete UDP enviado con el módulo linux-kernel sin usar sockets

Estoy escribiendo un módulo del kernel que crea un paquete IP. Ahora quiero enviar este paquete pero no he creado ningún socket para su transmisión.

¿Hay alguna forma de enviarlo directamente con la ayuda de las rutinas del kernel?

Como he rastreado el código del kernel de Linux para la transmisión de paquetes, hay una función definida en net / core / dev.c llamada dev_hard_start_xmit () . podemos usarlo?

En realidad no quiero usar sockets.

No necesita un socket para enviar un paquete UDP en el kernel, solo necesita asignar un skb y construir el encabezado IP y el encabezado UDP por sí mismo, y finalmente enviarlo por 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);