免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1839 | 回复: 9
打印 上一主题 下一主题

[网络子系统] 这是我一个毕业几年的师兄写的一个ip层的并发传输模块,没看懂怎么并发传输的? [复制链接]

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-29 10:30 |只看该作者 |倒序浏览
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/skbuff.h>
  4. #include <linux/ip.h>
  5. #include <linux/netfilter.h>
  6. #include <linux/netfilter_ipv4.h>
  7. #include <linux/if_ether.h>
  8. #include <linux/if_packet.h>
  9. #include <linux/netdevice.h>
  10. #include <net/tcp.h>
  11. #include <net/udp.h>
  12. #include <net/ip.h>

  13. extern int ip_rcv_finish(struct sk_buff *skb);

  14. MODULE_LICENSE("Dual BSD/GPL");
  15. MODULE_AUTHOR("伍鹏飞");
  16. MODULE_DESCRIPTION("多径路由并发模块");
  17. MODULE_VERSION("0.0.1");

  18. static unsigned char rule_ip[4] = {192,168,1,0}; // target capture ip default parameter
  19. static unsigned char rule_mask[4] = {255,255,255,0};//MUSTget local host ip
  20. static unsigned int  mirule_ip;
  21. static unsigned int  mimask;
  22. static unsigned int  anum = 4;
  23.        
  24. module_param_array(rule_ip, byte,&anum, S_IRUSR|S_IWUSR);       
  25. module_param_array(rule_mask, byte,&anum, S_IRUSR|S_IWUSR);

  26. unsigned int nf_hook_pre(unsigned int hooknum, struct sk_buff *skb,
  27.                                 const struct net_device *in,     
  28.                                 const struct net_device *out,                        
  29.                                 int (*okfn)(struct sk_buff *))

  30. {
  31.         struct sk_buff *skb2;
  32.         struct iphdr *iph = ip_hdr(skb);
  33.         struct iphdr *iph2;
  34.         mirule_ip = *(unsigned int *)rule_ip;
  35.         mimask = *(unsigned int *)rule_mask;
  36.         if((iph->saddr^mirule_ip) & mimask) //如果源地址不是同一子网的,直接进行后面的处理,不进行并发
  37.                 return NF_ACCEPT;
  38.         else
  39.         {
  40.                 skb2 = skb_clone(skb,GFP_ATOMIC);
  41.                 iph2 = ip_hdr(skb2);

  42.                 iph2->tos = 0x04;
  43.                 iph2->check = 0;
  44.                 iph2->check = ip_fast_csum((unsigned char*)iph2, iph2->ihl);

  45.                 ip_rcv_finish(skb2);

  46.                 iph->tos = 0x08;
  47.                 iph->check = 0;
  48.                 iph->check = ip_fast_csum((unsigned char*)iph, iph->ihl);
  49.         }
  50.         return NF_ACCEPT;
  51. }

  52. unsigned int nf_hook_in(unsigned int hooknum, struct sk_buff *skb,
  53.                                 const struct net_device *in,     
  54.                                 const struct net_device *out,                        
  55.                                 int (*okfn)(struct sk_buff *))
  56. {
  57.         struct iphdr *iph = ip_hdr(skb);
  58.         if(iph->tos == 0x04)
  59.                 return NF_DROP;
  60.         else
  61.                 return NF_ACCEPT;
  62. }

  63. static struct nf_hook_ops nf_pre =
  64. {
  65.         .hook = nf_hook_pre,
  66.         .hooknum = NF_INET_PRE_ROUTING,
  67.         .pf = PF_INET,
  68.         .priority = NF_IP_PRI_FIRST,
  69. };

  70. static struct nf_hook_ops nf_in =
  71. {
  72.         .hook = nf_hook_in,
  73.         .hooknum = NF_INET_LOCAL_IN,
  74.         .pf = PF_INET,
  75.         .priority = NF_IP_PRI_FIRST,
  76. };       

  77. static int __init init(void)
  78. {
  79.         nf_register_hook(&nf_pre);
  80.         nf_register_hook(&nf_in);  
  81.     printk(KERN_ALERT "insmod mulpath successful!\n");  
  82.         return 0;
  83. }

  84. static void __exit exit(void)
  85. {     
  86.         nf_unregister_hook(&nf_pre);
  87.         nf_unregister_hook(&nf_in);   
  88.         printk(KERN_ALERT "rmmod mulpath successful!\n");
  89. }

  90. module_init(init);
  91. module_exit(exit);
复制代码

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
2 [报告]
发表于 2015-04-29 10:31 |只看该作者
钩子函数我理解,但是我很不理解这怎么成了多径并发的?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2015-04-29 11:07 |只看该作者
跟基于tos的路由配合吧(策略路由ip route xxx)。
相当于一个报文,先按照tos=4路由一次,再按照tos=8路由一次。
并且tos=4的时候不希望本地接收。

由于只进行了skb_clone,data部分还是被原始skb和新的skb1共享的,如果skb被缓存在队列上(tc qdisc或者网卡的ring),
理论上对skb1的修改(比如tos/check/以及后续的dest mac)还是有可能体现到原始skb上的。

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
4 [报告]
发表于 2015-04-29 11:56 |只看该作者
谢谢,我刚分析的也是这个差不多的意思。但是我很不理解这个地方

比如当数据包第一次被拦截进入nf_hook_pre函数之后,如果TOS=4,那么数据包被路由或者被本地接收,当然在被本地接受后悔在nf_hook_in中丢掉数据包;也就是数据包在TOS=4的时候要么会被丢弃,要么会被路由出去;
而在TOS=8的时候要么被接收,要么被路由出去。
是这样的吗?
如果TOS=4的时候被路由出去,TOS=8时候被接收,这我还能理解是多径传输,其他的情况都不是吧、

回复 3# nswcfd


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
5 [报告]
发表于 2015-04-29 14:36 |只看该作者
不一定非得“本地 + 转发”才叫多路,“转发1 + 转发2”也可以吧。
只要命中不同的路由(比如选择不同的出口,或者使用不同的下一跳)不就是multi path了么,
虽然它们在netfilter下的code path都是一样的……(严格说来也有区别)

至于“多径”传输的本义和既定应用场景,估计还得找作者本人问问。

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
6 [报告]
发表于 2015-04-29 15:32 |只看该作者
好,我已经在给这位师兄发邮件了。谢谢你回复 5# nswcfd


   

论坛徽章:
0
7 [报告]
发表于 2015-05-26 21:51 |只看该作者
回复 1# 九阳神功爱喝茶
你好, 我想问下你问的结果是什么呀?
我的理解是:
如果数据包的tos == 4 且目的地址是本地的话,该数据包则丢弃;
如果数据包的tos == 4 且目的地址不是本地的话,则该数据包转发;
如果数据包的tos == 8 则该数据包要么被接受,要么被转发

如果TOS == 4的时候被路由出去,TOS == 8时候被接收的情况不会发生吧?
因为在 TOS==4 和 TOS == 8 的时候,目的地址是确定的呀?除非在tos == 8 的时候改变目的地址为本机,这样才会发生吧,但是在代码中没有对目的地址做更改呀? 所以我认为不会发生(除非在其他地方做了处理)。

   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 2015-05-27 16:52 |只看该作者
揣测作者的原意,在代码之外,在命令行配置层面,至少有两条基于tos的策略路由(ip rule + ip route)。

路由不改变目的IP,只是选择不同的出口或下一跳(体现在对目的MAC的改变上,ARP子系统)

论坛徽章:
0
9 [报告]
发表于 2015-05-29 18:08 |只看该作者
回复 8# nswcfd

嗯 嗯,很有可能是这样做的!


   

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
10 [报告]
发表于 2015-06-07 20:55 |只看该作者
厉害,我仔细看了下他的论文,确是是这个意思。不过他这样设计我觉得有个问题:接收方最后还是只能收到TOS=8的这条路来的数据包,所以并不是传统意义上只要有一个OK就可以了的。
nswcfd 发表于 2015-05-27 16:52
揣测作者的原意,在代码之外,在命令行配置层面,至少有两条基于tos的策略路由(ip rule + ip route)。

...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP