xref: /openbmc/linux/include/net/ip6_fib.h (revision 278002edb19bce2c628fafb0af936e77000f3a5b)
1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*
3   *	Linux INET6 implementation
4   *
5   *	Authors:
6   *	Pedro Roque		<roque@di.fc.ul.pt>
7   */
8  
9  #ifndef _IP6_FIB_H
10  #define _IP6_FIB_H
11  
12  #include <linux/ipv6_route.h>
13  #include <linux/rtnetlink.h>
14  #include <linux/spinlock.h>
15  #include <linux/notifier.h>
16  #include <net/dst.h>
17  #include <net/flow.h>
18  #include <net/ip_fib.h>
19  #include <net/netlink.h>
20  #include <net/inetpeer.h>
21  #include <net/fib_notifier.h>
22  #include <linux/indirect_call_wrapper.h>
23  #include <uapi/linux/bpf.h>
24  
25  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
26  #define FIB6_TABLE_HASHSZ 256
27  #else
28  #define FIB6_TABLE_HASHSZ 1
29  #endif
30  
31  #define RT6_DEBUG 2
32  
33  #if RT6_DEBUG >= 3
34  #define RT6_TRACE(x...) pr_debug(x)
35  #else
36  #define RT6_TRACE(x...) do { ; } while (0)
37  #endif
38  
39  struct rt6_info;
40  struct fib6_info;
41  
42  struct fib6_config {
43  	u32		fc_table;
44  	u32		fc_metric;
45  	int		fc_dst_len;
46  	int		fc_src_len;
47  	int		fc_ifindex;
48  	u32		fc_flags;
49  	u32		fc_protocol;
50  	u16		fc_type;        /* only 8 bits are used */
51  	u16		fc_delete_all_nh : 1,
52  			fc_ignore_dev_down:1,
53  			__unused : 14;
54  	u32		fc_nh_id;
55  
56  	struct in6_addr	fc_dst;
57  	struct in6_addr	fc_src;
58  	struct in6_addr	fc_prefsrc;
59  	struct in6_addr	fc_gateway;
60  
61  	unsigned long	fc_expires;
62  	struct nlattr	*fc_mx;
63  	int		fc_mx_len;
64  	int		fc_mp_len;
65  	struct nlattr	*fc_mp;
66  
67  	struct nl_info	fc_nlinfo;
68  	struct nlattr	*fc_encap;
69  	u16		fc_encap_type;
70  	bool		fc_is_fdb;
71  };
72  
73  struct fib6_node {
74  	struct fib6_node __rcu	*parent;
75  	struct fib6_node __rcu	*left;
76  	struct fib6_node __rcu	*right;
77  #ifdef CONFIG_IPV6_SUBTREES
78  	struct fib6_node __rcu	*subtree;
79  #endif
80  	struct fib6_info __rcu	*leaf;
81  
82  	__u16			fn_bit;		/* bit key */
83  	__u16			fn_flags;
84  	int			fn_sernum;
85  	struct fib6_info __rcu	*rr_ptr;
86  	struct rcu_head		rcu;
87  };
88  
89  struct fib6_gc_args {
90  	int			timeout;
91  	int			more;
92  };
93  
94  #ifndef CONFIG_IPV6_SUBTREES
95  #define FIB6_SUBTREE(fn)	NULL
96  
fib6_routes_require_src(const struct net * net)97  static inline bool fib6_routes_require_src(const struct net *net)
98  {
99  	return false;
100  }
101  
fib6_routes_require_src_inc(struct net * net)102  static inline void fib6_routes_require_src_inc(struct net *net) {}
fib6_routes_require_src_dec(struct net * net)103  static inline void fib6_routes_require_src_dec(struct net *net) {}
104  
105  #else
106  
fib6_routes_require_src(const struct net * net)107  static inline bool fib6_routes_require_src(const struct net *net)
108  {
109  	return net->ipv6.fib6_routes_require_src > 0;
110  }
111  
fib6_routes_require_src_inc(struct net * net)112  static inline void fib6_routes_require_src_inc(struct net *net)
113  {
114  	net->ipv6.fib6_routes_require_src++;
115  }
116  
fib6_routes_require_src_dec(struct net * net)117  static inline void fib6_routes_require_src_dec(struct net *net)
118  {
119  	net->ipv6.fib6_routes_require_src--;
120  }
121  
122  #define FIB6_SUBTREE(fn)	(rcu_dereference_protected((fn)->subtree, 1))
123  #endif
124  
125  /*
126   *	routing information
127   *
128   */
129  
130  struct rt6key {
131  	struct in6_addr	addr;
132  	int		plen;
133  };
134  
135  struct fib6_table;
136  
137  struct rt6_exception_bucket {
138  	struct hlist_head	chain;
139  	int			depth;
140  };
141  
142  struct rt6_exception {
143  	struct hlist_node	hlist;
144  	struct rt6_info		*rt6i;
145  	unsigned long		stamp;
146  	struct rcu_head		rcu;
147  };
148  
149  #define FIB6_EXCEPTION_BUCKET_SIZE_SHIFT 10
150  #define FIB6_EXCEPTION_BUCKET_SIZE (1 << FIB6_EXCEPTION_BUCKET_SIZE_SHIFT)
151  #define FIB6_MAX_DEPTH 5
152  
153  struct fib6_nh {
154  	struct fib_nh_common	nh_common;
155  
156  #ifdef CONFIG_IPV6_ROUTER_PREF
157  	unsigned long		last_probe;
158  #endif
159  
160  	struct rt6_info * __percpu *rt6i_pcpu;
161  	struct rt6_exception_bucket __rcu *rt6i_exception_bucket;
162  };
163  
164  struct fib6_info {
165  	struct fib6_table		*fib6_table;
166  	struct fib6_info __rcu		*fib6_next;
167  	struct fib6_node __rcu		*fib6_node;
168  
169  	/* Multipath routes:
170  	 * siblings is a list of fib6_info that have the same metric/weight,
171  	 * destination, but not the same gateway. nsiblings is just a cache
172  	 * to speed up lookup.
173  	 */
174  	union {
175  		struct list_head	fib6_siblings;
176  		struct list_head	nh_list;
177  	};
178  	unsigned int			fib6_nsiblings;
179  
180  	refcount_t			fib6_ref;
181  	unsigned long			expires;
182  	struct dst_metrics		*fib6_metrics;
183  #define fib6_pmtu		fib6_metrics->metrics[RTAX_MTU-1]
184  
185  	struct rt6key			fib6_dst;
186  	u32				fib6_flags;
187  	struct rt6key			fib6_src;
188  	struct rt6key			fib6_prefsrc;
189  
190  	u32				fib6_metric;
191  	u8				fib6_protocol;
192  	u8				fib6_type;
193  
194  	u8				offload;
195  	u8				trap;
196  	u8				offload_failed;
197  
198  	u8				should_flush:1,
199  					dst_nocount:1,
200  					dst_nopolicy:1,
201  					fib6_destroying:1,
202  					unused:4;
203  
204  	struct rcu_head			rcu;
205  	struct nexthop			*nh;
206  	struct fib6_nh			fib6_nh[];
207  };
208  
209  struct rt6_info {
210  	struct dst_entry		dst;
211  	struct fib6_info __rcu		*from;
212  	int				sernum;
213  
214  	struct rt6key			rt6i_dst;
215  	struct rt6key			rt6i_src;
216  	struct in6_addr			rt6i_gateway;
217  	struct inet6_dev		*rt6i_idev;
218  	u32				rt6i_flags;
219  
220  	/* more non-fragment space at head required */
221  	unsigned short			rt6i_nfheader_len;
222  };
223  
224  struct fib6_result {
225  	struct fib6_nh		*nh;
226  	struct fib6_info	*f6i;
227  	u32			fib6_flags;
228  	u8			fib6_type;
229  	struct rt6_info		*rt6;
230  };
231  
232  #define for_each_fib6_node_rt_rcu(fn)					\
233  	for (rt = rcu_dereference((fn)->leaf); rt;			\
234  	     rt = rcu_dereference(rt->fib6_next))
235  
236  #define for_each_fib6_walker_rt(w)					\
237  	for (rt = (w)->leaf; rt;					\
238  	     rt = rcu_dereference_protected(rt->fib6_next, 1))
239  
240  #define dst_rt6_info(_ptr) container_of_const(_ptr, struct rt6_info, dst)
241  
ip6_dst_idev(const struct dst_entry * dst)242  static inline struct inet6_dev *ip6_dst_idev(const struct dst_entry *dst)
243  {
244  	return dst_rt6_info(dst)->rt6i_idev;
245  }
246  
fib6_requires_src(const struct fib6_info * rt)247  static inline bool fib6_requires_src(const struct fib6_info *rt)
248  {
249  	return rt->fib6_src.plen > 0;
250  }
251  
fib6_clean_expires(struct fib6_info * f6i)252  static inline void fib6_clean_expires(struct fib6_info *f6i)
253  {
254  	f6i->fib6_flags &= ~RTF_EXPIRES;
255  	f6i->expires = 0;
256  }
257  
fib6_set_expires(struct fib6_info * f6i,unsigned long expires)258  static inline void fib6_set_expires(struct fib6_info *f6i,
259  				    unsigned long expires)
260  {
261  	f6i->expires = expires;
262  	f6i->fib6_flags |= RTF_EXPIRES;
263  }
264  
fib6_check_expired(const struct fib6_info * f6i)265  static inline bool fib6_check_expired(const struct fib6_info *f6i)
266  {
267  	if (f6i->fib6_flags & RTF_EXPIRES)
268  		return time_after(jiffies, f6i->expires);
269  	return false;
270  }
271  
272  /* Function to safely get fn->fn_sernum for passed in rt
273   * and store result in passed in cookie.
274   * Return true if we can get cookie safely
275   * Return false if not
276   */
fib6_get_cookie_safe(const struct fib6_info * f6i,u32 * cookie)277  static inline bool fib6_get_cookie_safe(const struct fib6_info *f6i,
278  					u32 *cookie)
279  {
280  	struct fib6_node *fn;
281  	bool status = false;
282  
283  	fn = rcu_dereference(f6i->fib6_node);
284  
285  	if (fn) {
286  		*cookie = READ_ONCE(fn->fn_sernum);
287  		/* pairs with smp_wmb() in __fib6_update_sernum_upto_root() */
288  		smp_rmb();
289  		status = true;
290  	}
291  
292  	return status;
293  }
294  
rt6_get_cookie(const struct rt6_info * rt)295  static inline u32 rt6_get_cookie(const struct rt6_info *rt)
296  {
297  	struct fib6_info *from;
298  	u32 cookie = 0;
299  
300  	if (rt->sernum)
301  		return rt->sernum;
302  
303  	rcu_read_lock();
304  
305  	from = rcu_dereference(rt->from);
306  	if (from)
307  		fib6_get_cookie_safe(from, &cookie);
308  
309  	rcu_read_unlock();
310  
311  	return cookie;
312  }
313  
ip6_rt_put(struct rt6_info * rt)314  static inline void ip6_rt_put(struct rt6_info *rt)
315  {
316  	/* dst_release() accepts a NULL parameter.
317  	 * We rely on dst being first structure in struct rt6_info
318  	 */
319  	BUILD_BUG_ON(offsetof(struct rt6_info, dst) != 0);
320  	dst_release(&rt->dst);
321  }
322  
323  struct fib6_info *fib6_info_alloc(gfp_t gfp_flags, bool with_fib6_nh);
324  void fib6_info_destroy_rcu(struct rcu_head *head);
325  
fib6_info_hold(struct fib6_info * f6i)326  static inline void fib6_info_hold(struct fib6_info *f6i)
327  {
328  	refcount_inc(&f6i->fib6_ref);
329  }
330  
fib6_info_hold_safe(struct fib6_info * f6i)331  static inline bool fib6_info_hold_safe(struct fib6_info *f6i)
332  {
333  	return refcount_inc_not_zero(&f6i->fib6_ref);
334  }
335  
fib6_info_release(struct fib6_info * f6i)336  static inline void fib6_info_release(struct fib6_info *f6i)
337  {
338  	if (f6i && refcount_dec_and_test(&f6i->fib6_ref))
339  		call_rcu(&f6i->rcu, fib6_info_destroy_rcu);
340  }
341  
342  enum fib6_walk_state {
343  #ifdef CONFIG_IPV6_SUBTREES
344  	FWS_S,
345  #endif
346  	FWS_L,
347  	FWS_R,
348  	FWS_C,
349  	FWS_U
350  };
351  
352  struct fib6_walker {
353  	struct list_head lh;
354  	struct fib6_node *root, *node;
355  	struct fib6_info *leaf;
356  	enum fib6_walk_state state;
357  	unsigned int skip;
358  	unsigned int count;
359  	unsigned int skip_in_node;
360  	int (*func)(struct fib6_walker *);
361  	void *args;
362  };
363  
364  struct rt6_statistics {
365  	__u32		fib_nodes;		/* all fib6 nodes */
366  	__u32		fib_route_nodes;	/* intermediate nodes */
367  	__u32		fib_rt_entries;		/* rt entries in fib table */
368  	__u32		fib_rt_cache;		/* cached rt entries in exception table */
369  	__u32		fib_discarded_routes;	/* total number of routes delete */
370  
371  	/* The following stat is not protected by any lock */
372  	atomic_t	fib_rt_alloc;		/* total number of routes alloced */
373  };
374  
375  #define RTN_TL_ROOT	0x0001
376  #define RTN_ROOT	0x0002		/* tree root node		*/
377  #define RTN_RTINFO	0x0004		/* node with valid routing info	*/
378  
379  /*
380   *	priority levels (or metrics)
381   *
382   */
383  
384  
385  struct fib6_table {
386  	struct hlist_node	tb6_hlist;
387  	u32			tb6_id;
388  	spinlock_t		tb6_lock;
389  	struct fib6_node	tb6_root;
390  	struct inet_peer_base	tb6_peers;
391  	unsigned int		flags;
392  	unsigned int		fib_seq;
393  #define RT6_TABLE_HAS_DFLT_ROUTER	BIT(0)
394  };
395  
396  #define RT6_TABLE_UNSPEC	RT_TABLE_UNSPEC
397  #define RT6_TABLE_MAIN		RT_TABLE_MAIN
398  #define RT6_TABLE_DFLT		RT6_TABLE_MAIN
399  #define RT6_TABLE_INFO		RT6_TABLE_MAIN
400  #define RT6_TABLE_PREFIX	RT6_TABLE_MAIN
401  
402  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
403  #define FIB6_TABLE_MIN		1
404  #define FIB6_TABLE_MAX		RT_TABLE_MAX
405  #define RT6_TABLE_LOCAL		RT_TABLE_LOCAL
406  #else
407  #define FIB6_TABLE_MIN		RT_TABLE_MAIN
408  #define FIB6_TABLE_MAX		FIB6_TABLE_MIN
409  #define RT6_TABLE_LOCAL		RT6_TABLE_MAIN
410  #endif
411  
412  typedef struct rt6_info *(*pol_lookup_t)(struct net *,
413  					 struct fib6_table *,
414  					 struct flowi6 *,
415  					 const struct sk_buff *, int);
416  
417  struct fib6_entry_notifier_info {
418  	struct fib_notifier_info info; /* must be first */
419  	struct fib6_info *rt;
420  	unsigned int nsiblings;
421  };
422  
423  /*
424   *	exported functions
425   */
426  
427  struct fib6_table *fib6_get_table(struct net *net, u32 id);
428  struct fib6_table *fib6_new_table(struct net *net, u32 id);
429  struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6,
430  				   const struct sk_buff *skb,
431  				   int flags, pol_lookup_t lookup);
432  
433  /* called with rcu lock held; can return error pointer
434   * caller needs to select path
435   */
436  int fib6_lookup(struct net *net, int oif, struct flowi6 *fl6,
437  		struct fib6_result *res, int flags);
438  
439  /* called with rcu lock held; caller needs to select path */
440  int fib6_table_lookup(struct net *net, struct fib6_table *table,
441  		      int oif, struct flowi6 *fl6, struct fib6_result *res,
442  		      int strict);
443  
444  void fib6_select_path(const struct net *net, struct fib6_result *res,
445  		      struct flowi6 *fl6, int oif, bool have_oif_match,
446  		      const struct sk_buff *skb, int strict);
447  struct fib6_node *fib6_node_lookup(struct fib6_node *root,
448  				   const struct in6_addr *daddr,
449  				   const struct in6_addr *saddr);
450  
451  struct fib6_node *fib6_locate(struct fib6_node *root,
452  			      const struct in6_addr *daddr, int dst_len,
453  			      const struct in6_addr *saddr, int src_len,
454  			      bool exact_match);
455  
456  void fib6_clean_all(struct net *net, int (*func)(struct fib6_info *, void *arg),
457  		    void *arg);
458  void fib6_clean_all_skip_notify(struct net *net,
459  				int (*func)(struct fib6_info *, void *arg),
460  				void *arg);
461  
462  int fib6_add(struct fib6_node *root, struct fib6_info *rt,
463  	     struct nl_info *info, struct netlink_ext_ack *extack);
464  int fib6_del(struct fib6_info *rt, struct nl_info *info);
465  
466  static inline
rt6_get_prefsrc(const struct rt6_info * rt,struct in6_addr * addr)467  void rt6_get_prefsrc(const struct rt6_info *rt, struct in6_addr *addr)
468  {
469  	const struct fib6_info *from;
470  
471  	rcu_read_lock();
472  
473  	from = rcu_dereference(rt->from);
474  	if (from)
475  		*addr = from->fib6_prefsrc.addr;
476  	else
477  		*addr = in6addr_any;
478  
479  	rcu_read_unlock();
480  }
481  
482  int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
483  		 struct fib6_config *cfg, gfp_t gfp_flags,
484  		 struct netlink_ext_ack *extack);
485  void fib6_nh_release(struct fib6_nh *fib6_nh);
486  void fib6_nh_release_dsts(struct fib6_nh *fib6_nh);
487  
488  int call_fib6_entry_notifiers(struct net *net,
489  			      enum fib_event_type event_type,
490  			      struct fib6_info *rt,
491  			      struct netlink_ext_ack *extack);
492  int call_fib6_multipath_entry_notifiers(struct net *net,
493  					enum fib_event_type event_type,
494  					struct fib6_info *rt,
495  					unsigned int nsiblings,
496  					struct netlink_ext_ack *extack);
497  int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt);
498  void fib6_rt_update(struct net *net, struct fib6_info *rt,
499  		    struct nl_info *info);
500  void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
501  		     unsigned int flags);
502  
503  void fib6_run_gc(unsigned long expires, struct net *net, bool force);
504  
505  void fib6_gc_cleanup(void);
506  
507  int fib6_init(void);
508  
509  struct ipv6_route_iter {
510  	struct seq_net_private p;
511  	struct fib6_walker w;
512  	loff_t skip;
513  	struct fib6_table *tbl;
514  	int sernum;
515  };
516  
517  extern const struct seq_operations ipv6_route_seq_ops;
518  
519  int call_fib6_notifier(struct notifier_block *nb,
520  		       enum fib_event_type event_type,
521  		       struct fib_notifier_info *info);
522  int call_fib6_notifiers(struct net *net, enum fib_event_type event_type,
523  			struct fib_notifier_info *info);
524  
525  int __net_init fib6_notifier_init(struct net *net);
526  void __net_exit fib6_notifier_exit(struct net *net);
527  
528  unsigned int fib6_tables_seq_read(struct net *net);
529  int fib6_tables_dump(struct net *net, struct notifier_block *nb,
530  		     struct netlink_ext_ack *extack);
531  
532  void fib6_update_sernum(struct net *net, struct fib6_info *rt);
533  void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt);
534  void fib6_update_sernum_stub(struct net *net, struct fib6_info *f6i);
535  
536  void fib6_metric_set(struct fib6_info *f6i, int metric, u32 val);
fib6_metric_locked(struct fib6_info * f6i,int metric)537  static inline bool fib6_metric_locked(struct fib6_info *f6i, int metric)
538  {
539  	return !!(f6i->fib6_metrics->metrics[RTAX_LOCK - 1] & (1 << metric));
540  }
541  void fib6_info_hw_flags_set(struct net *net, struct fib6_info *f6i,
542  			    bool offload, bool trap, bool offload_failed);
543  
544  #if IS_BUILTIN(CONFIG_IPV6) && defined(CONFIG_BPF_SYSCALL)
545  struct bpf_iter__ipv6_route {
546  	__bpf_md_ptr(struct bpf_iter_meta *, meta);
547  	__bpf_md_ptr(struct fib6_info *, rt);
548  };
549  #endif
550  
551  INDIRECT_CALLABLE_DECLARE(struct rt6_info *ip6_pol_route_output(struct net *net,
552  					     struct fib6_table *table,
553  					     struct flowi6 *fl6,
554  					     const struct sk_buff *skb,
555  					     int flags));
556  INDIRECT_CALLABLE_DECLARE(struct rt6_info *ip6_pol_route_input(struct net *net,
557  					     struct fib6_table *table,
558  					     struct flowi6 *fl6,
559  					     const struct sk_buff *skb,
560  					     int flags));
561  INDIRECT_CALLABLE_DECLARE(struct rt6_info *__ip6_route_redirect(struct net *net,
562  					     struct fib6_table *table,
563  					     struct flowi6 *fl6,
564  					     const struct sk_buff *skb,
565  					     int flags));
566  INDIRECT_CALLABLE_DECLARE(struct rt6_info *ip6_pol_route_lookup(struct net *net,
567  					     struct fib6_table *table,
568  					     struct flowi6 *fl6,
569  					     const struct sk_buff *skb,
570  					     int flags));
pol_lookup_func(pol_lookup_t lookup,struct net * net,struct fib6_table * table,struct flowi6 * fl6,const struct sk_buff * skb,int flags)571  static inline struct rt6_info *pol_lookup_func(pol_lookup_t lookup,
572  						struct net *net,
573  						struct fib6_table *table,
574  						struct flowi6 *fl6,
575  						const struct sk_buff *skb,
576  						int flags)
577  {
578  	return INDIRECT_CALL_4(lookup,
579  			       ip6_pol_route_output,
580  			       ip6_pol_route_input,
581  			       ip6_pol_route_lookup,
582  			       __ip6_route_redirect,
583  			       net, table, fl6, skb, flags);
584  }
585  
586  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
fib6_has_custom_rules(const struct net * net)587  static inline bool fib6_has_custom_rules(const struct net *net)
588  {
589  	return net->ipv6.fib6_has_custom_rules;
590  }
591  
592  int fib6_rules_init(void);
593  void fib6_rules_cleanup(void);
594  bool fib6_rule_default(const struct fib_rule *rule);
595  int fib6_rules_dump(struct net *net, struct notifier_block *nb,
596  		    struct netlink_ext_ack *extack);
597  unsigned int fib6_rules_seq_read(struct net *net);
598  
fib6_rules_early_flow_dissect(struct net * net,struct sk_buff * skb,struct flowi6 * fl6,struct flow_keys * flkeys)599  static inline bool fib6_rules_early_flow_dissect(struct net *net,
600  						 struct sk_buff *skb,
601  						 struct flowi6 *fl6,
602  						 struct flow_keys *flkeys)
603  {
604  	unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
605  
606  	if (!net->ipv6.fib6_rules_require_fldissect)
607  		return false;
608  
609  	memset(flkeys, 0, sizeof(*flkeys));
610  	__skb_flow_dissect(net, skb, &flow_keys_dissector,
611  			   flkeys, NULL, 0, 0, 0, flag);
612  
613  	fl6->fl6_sport = flkeys->ports.src;
614  	fl6->fl6_dport = flkeys->ports.dst;
615  	fl6->flowi6_proto = flkeys->basic.ip_proto;
616  
617  	return true;
618  }
619  #else
fib6_has_custom_rules(const struct net * net)620  static inline bool fib6_has_custom_rules(const struct net *net)
621  {
622  	return false;
623  }
fib6_rules_init(void)624  static inline int               fib6_rules_init(void)
625  {
626  	return 0;
627  }
fib6_rules_cleanup(void)628  static inline void              fib6_rules_cleanup(void)
629  {
630  	return ;
631  }
fib6_rule_default(const struct fib_rule * rule)632  static inline bool fib6_rule_default(const struct fib_rule *rule)
633  {
634  	return true;
635  }
fib6_rules_dump(struct net * net,struct notifier_block * nb,struct netlink_ext_ack * extack)636  static inline int fib6_rules_dump(struct net *net, struct notifier_block *nb,
637  				  struct netlink_ext_ack *extack)
638  {
639  	return 0;
640  }
fib6_rules_seq_read(struct net * net)641  static inline unsigned int fib6_rules_seq_read(struct net *net)
642  {
643  	return 0;
644  }
fib6_rules_early_flow_dissect(struct net * net,struct sk_buff * skb,struct flowi6 * fl6,struct flow_keys * flkeys)645  static inline bool fib6_rules_early_flow_dissect(struct net *net,
646  						 struct sk_buff *skb,
647  						 struct flowi6 *fl6,
648  						 struct flow_keys *flkeys)
649  {
650  	return false;
651  }
652  #endif
653  #endif
654