linuxカーネルポリシールーティングの検索
3768 ワード
4.4.1ポリシールーティングポリシー規則の検索関数fib_rules_lookup
機能:
(1)rules_を巡るListチェーンテーブル;
(2)呼び出しfib_rule_matchはルールマッチングを行う(3)関数ポインタactionを呼び出し、ルーティングテーブル項目の検索を行う.(4)arg->ruleをルールのヘッダアドレスに向ける.
4.4.2共通ルールの照合
機能:
(1)インタフェースindex、markなどをマッチングする;
(2)プロトコル関連matchを呼び出してマッチングする.
4.4.2.1契約関連規則の照合
機能:
ソースipアドレス、宛先ipアドレス、tosのマッチング操作
4.4.3ルーティングテーブル項目を調べる
機能:
(1)対応するルーティングテーブルを取得する.
(2)要求に適合するルーティング項目の検索
機能:
(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;
}