| ||
从网卡开始收数据包开始跟踪一个数据包的接受过程,到ip_rcp()这个函数的时候,他的第一句话是中第一行struct iphdr *iph=skb->nh.iph |
| ||
2.6.9 dev.c ========================================= 自己的评论: 网卡接收到数据后,在接收函数中分配一个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()。 |