庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>编程开发>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

linux kernel2.4里面接收数据分组的过程和体会

 作者:luster    日期:2005-4-14
字号选择〖 〗/ 双击滚屏 单击停止   
最近一个科研项目的需要,在linux 下面写了一些代码。其中要涉及到接收处理一个特殊的分组。这个分组的头部(IPv6+UDP)由于某种需要而被压缩改变了。我的代码要完成的工作之一就是根据某些信息恢复出原始的头标。如何接收这个分组呢?

一个想法就是,发送分组的时候把以太祯的类型设置为IPv6,这样内核接收到该分组后,会提交给ip6_rcv(),然后我们在ip6_rcv()函数的开始处,嵌入自己的代码进行头标的恢复。但是这样做总感觉不是很好,我的想法是完成一个相对独立的LKM,而不需要修改内核的源代码。

经过分析发现,内核处理接收数据的流程是,网卡驱动把接收到的数据组织好,然后提取以太祯中的协议类型域,然后填写skb,最后调用netif_rx()把这个skb 放到内核接收队列里面。然后系统在自己的软中断中通过net_rx_action()查看这个skb 队列,如果有数据就提取出来,根据skb->protocol来调用相应的处理函数,例如如果是IPV6的话,就调用ip6_rcv(). ip6_rcv()就是整个内核中IPv6协议的一个入口点。

经过这个分析后,我采用了如下的方法来实现我前面的需求。我在内核里面注册了一种新的分组协议和该协议的对应的接收处理函数。这样,当内核接收到我所关心的特殊分组后,在net_rx_action里面就会寻找到我这个对应的接收处理函数。我在处理函数里面对IPv6+UDP头部进行恢复。然后如何提交给ip6入口点呢?呵呵,我这里采用的是将skb->protocol 域置为 IPv6,然后再次调用netif_rx(),把分组放到接收队列里面。这样在下一个软中断到来的时候,我们修改恢复后的IPv6分组就可以被正常接收了。:))

这里在实际编程中发现,如果在我的接收函数里面,如果直接修改内核调用传入的skb,然后把这个skb再次放到netif_rx()调用后的队列里面,会不时出现kernel panic 。后来我采用的是先skb_clone一个sk_buff,然后对这个新buff操作,并将这个新buff放到队列里面,而在我的接受函数里面是把这个原来的skb free掉。现在是OK了。:))

由于我正在自己的机器上进一步测试我的代码,现在无聊,就来这里发了这篇帖子,
也算是一种处理方法把。不知道这个处理方法是否非常OLD :):)
上一篇:来自 e-BIT 的珍品:双 if 魔符    下一篇:Bean管理持续化实例  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: luster
信息来源: 网络 录入时间: 2005-4-14
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿