免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

Linux内核发送构造数据包的方式 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2009-11-09 14:13 |只看该作者
原帖由 godbach 于 2009-11-9 11:20 发表

这两种方式的流程是不一样的。一个是按照NF框架进行处理,走完LOCALOUT,还要经过POSTROUTING,最后才会调用到dev_queue_xmit,这中间做了多少工作,你就得了解一下NF框架的处理流程了。

而直接调用dev_qu ...



问题解决。
是我自己的原因,可以在hook中使用dev_queue_xmit()直接发送自己封装的包,前提是,必须手动路由,还必须把路由过的skb->dst,hh = dst->hh;提取出来,在手动封装已经路由过,arp过的mac头,接着就可以放在发送函数上了。

一切还是要谢谢楼主的帮组。

评分

参与人数 1可用积分 +15 收起 理由
godbach + 15 好方法,感谢分享。

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
62 [报告]
发表于 2009-11-09 14:35 |只看该作者
呵呵,惭愧。都是你自己实践的结果啊。

论坛徽章:
0
63 [报告]
发表于 2009-11-10 10:27 |只看该作者
原帖由 godbach 于 2009-11-9 14:35 发表
呵呵,惭愧。都是你自己实践的结果啊。


不不,都是斑竹的热情和帮助,才有结果。再次谢谢!

论坛徽章:
0
64 [报告]
发表于 2010-10-14 16:58 |只看该作者
本帖最后由 __dreamcatcher 于 2010-10-14 17:28 编辑
# /*重新计算TCP校验和*/
#         tcph->check = 0;
#         tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr),
#                                    nskb->nh.iph->saddr,
#                                    nskb->nh.iph->daddr,
#                                    csum_partial((char *)tcph,
#                                                 sizeof(struct tcphdr), 0));
#

Godbach 发表于 2009-09-02 13:04


Godbach兄,我对这个tcp_v4_check()函数一直不是很理解,最不明白的就是csum_partial()的使用,因为对其中的参数含义不是很明白,因为看到对它的调用中有的用到了skb_>csum,
例如:
  1. void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
  2. {
  3.     struct inet_sock *inet = inet_sk(sk);
  4.     struct tcphdr *th = tcp_hdr(skb);

  5.     if (skb->ip_summed == CHECKSUM_PARTIAL) {
  6.         th->check = ~tcp_v4_check(len, inet->saddr,
  7.                      inet->daddr, 0);
  8.         skb->csum_start = skb_transport_header(skb) - skb->head;
  9.         skb->csum_offset = offsetof(struct tcphdr, check);
  10.     } else {
  11.         th->check = tcp_v4_check(len, inet->saddr, inet->daddr,
  12.                      csum_partial((char *)th,
  13.                          th->doff << 2,
  14.                          skb->csum));
  15.     }
  16. }
复制代码
就不明白skb->csum的意义,所以一直都不是很明白,能否详细给讲解一下?谢谢!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
65 [报告]
发表于 2010-10-14 18:02 |只看该作者
skb->ip_summed 和 skb->csum 是一对相关联的成员。
建议首先了解一下skb->ip_summed的含义,对于接收的包和发出的包,分别是什么意义。

深入理解Linux 网络内幕上有讲解的

论坛徽章:
0
66 [报告]
发表于 2010-10-14 19:40 |只看该作者
恩,好的,谢谢Godbach兄指点了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
67 [报告]
发表于 2010-10-14 20:03 |只看该作者
CHECKSUM_PARTIAL

对于发出的包,这个地方应该是告诉系统是否有硬件计算 TCP 的校验和

论坛徽章:
0
68 [报告]
发表于 2010-10-15 16:44 |只看该作者
绝对是好文章,小弟收藏了

论坛徽章:
0
69 [报告]
发表于 2010-12-03 11:24 |只看该作者
挖坟勿怪,看到大家的回答没有搔到痒处,不说不痛快。。。

对于楼主的两个疑问,

1. 为什么要送到LOCAL_OUT?
本地发出的包必须经过此点,RST包是本地发出的包,当然要经过LOCAL_OUT

2. 为什么需要重新查路由?
正常来说,LOCAL_OUT之后才应该查路由,实际上Linux在实现时,LOCAL_OUT出去的包已经查到路由了,IP core反而不查。所以如果修改报文后要重新路由,只能自己来。
这里简单解释下为什么LOCAL_OUT已经查到路由,与大家提到的neigh绑定到dst上类似,dst也被绑定到sock上,用于加速。基本上只有首包需要查路由,后续的包从sock直接得到路由(dst)。

对于大家提到的二、三层关系:
Linux三层并不与二层(dev_queue_xmit)直接联系,而是交给neighbor层。这是一个隔层(shim),用来做L3到L2地址映射。与此类似,四层与三层间也有隔层,添加IP头正是在这里,添加的过程中,又涉及到源地址选择等问题。而这些问题,IP core并不关心。

论坛徽章:
0
70 [报告]
发表于 2011-05-19 10:41 |只看该作者
请问各位兄台,我现在想在forward 里面构造一个数据包,并且接着原来的数据包一起发送出去,换句话说就是在一个hook函数中发送两个数据包,这怎么实现?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP