linux内核网络子模块学习笔记_第1页
linux内核网络子模块学习笔记_第2页
linux内核网络子模块学习笔记_第3页
linux内核网络子模块学习笔记_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 .网络设备的分组处理。如下所示:1 .驱动程序安装调用: net_dev_init2 .在2. net_dev_init中设置分组处理函数process_backlogSD-backlog.poll=process _ backlog;3 .在3. process_backlog中调用_netif_receive_skb(skb )4 .找到并处理与4._netif_receive_skb对应的包处理函数类型=sk B-协议;list _ for _ each _ entry _ rcu (类型)ptype _ base ntohs (type ) ptype _ hash _ mask

2、,list222222222200000000if (类型-类型=类型)(ptype-dev=null _ or _ dev| ptype-dev=sk B- dev|请参见ptype-dev=orig _ dev ) )PK (K _ prev )ret=deliver_skb(skb,pt_prev,orig_dev )pt_prev=ptype;以下以下ret=pt_prev-func(skb,skb-dev,pt_prev,orig_dev )以上数据包被送到上层。2.IP层的分组处理。在ptype_base数组中注册处理函数(调用dev_add_pack )数据inet_init中的

3、dev_add_pack(ip_packet_type )2 .请参见staticstructpacket _ typeip _ packet _ type _ _ read _ mostly=1. type=cpu_to_be16(ETH_P_IP ). func=ip_rcv. GSO _ send _ check=inet _ GSO _ send _ check. gso_segment=inet_gso_segment. gro_receive=inet_gro_receive. gro_complete=inet_gro_complete3 .在3. ip_rcv中进行ip正确性检

4、查后,调用:return NF_HOOK(NFPROTO_IPV4,NF_INET_PRE_ROUTING,skb,dev,NULL )ip_rcv_finish3 .在3. ip_recv_finish中PS (PS )=nullinterr=IP _ route _ input _ noref (skb,iph-daddr,iph-saddr,iph-tos、skb-dev;以下return dst_input(skb )在此,ip_route_input_noref是skb_dst(skb )的设置,dst_input(skb )是skb_dst(skb)-input(skb )。3.I

5、P层路由处理. skb _ dst (skb ) -设置input函数的过程。1.ip_route_input_noref调用ip_route_input_ip _ route _ input _ common (structsk _ buff * skb,_be32 daddr,_be32 saddr,在u8 tos,struct net_device *dev,bool noref中PK (! rt_caching(net) /*路由加速缓冲区*/goto skip_cache;慢速搜索路径res=ip_route_input_slow(skb、daddr、saddr

6、、tos、dev )以下是研究的重点。fl4.flowi4_oif=0;fl4.flowi4_iif=dev-ifindex;fl4.flowi4_mark=skb-mark;fl4.flowi4_tos=tos;fl4.flowi4_ scope=rt _ scope _ universe;fl4.daddr=daddr;fl4.saddr=saddr;fib_lookup(net、fl4、res )IP _ MK路由输入(skb,res,fl4,in_dev,daddr,saddr,tos )以上两个函数之一是搜索,如果找到rt_intern_hash,则将其设置为skb_dst(skb)

7、-input是的。 现在正在研究数据结构!结构流动41 .含义:2 .角色:现在被用作匹配源。struct fib_result1 .意义: PS匹配结果2 .角色:保存匹配的fib结果struct fib_table struct hlist_node tb_hlist;u32tb_idinttb_default;inttb_num_default;unsigned longtb_data0; -新内核使用的数据结构是结构树的指针1 .意义: fib表转发信息表2 .作用:传输信息结构的总入口3 .获取:结构表=fib _ get _ table (net,RT_TABLE_MAIN )st

8、ruct trie struct rt_trie_node _rcu *trie;1 .含义:词典树2 .作用: trie词典的木头3 .获取:结构树* t=(结构树* ) TB _ data;struct rt_trie_node ;无符号长父件;t_key key;1 .含义:路由表词典树节点2 .角色:路由表字符黄树节点,第一个节点指向t-trie指针3 .获取: struct rt _ trie _ noden=rcu _ de参考(t-trie )struct tnode 无符号长父件;t_key key;无符号char pos;/* 2记录(密钥长度)位已完成* /无符号角位;/*

9、 2记录(密钥长度)位已完成* /unsigned int full_children; /* KEYLENGTH bits needed */unsigned int empty_children; /* KEYLENGTH bits needed */表示union 结构rcu _头部rcu;struct work_struct work;结构节点*节点_ free;struct rt _ trie _ node _ _ rcu * child 0; -子节点。 可以从强制t_trie_node进行转换1 .意思: 什么?什么?2 .作用: 什么?什么?取得3. structtnodepn

10、=(struct tnode * ) n检索词典数的方法1. t_KEY key=ntohl(flp-daddr )将主机程序目的地IP设为key2 .根据cindex=tkey _ extract _ bits (mask _ pfx (key,current_prefix_length ),pos,bits) k计算索引值。3. n=tnode_get_child_rcu(pn,cindex) childcindex;4.PS (PS (n ) ) /如果是叶的话检查ret=check_leaf(tb,t ) (结构层* ) n,key,flp,res,fib_flags) /叶if (ret 0) /失败.逆转goto backtrace;goto found; /找到了以下检查级别* n,密钥,flp,res,fib_flags参数:tb fib_get_table(net,RT_TABLE_MAIN )结构树* ) t B- TB _ data;n tnode_get_child_rcu(pn,cindex )/struct rt _ trie _ node * child cindex ;key ntohl(flp-daddr )学习资源http:/博客. /link.PHP? URL=/do

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论