- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
经典--IP包接收过程
IP包的接收过程
IP包的接收过程
1) IP包由包头和数据区组成, 包头由IP头(iphdr)和IP选项区组成, IP头的开始4位为版本号, 下4位为包头32比特字数, 因此IP包头最大长度为64字节, 最小长度为IP头长度(20字节), 数据区起始于32位边界上. 当包头长度大于IP头长度时, 从IP头开始的区域为IP选项区. 2) IP包接收器(ip_rcv)接收帧类型为ETH_P_IP(0x0800)的包, 它首先检查包的正确性, 再将输入包过滤器进行过滤, 再将过滤包绑定到输出路由, 分析其选项区,最后从路由目的入口输出, 根据不同的路由类型, 输入到IP转发器(ip_forward)或IP本地分发器(ip_local_deliver)以及IP同播转发器(ip_mc_output)中.3) 如果系统允许接收带有信源路由选项(IPOPT_LSRR或IPOPT_SSRR)的IP包, 如果是本地包, 则将包重新绑定到信源路由表第1项地址所指定的路由上, 如果该地址是本地地址, 则用它替换IP头的目的地址并分析下一信源路由地址.; net/ipv4/ip_output.c:static struct packet_type ip_packet_type ={__constant_htons(ETH_P_IP),NULL, /* All devices */ip_rcv,(void*)1,NULL,};void __init ip_init(void){dev_add_pack(ip_packet_type);ip_rt_init();inet_initpeers();#ifdef CONFIG_IP_MULTICASTproc_net_create(igmp, 0, ip_mc_procinfo);#endif}; net/ipv4/ip_input.c:/** Main IP Receive routine.*/ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt){struct iphdr *iph = skb-nh.iph;/* When the interface is in promisc. mode, drop all the crap* that it receives, do not try to analyse it.*/if (skb-pkt_type == PACKET_OTHERHOST)goto drop;IP_INC_STATS_BH(IpInReceives);if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)goto out;/** RFC1122: 3.1.2.2 MUST silently discard any IP frame that fails the checksum.** Is the datagram acceptable?** 1. Length at least the size of an ip header* 2. Version of 4* 3. Checksums correctly. [Speed optimisation for later, skip loopback checksums]* 4. Doesnt have a bogus length*/if (skb-len sizeof(struct iphdr) || skb-len (iph-ihl2))goto inhdr_error; if (iph-ihl 5 || iph-version != 4 || ip_fast_csum((u8 *)iph, iph-ihl) != 0)goto inhdr_error; {__u32 len = ntohs(iph-tot_len); if (skb-len len || len (iph-ihl2))goto inhdr_error;/* Our transport medium may have padded the buffer out. Now we know it* is IP we can trim to the true length of the frame.* Note this now means skb-len holds ntohs(iph-tot_len).*/__skb_trim(skb, le
文档评论(0)