微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

构build出口设备linux内核的sk_buff

长话短说,我试图build立一个非常裸露的骨头UDP SKB只是为了把东西放到电线上。 情况如下:

我有一个内核模块加载(除其他外)覆盖/net/ipv4/udp.c中的标准udp_sendmsg函数的内存位置。 从这里我想build立一个skb到我可以简单地把它放在电线上的点。 通常情况下,udp_sendmsg只是简单地做一些UDP簿记工作,绑定在一个UDP头上,并发送到IP层进行路由select,L3 / L2头等等。基本上我将一些function引入sendmsg函数在这个时候,我只是分配一个skb:

skb = alloc_skb(1500,GFP_KERNEL); //skb has 1500 bytes of tail room only skb_reserve(skb,500); //Now has head and tail but no data space data = skb_put(skb,500); //Now we have an skb with 500 head,500 data sec,500 tail

然后(后一些路由表seteup)我想添加一个udp_hdr:

struct udphdr *uh; skb->transport_header = skb_push(skb,sizeof(struct udphdr)); uh = udp_hdr(skb); uh->source = 5555; uh->dest = dport; uh->len = 18; uh->check = 0;

一个ip_hdr(只有基本填充):

初始化模块在Apache2

Apache命令行不起作用

无法安装新的python模块

如何编写Linux驱动程序模块调用/使用另一个驱动程序模块?

PHP会话中填充apache日志文件中的远程用户

struct iphdr *iph; skb->network_header = skb_push(skb,sizeof(struct iphdr)); iph = ip_hdr(skb); iph->version = 4; iph->ihl = 5; iph->tos = inet->tos; iph->tot_len = htons(skb->len); iph->protocol = IPPROTO_UDP; iph->saddr = saddr; iph->daddr = daddr; skb->dst = dst_clone(&rt->u.dst);

注意:我从这个页面得到了大部分内容,但是他们使用了一个较老的内核(在2.6.24之前),其中networking和传输头是联合的,分别称为nh和h。 新的方式涉及使用skb-> transport_header / skb-> network_header和使用这些帮助函数,但显然我做错了什么,因为我得到一个内核哎呀,当我尝试调用udp_sendmsg

注意:这跑没有一个哎呀,垃圾倒在电线,而不是:

skb->transport_header = skb_push(skb,sizeof(struct udphdr));

我用了:

skb_reset_transport_header(skb);

(相当于network_header,但是在阅读了上面的链接并在linux / sk_buff.h中查看重置函数的源代码后,似乎没有按照我想要的那样做。

还请注意,上面的任何赋值语句(在此上下文中)未定义的variables仅仅是因为我没有包含整个函数

我意识到这个问题可能会落入一个非常具体的领域,但是正确使用新的skb结构的任何指导将会大有帮助。 我的朋友谷歌即将到来相当干燥。

哎呀呼叫跟踪:

[<ffffffff813dbf98>] oops_end+0xb9/0xc1 [<ffffffff81030e21>] no_context+0x1f6/0x205 [<ffffffff81030fd3>] __bad_area_nosemaphore+0x1a3/0x1c9 [<ffffffff8101184e>] ? apic_timer_interrupt+0xe/0x20 [<ffffffff8103100c>] bad_area_nosemaphore+0x13/0x15 [<ffffffff813dd30a>] do_page_fault+0x125/0x222 [<ffffffff813db485>] page_fault+0x25/0x30 [<ffffffffa010924f>] ? udp_sendmsg_offload+0x1e3/0x250 [testmodule] [<ffffffffa010922e>] ? udp_sendmsg_offload+0x1c2/0x250 [testmodule] [<ffffffff81390a00>] inet_sendmsg+0x54/0x5d [<ffffffff8132f142>] __sock_sendmsg+0x61/0x6c [<ffffffff8132f8b9>] sock_sendmsg+0xcc/0xe5

试图为Python安装正则expression式

内核模块初始化和退出函数调用顺序错误

C中两个整数的快速双向散列

具有多个文件的内核模块 – 未知的符号

如何编译.o文件到Linux内核模块(.ko)文件

skb_push()返回一个指向 transport头的指针 ,但是skb->transport_header是一个sk_buff_data_t ,它应该是一个偏移量 – 看看skb_transport_header()是如何工作的。 您还需要将标题信息转换为网络字节顺序。

您设置UDP标头的部分应该是:

struct udphdr *uh; skb_push(skb,sizeof(struct udphdr)); skb_reset_transport_header(skb); uh = udp_hdr(skb); uh->source = __constant_htons(5555); /* ... */

和IP头相似:

struct iphdr *iph; skb_push(skb,sizeof(struct iphdr)); skb_reset_network_header(skb); iph = ip_hdr(skb); iph->version = 4; /* ... */

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐