linuxカーネルポリシールーティングの検索


4.4.1ポリシールーティングポリシー規則の検索関数fib_rules_lookup
機能:
(1)rules_を巡るListチェーンテーブル;
(2)呼び出しfib_rule_matchはルールマッチングを行う(3)関数ポインタactionを呼び出し、ルーティングテーブル項目の検索を行う.(4)arg->ruleをルールのヘッダアドレスに向ける.
// 
//ops  
//arg  
int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl,
             int flags, struct fib_lookup_arg *arg)
{
    struct fib_rule *rule;
    int err;
    rcu_read_lock();
    list_for_each_entry_rcu(rule, &ops->rules_list, list) // ops->rules_list fib_rule 
    {
        DEBUG_V4Route("
%s-->table:%u ifindex:%d mark:0x%x mark_mask:0x%x flags:0x%x
",__FUNCTION__,\ rule->table,rule->ifindex,rule->mark,rule->mark_mask,rule->flags); jumped: if (!fib_rule_match(rule, ops, fl, flags))// continue; if (rule->action == FR_ACT_GOTO) { struct fib_rule *target; target = rcu_dereference(rule->ctarget); if (target == NULL) { continue; } else { rule = target; goto jumped; } } else if (rule->action == FR_ACT_NOP) continue; else err = ops->action(rule, fl, flags, arg);//fib4_rule_action if (err != -EAGAIN) { fib_rule_get(rule); arg->rule = rule;//arg->rule goto out; } } err = -ESRCH; out: rcu_read_unlock(); return err; }

4.4.2共通ルールの照合
機能:
(1)インタフェースindex、markなどをマッチングする;
(2)プロトコル関連matchを呼び出してマッチングする.
static int fib_rule_match(struct fib_rule *rule, struct fib_rules_ops *ops,
              struct flowi *fl, int flags)
{
    int ret = 0;
    // fib_rule flowi 
    if (rule->ifindex && (rule->ifindex != fl->iif))// index 
        goto out;
    if ((rule->mark ^ fl->mark) & rule->mark_mask)//mark 
        goto out;
    ret = ops->match(rule, fl, flags);// ,ipv4 fib4_rule_match
        DEBUG_V4Route("%s-->rule->flags:0x%x ret:%d
",__FUNCTION__,rule->flags,ret); out: return (rule->flags & FIB_RULE_INVERT) ? !ret : ret;// fib_rule , }

4.4.2.1契約関連規則の照合
機能:
ソースipアドレス、宛先ipアドレス、tosのマッチング操作
//ipv4 
// IP、 IP、tos , 1, 0
static int fib4_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
{
    struct fib4_rule *r = (struct fib4_rule *) rule;
    __be32 daddr = fl->fl4_dst;
    __be32 saddr = fl->fl4_src;
    // fib_rule    flowi  
    if (((saddr ^ r->src) & r->srcmask) ||
        ((daddr ^ r->dst) & r->dstmask))// IP、 IP 
        return 0;
    if (r->tos && (r->tos != fl->fl4_tos))//tos 
        return 0;
    return 1;
}

4.4.3ルーティングテーブル項目を調べる
機能:
(1)対応するルーティングテーブルを取得する.
(2)要求に適合するルーティング項目の検索
static int fib4_rule_action(struct fib_rule *rule, struct flowi *flp,
                int flags, struct fib_lookup_arg *arg)
{
    int err = -EAGAIN;
    struct fib_table *tbl;

    switch (rule->action) {
    case FR_ACT_TO_TBL:// ID 
        break;

    case FR_ACT_UNREACHABLE:
        err = -ENETUNREACH;
        goto errout;

    case FR_ACT_PROHIBIT:
        err = -EACCES;
        goto errout;

    case FR_ACT_BLACKHOLE:
    default:
        err = -EINVAL;
        goto errout;
    }

        DEBUG_V4Route("%s-->table:%u
",__FUNCTION__,rule->table); if ((tbl = fib_get_table(rule->fr_net, rule->table)) == NULL)// id , goto errout; err = tbl->tb_lookup(tbl, flp, (struct fib_result *) arg->result);// ipv4 fn_hash_lookup if (err > 0) err = -EAGAIN; errout: return err; }