如何从链路层收到的数据报中访问IP层和TCP层头信息?

收包时ip_rcp()中第一行skb->nh.iph以前在那里被赋值!  

从网卡开始收数据包开始跟踪一个数据包的接受过程,到ip_rcp()这个函数的时候,他的第一句话是中第一行struct iphdr *iph=skb->nh.iph

可是我看的源码中并没有给skb->nh.iph赋值,有的只是赋了skb->dev之类的,所以这里这个skb->nh.iph是不能用的,我觉得。


不知道他是在那给赋值的,高手看一下:)

Re: 收包时ip_rcp()中第一行skb->nh.iph以前在那里被赋值! [re:linuxask] 

2.6.9 dev.c

netif_receive_skb()
skb->h.raw = skb->nh.raw = skb->data;

=========================================

自己的评论:

网卡接收到数据后,在接收函数中分配一个skb的空间,把数据从网卡芯片上的buffer拷贝到skb->data为起始地址的内存中,此时skb->data中是以目的MAC地址,源MAC地址起始的MAC帧。此时skb结构中其它变量为0。但是上面的那个赋值语句将h和nh中指针的位置设置成与skb->data相同,也就是

此时(链路层)skb->data指向了MAC头,IP层头部,TCP层头部。

这就意味着这个时候如果你想访问h(tcp头)中的变量,必须这样:

struct tcphdr *temp;

temp = (struct tcphdr *)((char *)skb->data + sizeof(struct iphdr));

此时temp的指针指向了数据报中TCP头结构--struct tcphdr。

如果你想访问IP头信息,则 struct iphdr *iph = skb->nh.iph

此时iph指向了IP头结构---struct iphdr。

在eth_trans_type的开始去掉mac头后,上传到IP层,IP层负责接收的函数是

ip_rcv()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值