长话短说,我试图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驱动程序模块调用/使用另一个驱动程序模块?
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中两个整数的快速双向散列
具有多个文件的内核模块 – 未知的符号
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] 举报,一经查实,本站将立刻删除。