c - 使用 linux-kernel 模块发送 UDP 数据包而不使用套接字

标签 c linux sockets linux-kernel kernel-module

我正在编写一个创建 IP 数据包的内核模块。现在我想发送这个数据包,但还没有为它的传输创建任何套接字。

有没有办法借助内核例程直接发送。

因为我跟踪了用于数据包传输的 linux 内核代码,所以在 net/core/dev.c 中定义了一个名为 dev_hard_start_xmit() 的函数。我们可以使用它吗?

其实我不想使用套接字。

最佳答案

在内核中发送UDP包不需要socket,只需要分配一个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);

关于c - 使用 linux-kernel 模块发送 UDP 数据包而不使用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13227315/

相关文章:

c - 切换大小写不影响变量 C

linux - Powershell POST 到 Linux curl

python - 需要有关 Python 删除旧目录脚本的帮助

C++ SFML UDP Socket 向多个客户端接收和发送数据

ios - Secure Transport TLS 应该如何与 Swift 中的 BSD 套接字一起使用?

c - 以非侵入方式将调试打印到 RAM 文件中

c - 在 ansi C 中为嵌入式设备编写可重用的低级图形库

c - 处理结构体数组时出现段错误

linux - 你能推荐一个适用于 Linux 的 PostgreSQL Visual Database Designer 吗?

networking - 当 tcp/udp 服务器发布速度快于客户端消耗速度时会发生什么?