我正在编写一个创buildIP数据包的内核模块。 现在我想发送这个数据包,但是没有为它的传输创build任何套接字。
有没有什么办法直接发送它的内核例程的帮助。
因为我已经跟踪了用于数据包传输的linux内核代码,所以在net / core / dev.c中定义了一个名为dev_hard_start_xmit()的函数。 我们可以使用它吗?
其实我不想使用套接字。
你不需要一个套接字在内核中发送一个UDP包,你只需要分配一个skb,然后自己构造IP头和UDP头,最后通过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);