xref: /linux-6.15/include/net/l3mdev.h (revision 2d300ce0)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21b69c6d0SDavid Ahern /*
31b69c6d0SDavid Ahern  * include/net/l3mdev.h - L3 master device API
41b69c6d0SDavid Ahern  * Copyright (c) 2015 Cumulus Networks
51b69c6d0SDavid Ahern  * Copyright (c) 2015 David Ahern <[email protected]>
61b69c6d0SDavid Ahern  */
71b69c6d0SDavid Ahern #ifndef _NET_L3MDEV_H_
81b69c6d0SDavid Ahern #define _NET_L3MDEV_H_
91b69c6d0SDavid Ahern 
10a8e3e1a9SDavid Ahern #include <net/dst.h>
1196c63fa7SDavid Ahern #include <net/fib_rules.h>
1296c63fa7SDavid Ahern 
1349042c22SAndrea Mayer enum l3mdev_type {
1449042c22SAndrea Mayer 	L3MDEV_TYPE_UNSPEC,
1549042c22SAndrea Mayer 	L3MDEV_TYPE_VRF,
1649042c22SAndrea Mayer 	__L3MDEV_TYPE_MAX
1749042c22SAndrea Mayer };
1849042c22SAndrea Mayer 
1949042c22SAndrea Mayer #define L3MDEV_TYPE_MAX (__L3MDEV_TYPE_MAX - 1)
2049042c22SAndrea Mayer 
2149042c22SAndrea Mayer typedef int (*lookup_by_table_id_t)(struct net *net, u32 table_d);
2249042c22SAndrea Mayer 
231b69c6d0SDavid Ahern /**
241b69c6d0SDavid Ahern  * struct l3mdev_ops - l3mdev operations
251b69c6d0SDavid Ahern  *
261b69c6d0SDavid Ahern  * @l3mdev_fib_table: Get FIB table id to use for lookups
271b69c6d0SDavid Ahern  *
28a8e3e1a9SDavid Ahern  * @l3mdev_l3_rcv:    Hook in L3 receive path
29a8e3e1a9SDavid Ahern  *
30a8e3e1a9SDavid Ahern  * @l3mdev_l3_out:    Hook in L3 output path
31a8e3e1a9SDavid Ahern  *
324c1feac5SDavid Ahern  * @l3mdev_link_scope_lookup: IPv6 lookup for linklocal and mcast destinations
331b69c6d0SDavid Ahern  */
341b69c6d0SDavid Ahern 
351b69c6d0SDavid Ahern struct l3mdev_ops {
361b69c6d0SDavid Ahern 	u32		(*l3mdev_fib_table)(const struct net_device *dev);
3774b20582SDavid Ahern 	struct sk_buff * (*l3mdev_l3_rcv)(struct net_device *dev,
3874b20582SDavid Ahern 					  struct sk_buff *skb, u16 proto);
39a8e3e1a9SDavid Ahern 	struct sk_buff * (*l3mdev_l3_out)(struct net_device *dev,
40a8e3e1a9SDavid Ahern 					  struct sock *sk, struct sk_buff *skb,
41a8e3e1a9SDavid Ahern 					  u16 proto);
42ccf3c8c3SDavid Ahern 
43ccf3c8c3SDavid Ahern 	/* IPv6 ops */
444c1feac5SDavid Ahern 	struct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *dev,
45cd2a9e62SDavid Ahern 						 struct flowi6 *fl6);
461b69c6d0SDavid Ahern };
471b69c6d0SDavid Ahern 
481b69c6d0SDavid Ahern #ifdef CONFIG_NET_L3_MASTER_DEV
491b69c6d0SDavid Ahern 
5049042c22SAndrea Mayer int l3mdev_table_lookup_register(enum l3mdev_type l3type,
5149042c22SAndrea Mayer 				 lookup_by_table_id_t fn);
5249042c22SAndrea Mayer 
5349042c22SAndrea Mayer void l3mdev_table_lookup_unregister(enum l3mdev_type l3type,
5449042c22SAndrea Mayer 				    lookup_by_table_id_t fn);
5549042c22SAndrea Mayer 
5649042c22SAndrea Mayer int l3mdev_ifindex_lookup_by_table_id(enum l3mdev_type l3type, struct net *net,
5749042c22SAndrea Mayer 				      u32 table_id);
5849042c22SAndrea Mayer 
5996c63fa7SDavid Ahern int l3mdev_fib_rule_match(struct net *net, struct flowi *fl,
6096c63fa7SDavid Ahern 			  struct fib_lookup_arg *arg);
6196c63fa7SDavid Ahern 
62*2d300ce0SIdo Schimmel static inline
l3mdev_fib_rule_iif_match(const struct flowi * fl,int iifindex)63*2d300ce0SIdo Schimmel bool l3mdev_fib_rule_iif_match(const struct flowi *fl, int iifindex)
64*2d300ce0SIdo Schimmel {
65*2d300ce0SIdo Schimmel 	return !(fl->flowi_flags & FLOWI_FLAG_L3MDEV_OIF) &&
66*2d300ce0SIdo Schimmel 	       fl->flowi_l3mdev == iifindex;
67*2d300ce0SIdo Schimmel }
68*2d300ce0SIdo Schimmel 
69*2d300ce0SIdo Schimmel static inline
l3mdev_fib_rule_oif_match(const struct flowi * fl,int oifindex)70*2d300ce0SIdo Schimmel bool l3mdev_fib_rule_oif_match(const struct flowi *fl, int oifindex)
71*2d300ce0SIdo Schimmel {
72*2d300ce0SIdo Schimmel 	return fl->flowi_flags & FLOWI_FLAG_L3MDEV_OIF &&
73*2d300ce0SIdo Schimmel 	       fl->flowi_l3mdev == oifindex;
74*2d300ce0SIdo Schimmel }
75*2d300ce0SIdo Schimmel 
769ee0034bSDavid Ahern void l3mdev_update_flow(struct net *net, struct flowi *fl);
779ee0034bSDavid Ahern 
783f2fb9a8SDavid Ahern int l3mdev_master_ifindex_rcu(const struct net_device *dev);
l3mdev_master_ifindex(struct net_device * dev)791b69c6d0SDavid Ahern static inline int l3mdev_master_ifindex(struct net_device *dev)
801b69c6d0SDavid Ahern {
811b69c6d0SDavid Ahern 	int ifindex;
821b69c6d0SDavid Ahern 
831b69c6d0SDavid Ahern 	rcu_read_lock();
841b69c6d0SDavid Ahern 	ifindex = l3mdev_master_ifindex_rcu(dev);
851b69c6d0SDavid Ahern 	rcu_read_unlock();
861b69c6d0SDavid Ahern 
871b69c6d0SDavid Ahern 	return ifindex;
881b69c6d0SDavid Ahern }
891b69c6d0SDavid Ahern 
l3mdev_master_ifindex_by_index(struct net * net,int ifindex)901a852479SDavid Ahern static inline int l3mdev_master_ifindex_by_index(struct net *net, int ifindex)
911a852479SDavid Ahern {
921a852479SDavid Ahern 	struct net_device *dev;
931a852479SDavid Ahern 	int rc = 0;
941a852479SDavid Ahern 
959e542ff8SBreno Leitao 	if (ifindex) {
961a852479SDavid Ahern 		rcu_read_lock();
971a852479SDavid Ahern 
981a852479SDavid Ahern 		dev = dev_get_by_index_rcu(net, ifindex);
991a852479SDavid Ahern 		if (dev)
1001a852479SDavid Ahern 			rc = l3mdev_master_ifindex_rcu(dev);
1011a852479SDavid Ahern 
1021a852479SDavid Ahern 		rcu_read_unlock();
1031a852479SDavid Ahern 	}
1041a852479SDavid Ahern 
1051a852479SDavid Ahern 	return rc;
1061a852479SDavid Ahern }
1071a852479SDavid Ahern 
108afbac601SDavid Ahern static inline
l3mdev_master_dev_rcu(const struct net_device * _dev)1095f02ce24SDavid Ahern struct net_device *l3mdev_master_dev_rcu(const struct net_device *_dev)
110afbac601SDavid Ahern {
111afbac601SDavid Ahern 	/* netdev_master_upper_dev_get_rcu calls
112afbac601SDavid Ahern 	 * list_first_or_null_rcu to walk the upper dev list.
113afbac601SDavid Ahern 	 * list_first_or_null_rcu does not handle a const arg. We aren't
114afbac601SDavid Ahern 	 * making changes, just want the master device from that list so
115afbac601SDavid Ahern 	 * typecast to remove the const
116afbac601SDavid Ahern 	 */
117afbac601SDavid Ahern 	struct net_device *dev = (struct net_device *)_dev;
1185f02ce24SDavid Ahern 	struct net_device *master;
119afbac601SDavid Ahern 
120afbac601SDavid Ahern 	if (!dev)
121afbac601SDavid Ahern 		return NULL;
122afbac601SDavid Ahern 
123afbac601SDavid Ahern 	if (netif_is_l3_master(dev))
124afbac601SDavid Ahern 		master = dev;
125afbac601SDavid Ahern 	else if (netif_is_l3_slave(dev))
126afbac601SDavid Ahern 		master = netdev_master_upper_dev_get_rcu(dev);
127afbac601SDavid Ahern 	else
128afbac601SDavid Ahern 		master = NULL;
129afbac601SDavid Ahern 
130afbac601SDavid Ahern 	return master;
131afbac601SDavid Ahern }
132afbac601SDavid Ahern 
1336a6d6681SAlexis Bauvin int l3mdev_master_upper_ifindex_by_index_rcu(struct net *net, int ifindex);
1346a6d6681SAlexis Bauvin static inline
l3mdev_master_upper_ifindex_by_index(struct net * net,int ifindex)1356a6d6681SAlexis Bauvin int l3mdev_master_upper_ifindex_by_index(struct net *net, int ifindex)
1366a6d6681SAlexis Bauvin {
1376a6d6681SAlexis Bauvin 	rcu_read_lock();
1386a6d6681SAlexis Bauvin 	ifindex = l3mdev_master_upper_ifindex_by_index_rcu(net, ifindex);
1396a6d6681SAlexis Bauvin 	rcu_read_unlock();
1406a6d6681SAlexis Bauvin 
1416a6d6681SAlexis Bauvin 	return ifindex;
1426a6d6681SAlexis Bauvin }
1436a6d6681SAlexis Bauvin 
1441b69c6d0SDavid Ahern u32 l3mdev_fib_table_rcu(const struct net_device *dev);
1451b69c6d0SDavid Ahern u32 l3mdev_fib_table_by_index(struct net *net, int ifindex);
l3mdev_fib_table(const struct net_device * dev)1461b69c6d0SDavid Ahern static inline u32 l3mdev_fib_table(const struct net_device *dev)
1471b69c6d0SDavid Ahern {
1481b69c6d0SDavid Ahern 	u32 tb_id;
1491b69c6d0SDavid Ahern 
1501b69c6d0SDavid Ahern 	rcu_read_lock();
1511b69c6d0SDavid Ahern 	tb_id = l3mdev_fib_table_rcu(dev);
1521b69c6d0SDavid Ahern 	rcu_read_unlock();
1531b69c6d0SDavid Ahern 
1541b69c6d0SDavid Ahern 	return tb_id;
1551b69c6d0SDavid Ahern }
1561b69c6d0SDavid Ahern 
netif_index_is_l3_master(struct net * net,int ifindex)1576104e112SDavid Ahern static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
1586104e112SDavid Ahern {
1596104e112SDavid Ahern 	struct net_device *dev;
1606104e112SDavid Ahern 	bool rc = false;
1616104e112SDavid Ahern 
1626104e112SDavid Ahern 	if (ifindex == 0)
1636104e112SDavid Ahern 		return false;
1646104e112SDavid Ahern 
1656104e112SDavid Ahern 	rcu_read_lock();
1666104e112SDavid Ahern 
1676104e112SDavid Ahern 	dev = dev_get_by_index_rcu(net, ifindex);
1686104e112SDavid Ahern 	if (dev)
1696104e112SDavid Ahern 		rc = netif_is_l3_master(dev);
1706104e112SDavid Ahern 
1716104e112SDavid Ahern 	rcu_read_unlock();
1726104e112SDavid Ahern 
1736104e112SDavid Ahern 	return rc;
1746104e112SDavid Ahern }
1756104e112SDavid Ahern 
1764c1feac5SDavid Ahern struct dst_entry *l3mdev_link_scope_lookup(struct net *net, struct flowi6 *fl6);
177ccf3c8c3SDavid Ahern 
17874b20582SDavid Ahern static inline
l3mdev_l3_rcv(struct sk_buff * skb,u16 proto)17974b20582SDavid Ahern struct sk_buff *l3mdev_l3_rcv(struct sk_buff *skb, u16 proto)
18074b20582SDavid Ahern {
18174b20582SDavid Ahern 	struct net_device *master = NULL;
18274b20582SDavid Ahern 
18374b20582SDavid Ahern 	if (netif_is_l3_slave(skb->dev))
18474b20582SDavid Ahern 		master = netdev_master_upper_dev_get_rcu(skb->dev);
185d5256083SDaniel Borkmann 	else if (netif_is_l3_master(skb->dev) ||
186d5256083SDaniel Borkmann 		 netif_has_l3_rx_handler(skb->dev))
18774b20582SDavid Ahern 		master = skb->dev;
18874b20582SDavid Ahern 
18974b20582SDavid Ahern 	if (master && master->l3mdev_ops->l3mdev_l3_rcv)
19074b20582SDavid Ahern 		skb = master->l3mdev_ops->l3mdev_l3_rcv(master, skb, proto);
19174b20582SDavid Ahern 
19274b20582SDavid Ahern 	return skb;
19374b20582SDavid Ahern }
19474b20582SDavid Ahern 
19574b20582SDavid Ahern static inline
l3mdev_ip_rcv(struct sk_buff * skb)19674b20582SDavid Ahern struct sk_buff *l3mdev_ip_rcv(struct sk_buff *skb)
19774b20582SDavid Ahern {
19874b20582SDavid Ahern 	return l3mdev_l3_rcv(skb, AF_INET);
19974b20582SDavid Ahern }
20074b20582SDavid Ahern 
20174b20582SDavid Ahern static inline
l3mdev_ip6_rcv(struct sk_buff * skb)20274b20582SDavid Ahern struct sk_buff *l3mdev_ip6_rcv(struct sk_buff *skb)
20374b20582SDavid Ahern {
20474b20582SDavid Ahern 	return l3mdev_l3_rcv(skb, AF_INET6);
20574b20582SDavid Ahern }
20674b20582SDavid Ahern 
207a8e3e1a9SDavid Ahern static inline
l3mdev_l3_out(struct sock * sk,struct sk_buff * skb,u16 proto)208a8e3e1a9SDavid Ahern struct sk_buff *l3mdev_l3_out(struct sock *sk, struct sk_buff *skb, u16 proto)
209a8e3e1a9SDavid Ahern {
210a8e3e1a9SDavid Ahern 	struct net_device *dev = skb_dst(skb)->dev;
211a8e3e1a9SDavid Ahern 
212a8e3e1a9SDavid Ahern 	if (netif_is_l3_slave(dev)) {
213a8e3e1a9SDavid Ahern 		struct net_device *master;
214a8e3e1a9SDavid Ahern 
2156d0ce46aSEric Dumazet 		rcu_read_lock();
216a8e3e1a9SDavid Ahern 		master = netdev_master_upper_dev_get_rcu(dev);
217a8e3e1a9SDavid Ahern 		if (master && master->l3mdev_ops->l3mdev_l3_out)
218a8e3e1a9SDavid Ahern 			skb = master->l3mdev_ops->l3mdev_l3_out(master, sk,
219a8e3e1a9SDavid Ahern 								skb, proto);
2206d0ce46aSEric Dumazet 		rcu_read_unlock();
221a8e3e1a9SDavid Ahern 	}
222a8e3e1a9SDavid Ahern 
223a8e3e1a9SDavid Ahern 	return skb;
224a8e3e1a9SDavid Ahern }
225a8e3e1a9SDavid Ahern 
226a8e3e1a9SDavid Ahern static inline
l3mdev_ip_out(struct sock * sk,struct sk_buff * skb)227a8e3e1a9SDavid Ahern struct sk_buff *l3mdev_ip_out(struct sock *sk, struct sk_buff *skb)
228a8e3e1a9SDavid Ahern {
229a8e3e1a9SDavid Ahern 	return l3mdev_l3_out(sk, skb, AF_INET);
230a8e3e1a9SDavid Ahern }
231a8e3e1a9SDavid Ahern 
232a8e3e1a9SDavid Ahern static inline
l3mdev_ip6_out(struct sock * sk,struct sk_buff * skb)233a8e3e1a9SDavid Ahern struct sk_buff *l3mdev_ip6_out(struct sock *sk, struct sk_buff *skb)
234a8e3e1a9SDavid Ahern {
235a8e3e1a9SDavid Ahern 	return l3mdev_l3_out(sk, skb, AF_INET6);
236a8e3e1a9SDavid Ahern }
2371b69c6d0SDavid Ahern #else
2381b69c6d0SDavid Ahern 
l3mdev_master_ifindex_rcu(const struct net_device * dev)2393f2fb9a8SDavid Ahern static inline int l3mdev_master_ifindex_rcu(const struct net_device *dev)
2401b69c6d0SDavid Ahern {
2411b69c6d0SDavid Ahern 	return 0;
2421b69c6d0SDavid Ahern }
l3mdev_master_ifindex(struct net_device * dev)2431b69c6d0SDavid Ahern static inline int l3mdev_master_ifindex(struct net_device *dev)
2441b69c6d0SDavid Ahern {
2451b69c6d0SDavid Ahern 	return 0;
2461b69c6d0SDavid Ahern }
2471b69c6d0SDavid Ahern 
l3mdev_master_ifindex_by_index(struct net * net,int ifindex)2481a852479SDavid Ahern static inline int l3mdev_master_ifindex_by_index(struct net *net, int ifindex)
2491a852479SDavid Ahern {
2501a852479SDavid Ahern 	return 0;
2511a852479SDavid Ahern }
2521a852479SDavid Ahern 
253afbac601SDavid Ahern static inline
l3mdev_master_upper_ifindex_by_index_rcu(struct net * net,int ifindex)2546a6d6681SAlexis Bauvin int l3mdev_master_upper_ifindex_by_index_rcu(struct net *net, int ifindex)
2556a6d6681SAlexis Bauvin {
2566a6d6681SAlexis Bauvin 	return 0;
2576a6d6681SAlexis Bauvin }
2586a6d6681SAlexis Bauvin static inline
l3mdev_master_upper_ifindex_by_index(struct net * net,int ifindex)2596a6d6681SAlexis Bauvin int l3mdev_master_upper_ifindex_by_index(struct net *net, int ifindex)
2606a6d6681SAlexis Bauvin {
2616a6d6681SAlexis Bauvin 	return 0;
2626a6d6681SAlexis Bauvin }
2636a6d6681SAlexis Bauvin 
2646a6d6681SAlexis Bauvin static inline
l3mdev_master_dev_rcu(const struct net_device * dev)2655f02ce24SDavid Ahern struct net_device *l3mdev_master_dev_rcu(const struct net_device *dev)
266afbac601SDavid Ahern {
267afbac601SDavid Ahern 	return NULL;
268afbac601SDavid Ahern }
269afbac601SDavid Ahern 
l3mdev_fib_table_rcu(const struct net_device * dev)2701b69c6d0SDavid Ahern static inline u32 l3mdev_fib_table_rcu(const struct net_device *dev)
2711b69c6d0SDavid Ahern {
2721b69c6d0SDavid Ahern 	return 0;
2731b69c6d0SDavid Ahern }
l3mdev_fib_table(const struct net_device * dev)2741b69c6d0SDavid Ahern static inline u32 l3mdev_fib_table(const struct net_device *dev)
2751b69c6d0SDavid Ahern {
2761b69c6d0SDavid Ahern 	return 0;
2771b69c6d0SDavid Ahern }
l3mdev_fib_table_by_index(struct net * net,int ifindex)2781b69c6d0SDavid Ahern static inline u32 l3mdev_fib_table_by_index(struct net *net, int ifindex)
2791b69c6d0SDavid Ahern {
2801b69c6d0SDavid Ahern 	return 0;
2811b69c6d0SDavid Ahern }
2821b69c6d0SDavid Ahern 
netif_index_is_l3_master(struct net * net,int ifindex)2836104e112SDavid Ahern static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
2846104e112SDavid Ahern {
2856104e112SDavid Ahern 	return false;
2866104e112SDavid Ahern }
2876104e112SDavid Ahern 
288ccf3c8c3SDavid Ahern static inline
l3mdev_link_scope_lookup(struct net * net,struct flowi6 * fl6)2894c1feac5SDavid Ahern struct dst_entry *l3mdev_link_scope_lookup(struct net *net, struct flowi6 *fl6)
290ccf3c8c3SDavid Ahern {
291ccf3c8c3SDavid Ahern 	return NULL;
292ccf3c8c3SDavid Ahern }
29374b20582SDavid Ahern 
29474b20582SDavid Ahern static inline
l3mdev_ip_rcv(struct sk_buff * skb)29574b20582SDavid Ahern struct sk_buff *l3mdev_ip_rcv(struct sk_buff *skb)
29674b20582SDavid Ahern {
29774b20582SDavid Ahern 	return skb;
29874b20582SDavid Ahern }
29974b20582SDavid Ahern 
30074b20582SDavid Ahern static inline
l3mdev_ip6_rcv(struct sk_buff * skb)30174b20582SDavid Ahern struct sk_buff *l3mdev_ip6_rcv(struct sk_buff *skb)
30274b20582SDavid Ahern {
30374b20582SDavid Ahern 	return skb;
30474b20582SDavid Ahern }
30596c63fa7SDavid Ahern 
30696c63fa7SDavid Ahern static inline
l3mdev_ip_out(struct sock * sk,struct sk_buff * skb)307a8e3e1a9SDavid Ahern struct sk_buff *l3mdev_ip_out(struct sock *sk, struct sk_buff *skb)
308a8e3e1a9SDavid Ahern {
309a8e3e1a9SDavid Ahern 	return skb;
310a8e3e1a9SDavid Ahern }
311a8e3e1a9SDavid Ahern 
312a8e3e1a9SDavid Ahern static inline
l3mdev_ip6_out(struct sock * sk,struct sk_buff * skb)313a8e3e1a9SDavid Ahern struct sk_buff *l3mdev_ip6_out(struct sock *sk, struct sk_buff *skb)
314a8e3e1a9SDavid Ahern {
315a8e3e1a9SDavid Ahern 	return skb;
316a8e3e1a9SDavid Ahern }
317a8e3e1a9SDavid Ahern 
318a8e3e1a9SDavid Ahern static inline
l3mdev_table_lookup_register(enum l3mdev_type l3type,lookup_by_table_id_t fn)31949042c22SAndrea Mayer int l3mdev_table_lookup_register(enum l3mdev_type l3type,
32049042c22SAndrea Mayer 				 lookup_by_table_id_t fn)
32149042c22SAndrea Mayer {
32249042c22SAndrea Mayer 	return -EOPNOTSUPP;
32349042c22SAndrea Mayer }
32449042c22SAndrea Mayer 
32549042c22SAndrea Mayer static inline
l3mdev_table_lookup_unregister(enum l3mdev_type l3type,lookup_by_table_id_t fn)32649042c22SAndrea Mayer void l3mdev_table_lookup_unregister(enum l3mdev_type l3type,
32749042c22SAndrea Mayer 				    lookup_by_table_id_t fn)
32849042c22SAndrea Mayer {
32949042c22SAndrea Mayer }
33049042c22SAndrea Mayer 
33149042c22SAndrea Mayer static inline
l3mdev_ifindex_lookup_by_table_id(enum l3mdev_type l3type,struct net * net,u32 table_id)33249042c22SAndrea Mayer int l3mdev_ifindex_lookup_by_table_id(enum l3mdev_type l3type, struct net *net,
33349042c22SAndrea Mayer 				      u32 table_id)
33449042c22SAndrea Mayer {
33549042c22SAndrea Mayer 	return -ENODEV;
33649042c22SAndrea Mayer }
33749042c22SAndrea Mayer 
33849042c22SAndrea Mayer static inline
l3mdev_fib_rule_match(struct net * net,struct flowi * fl,struct fib_lookup_arg * arg)33996c63fa7SDavid Ahern int l3mdev_fib_rule_match(struct net *net, struct flowi *fl,
34096c63fa7SDavid Ahern 			  struct fib_lookup_arg *arg)
34196c63fa7SDavid Ahern {
34296c63fa7SDavid Ahern 	return 1;
34396c63fa7SDavid Ahern }
344*2d300ce0SIdo Schimmel 
345*2d300ce0SIdo Schimmel static inline
l3mdev_fib_rule_iif_match(const struct flowi * fl,int iifindex)346*2d300ce0SIdo Schimmel bool l3mdev_fib_rule_iif_match(const struct flowi *fl, int iifindex)
347*2d300ce0SIdo Schimmel {
348*2d300ce0SIdo Schimmel 	return false;
349*2d300ce0SIdo Schimmel }
350*2d300ce0SIdo Schimmel 
351*2d300ce0SIdo Schimmel static inline
l3mdev_fib_rule_oif_match(const struct flowi * fl,int oifindex)352*2d300ce0SIdo Schimmel bool l3mdev_fib_rule_oif_match(const struct flowi *fl, int oifindex)
353*2d300ce0SIdo Schimmel {
354*2d300ce0SIdo Schimmel 	return false;
355*2d300ce0SIdo Schimmel }
356*2d300ce0SIdo Schimmel 
3579ee0034bSDavid Ahern static inline
l3mdev_update_flow(struct net * net,struct flowi * fl)3589ee0034bSDavid Ahern void l3mdev_update_flow(struct net *net, struct flowi *fl)
3599ee0034bSDavid Ahern {
3609ee0034bSDavid Ahern }
3611b69c6d0SDavid Ahern #endif
3621b69c6d0SDavid Ahern 
3631b69c6d0SDavid Ahern #endif /* _NET_L3MDEV_H_ */
364