注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

TCP/IP驱动十三 ——内核中的路由2  

2013-09-05 15:06:07|  分类: TCPIP驱动 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

TCP/IP驱动十三  ——内核中的路由2

路由在网络通信中其实是相当重要的,所以这里分开来多写几次,这里有几个主要的结构体:

Fib_table,fib_hash,fn_zone,fib_node,fn_alias,fib_info它们的关系是fib_table中有一个fn_zone的链表,每个fn_zone中通过fib_hashfib_node连接起来,而每个fib_node中的fn_alias中又包含fib_info

更具体的请参照网上的资料,有图有真相。

原来一直在想路由的初始化是从哪里开始的,在“TCP/IP驱动十二”中简单说明了一下,这里再总结一下。

路由的设置有三个路线:

1、  使用net-tools,其实际上是进入ip_rt_ioctl()

Ioctl()-sys_icotl()-do_vfs_ioctl()-vfs_ioctl()-sock_ioctl()-inet_ioctl()-ip_rt_ioctl()

2、  使用netlink调用inet_rtm_newroute()或者inet_rtm_delroute()

3、  使用通知链

Register_netdevice_notifier(&fib_netdev_notifier)

Register_inetaddr_notifier(&fib_inetaddr_notifier)

 

在这里有一个[net\ipv4\fib_semantics.c中的struct fib_info *fib_create_info(struct fib_config *cfg)函数中]

 

struct rtnexthop

{

         unsigned short                   rtnh_len;

         unsigned char           rtnh_flags;

         unsigned char           rtnh_hops;

         int                       rtnh_ifindex;

};

 

这个结构体指定了路由过程中跳转结构的信息,这些信息将会被设置到fib_nh中,对这个疑问主要是在第一个参数rtnh_len,这个参数是指这个结体的个数,供下面遍历使用的。

static int fib_count_nexthops(struct rtnexthop *rtnh, int remaining)

{

         int nhs = 0;

 

         while (rtnh_ok(rtnh, remaining)) {

                   nhs++;

                   rtnh = rtnh_next(rtnh, &remaining);

         }

 

         /* leftover implies invalid nexthop configuration, discard it */

         return remaining > 0 ? 0 : nhs;

}

static inline int rtnh_ok(const struct rtnexthop *rtnh, int remaining)

{

         return remaining >= sizeof(*rtnh) &&

                rtnh->rtnh_len >= sizeof(*rtnh) &&

                rtnh->rtnh_len <= remaining;

}

 

static inline struct rtnexthop *rtnh_next(const struct rtnexthop *rtnh,

                                         int *remaining)

{

         int totlen = NLA_ALIGN(rtnh->rtnh_len);

 

         *remaining -= totlen;

         return (struct rtnexthop *) ((char *) rtnh + totlen);指向下一个rtnexthop结构

}

还有就是NLA_ALIGN这个宏,其实是算内存中字节对齐后的实际长度的,这个如果大家明白求一个结构体或者类的实际占用大小空间的方法就清楚了。不过看这个东西的设计对不对齐应该是一样的啊。

内核有的时候儿真是不知道怎么想的。

努力!!!

  评论这张
 
阅读(593)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017