diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 0a35355fb0f3..fb446f01a65d 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -275,8 +275,9 @@ struct fib_dump_filter { struct net_device *dev; }; -int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, - struct fib_result *res, int fib_flags); +int fib_table_lookup(struct net *net, struct fib_table *tb, + const struct flowi4 *flp, struct fib_result *res, + int fib_flags); int fib_table_insert(struct net *, struct fib_table *, struct fib_config *, struct netlink_ext_ack *extack); int fib_table_delete(struct net *, struct fib_table *, struct fib_config *, @@ -323,7 +324,8 @@ static inline int fib_lookup(struct net *net, const struct flowi4 *flp, tb = fib_get_table(net, RT_TABLE_MAIN); if (tb) - err = fib_table_lookup(tb, flp, res, flags | FIB_LOOKUP_NOREF); + err = fib_table_lookup(net, tb, flp, res, + flags | FIB_LOOKUP_NOREF); if (err == -EAGAIN) err = -ENETUNREACH; @@ -387,14 +389,14 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp, tb = rcu_dereference_rtnl(net->ipv4.fib_main); if (tb) - err = fib_table_lookup(tb, flp, res, flags); + err = fib_table_lookup(net, tb, flp, res, flags); if (err != -EAGAIN) goto out; tb = rcu_dereference_rtnl(net->ipv4.fib_default); if (tb) - err = fib_table_lookup(tb, flp, res, flags); + err = fib_table_lookup(net, tb, flp, res, flags); if (err == -EAGAIN) err = -ENETUNREACH; diff --git a/include/trace/events/fib.h b/include/trace/events/fib.h index feb28b359eff..341905b5edf3 100644 --- a/include/trace/events/fib.h +++ b/include/trace/events/fib.h @@ -15,9 +15,10 @@ TRACE_EVENT(fib_table_lookup, TP_PROTO(u32 tb_id, const struct flowi4 *flp, - const struct fib_nh_common *nhc, int err), + const struct fib_nh_common *nhc, int err, + const struct net *net), - TP_ARGS(tb_id, flp, nhc, err), + TP_ARGS(tb_id, flp, nhc, err, net), TP_STRUCT__entry( __field( u32, tb_id ) diff --git a/net/core/filter.c b/net/core/filter.c index 70dc621672f2..3ee1a093337e 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -6413,7 +6413,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params, if (unlikely(!tb)) return BPF_FIB_LKUP_RET_NOT_FWDED; - err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF); + err = fib_table_lookup(net, tb, &fl4, &res, FIB_LOOKUP_NOREF); } else { if (flags & BPF_FIB_LOOKUP_MARK) fl4.flowi4_mark = params->mark; diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 2ed4c706ca9e..c106d56eb2f7 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -157,7 +157,8 @@ struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref) */ local = fib_get_table(net, RT_TABLE_LOCAL); if (local && - !fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) && + !fib_table_lookup(net, local, &fl4, &res, + FIB_LOOKUP_NOREF) && res.type == RTN_LOCAL) result = FIB_RES_DEV(res); } else { diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 8a3dc04e8cac..c80c1b36f1fd 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -243,7 +243,8 @@ static inline unsigned int __inet_dev_addr_type(struct net *net, table = fib_get_table(net, tb_id); if (table) { ret = RTN_UNICAST; - if (!fib_table_lookup(table, &fl4, &res, FIB_LOOKUP_NOREF)) { + if (!fib_table_lookup(net, table, &fl4, &res, + FIB_LOOKUP_NOREF)) { struct fib_nh_common *nhc = fib_info_nhc(res.fi, 0); if (!dev || dev == nhc->nhc_dev) @@ -1400,7 +1401,8 @@ static void nl_fib_lookup(struct net *net, struct fib_result_nl *frn) local_bh_disable(); frn->tb_id = tb->tb_id; - frn->err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF); + frn->err = fib_table_lookup(net, tb, &fl4, &res, + FIB_LOOKUP_NOREF); if (!frn->err) { frn->prefixlen = res.prefixlen; diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index 060501b376a8..28ba35125383 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c @@ -136,7 +136,7 @@ INDIRECT_CALLABLE_SCOPE int fib4_rule_action(struct fib_rule *rule, tb_id = fib_rule_get_table(rule, arg); tbl = fib_get_table(rule->fr_net, tb_id); if (tbl) - err = fib_table_lookup(tbl, &flp->u.ip4, + err = fib_table_lookup(rule->fr_net, tbl, &flp->u.ip4, (struct fib_result *)arg->result, arg->flags); diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index db030bc26b6d..20da68240f61 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -1224,7 +1224,7 @@ static int fib_check_nh_v4_gw(struct net *net, struct fib_nh *nh, u32 table, tbl = fib_get_table(net, table); if (tbl) - err = fib_table_lookup(tbl, &fl4, &res, + err = fib_table_lookup(net, tbl, &fl4, &res, FIB_LOOKUP_IGNORE_LINKSTATE | FIB_LOOKUP_NOREF); diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 248514dce0cd..4a800fdf1ad1 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1415,8 +1415,9 @@ bool fib_lookup_good_nhc(const struct fib_nh_common *nhc, int fib_flags, } /* should be called with rcu_read_lock */ -int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, - struct fib_result *res, int fib_flags) +int fib_table_lookup(struct net *net, struct fib_table *tb, + const struct flowi4 *flp, struct fib_result *res, + int fib_flags) { struct trie *t = (struct trie *) tb->tb_data; #ifdef CONFIG_IP_FIB_TRIE_STATS @@ -1433,7 +1434,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, n = get_child_rcu(pn, cindex); if (!n) { - trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN); + trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN, net); return -EAGAIN; } @@ -1520,7 +1521,8 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, */ if (IS_TRIE(pn)) { trace_fib_table_lookup(tb->tb_id, flp, - NULL, -EAGAIN); + NULL, -EAGAIN, + net); return -EAGAIN; } #ifdef CONFIG_IP_FIB_TRIE_STATS @@ -1567,7 +1569,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, #ifdef CONFIG_IP_FIB_TRIE_STATS this_cpu_inc(stats->semantic_match_passed); #endif - trace_fib_table_lookup(tb->tb_id, flp, NULL, err); + trace_fib_table_lookup(tb->tb_id, flp, NULL, err, net); return err; } if (fi->fib_flags & RTNH_F_DEAD) @@ -1608,7 +1610,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, #ifdef CONFIG_IP_FIB_TRIE_STATS this_cpu_inc(stats->semantic_match_passed); #endif - trace_fib_table_lookup(tb->tb_id, flp, nhc, err); + trace_fib_table_lookup(tb->tb_id, flp, nhc, err, net); return err; }