linux路由转发表的检索过程(fib_lookup)

2019独角兽企业重金招聘Python工程师标准>>> ...
摘要由CSDN通过智能技术生成

1) 转发表(fib_table)是记录IP转发信息的索引表, 转发表的每一记录(节点)描述了具有某一类目的地址的IP包应该使用哪一输出设备发给哪一目的主机. 转发表记录按网络区进行分类, 每一网络区描述了在特定网络地址位长下具有不同网络号的目的地址的转发信息. 第0区的网络地址位长为0, 与所有的IP地址都匹配, 用来描述缺省网关, 第32区的网络地址位长为32, 用来与完整的IP地址匹配. 在建立网络区时, 它们按网络地址位长从大到小的顺序排列, 在搜索IP地址时, 先从全主机地址的第32区开始匹配, 最后第0区与所有的地址都匹配, 产生缺省网关.

2) 系统至少使用两个转发表, 一个是局部转发表, 描述与所有本地地址匹配的转发信息, 另一个是主转发表, 描述与外部地址匹配的转发信息. 可以通过策略表来选择指定的转发表.

; net/ipv4/fib_rules.c fib_frontend.c fib_hash.c fib_semantics.c

static struct fib_rule *fib_rules = &local_rule; 转发策略链表

static struct fib_rule default_rule = { NULL, ATOMIC_INIT(2), 0x7FFF, RT_TABLE_DEFAULT, RTN_UNICAST, };
static struct fib_rule main_rule = { &default_rule, ATOMIC_INIT(2), 0x7FFE, RT_TABLE_MAIN, RTN_UNICAST, };
static struct fib_rule local_rule = { &main_rule, ATOMIC_INIT(2), 0, RT_TABLE_LOCAL, RTN_UNICAST, };

int fib_lookup(const struct rt_key *key, struct fib_result *res)
{
    int err;
    struct fib_rule *r, *policy;
    struct fib_table *tb;

    u32 daddr = key->dst;
    u32 saddr = key->src;

FRprintk("Lookup: %u.%u.%u.%u <- %u.%u.%u.%u ",
    NIPQUAD(key->dst), NIPQUAD(key->src));
    read_lock(&fib_rules_lock);
    for (r = fib_rules; r; r=r->r_next) { 扫描策略表
        if (((saddr^r->r_src) & r->r_srcmask) || 如果源地址不匹配
            ((daddr^r->r_dst) & r->r_dstmask) || 或者目的地址不匹配
#ifdef CONFIG_IP_ROUTE_TOS
            (r->r_tos && r->r_tos != key->tos) || 或者服务类型不等
#endif
#ifdef CONFIG_IP_ROUTE_FWMARK
            (r->r_fwmark && r->r_fwmark != key->fwmark) || 或者转发标记不等
#endif
            (r->r_ifindex && r->r_ifindex != key->iif)) 或者输入设备不等
            continue; 下一策略

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值