^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _FIB_LOOKUP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _FIB_LOOKUP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <net/ip_fib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <net/nexthop.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) struct fib_alias {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct hlist_node fa_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct fib_info *fa_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) u8 fa_tos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) u8 fa_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) u8 fa_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) u8 fa_slen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) u32 tb_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) s16 fa_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) u8 offload:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) trap:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) unused:6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define FA_S_ACCESSED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* Dont write on fa_state unless needed, to keep it shared on all cpus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) static inline void fib_alias_accessed(struct fib_alias *fa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) if (!(fa->fa_state & FA_S_ACCESSED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) fa->fa_state |= FA_S_ACCESSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* Exported by fib_semantics.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) void fib_release_info(struct fib_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct fib_info *fib_create_info(struct fib_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct netlink_ext_ack *extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) int fib_nh_match(struct net *net, struct fib_config *cfg, struct fib_info *fi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct netlink_ext_ack *extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) bool fib_metrics_match(struct fib_config *cfg, struct fib_info *fi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct fib_rt_info *fri, unsigned int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, int dst_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u32 tb_id, const struct nl_info *info, unsigned int nlm_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static inline void fib_result_assign(struct fib_result *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct fib_info *fi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* we used to play games with refcounts, but we now use RCU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) res->fi = fi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) res->nhc = fib_info_nhc(fi, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct fib_prop {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u8 scope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) extern const struct fib_prop fib_props[RTN_MAX + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #endif /* _FIB_LOOKUP_H */