3
我正在编写一个创建IP数据包的内核模块。现在我想发送这个数据包,但没有为它的传输创建任何套接字。使用linux-kernel模块发送UDP数据包而不使用套接字
是否有任何方式直接发送它的内核例程的帮助。
正如我已经跟踪的数据包传输的Linux内核代码存在命名为dev_hard_start_xmit()净/型芯/ dev.c定义的函数。我们可以使用它吗?
其实我不想使用套接字。
我正在编写一个创建IP数据包的内核模块。现在我想发送这个数据包,但没有为它的传输创建任何套接字。使用linux-kernel模块发送UDP数据包而不使用套接字
是否有任何方式直接发送它的内核例程的帮助。
正如我已经跟踪的数据包传输的Linux内核代码存在命名为dev_hard_start_xmit()净/型芯/ dev.c定义的函数。我们可以使用它吗?
其实我不想使用套接字。
你不需要一个套接字在内核中发送一个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);
我正在做同样的过程,但在传输系统变得有点慢..为什么发生这种情况我无法找出... plese帮助? – akp
与我同样的问题。 –
你从哪里获得开发结构? –