创建一个路由节点struct fib_node

在为一个网络设备接口的IP地址创建四个路由项(本地接收,子网广播,子网单播,本地接收的广播)的时候,需要为每个路由项创建一个路由节点,struct fib_node结构体表示一个路由节点,下面是其定义:
    struct fib_node{
        struct hlist_node   fn_hash;
        struct list_head    fn_alias;
        u32         fn_key;
    };
    一个路由节点总是维护在一个路由域struct fn_zone中,fn_hash成员就是用于把这个路由节点放到struct fn_zone结构体中的,fn_key是这个路由节点的IP地址或者网络号(对于本地接收路由,它就是代表本地网络设备接口的IP地址,如 172.16.48.2,对于子网单播,它就是子网号,比如172.16.48.0)。对于子网号172.16.48.0,其子网掩码就是 255.255.255.0,该路由项的目的地址长度就是24。而对于本地接收和广播路由,其掩码是255.255.255.255,目的地址长度是 32,同一目的地址长度的路由节点被维护在同一个路由域struct fn_zone中。
    全局变量fn_hash_kmem是一个后备高速缓冲区,所有的路由节点都在这块区域分配。
    fn_alias是一个list,其节点是一个结构体struct fib_alias,其定义如下:
    struct fib_alias{
        struct list_head    fa_list;
        struct rcu_head rcu;
        struct fib_info     *fa_info;
        u8          fa_tos;
        u8          fa_type;
        u8          fa_scope;
        u8          fa_state;
    };
    它实际存放路由节点的关键信息,它之所以以一个list的形式存放在struct fib_node中,是因为,比如,127.10.0.1和127.0.0.1两个A类IP地址,它们创建的广播路由的fn_key都是 127.255.255.255,所以共享一个路由节点,但是它们有各自的struct fib_alias。其成员fa_info指向相应的路由信息节点。
    下面可以看一个比较典型的路由节点,比如本地网络设备接口eth0的子网单播路由的路由节点,其内容如下:    strcut fib_node{
        .fn_alias{
            .fa_info{
                .fib_protocol   = RTPROT_KERNEL;
                .fib_nhs        = 1;
                .fib_flags      = 0;
                .fib_prefsrc    = 172.16.48.2;
                struct fib_nh{
                    .nh_oif     = indexof(eth0);
                    .nh_flags   = 0;
                    .nh_weight  = 1;
                    .nh_scope   = RT_SCOPE_HOST;
                    .nh_dev     = eth0;
                }
            }
            .fa_tos = 0;
            .fa_type = RTN_UNICAST;
            .fa_scope = RT_SCOPE_LINK;
            .fa_state = 0;
        }
        .fn_key = 172.16.48.0;
    }
    这个路由节点的目的地址长度是24(子网掩码是255.255.255.0),所以它被放到fz_order的值为24的路由域fz_zone中去。关于路由域和路由表,下回分解。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值