]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/net/vrf.h
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-bionic-kernel.git] / include / net / vrf.h
CommitLineData
4e3c8992
DA
1/*
2 * include/net/net_vrf.h - adds vrf dev structure definitions
3 * Copyright (c) 2015 Cumulus Networks
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 */
10
11#ifndef __LINUX_NET_VRF_H
12#define __LINUX_NET_VRF_H
13
14struct net_vrf_dev {
15 struct rcu_head rcu;
16 int ifindex; /* ifindex of master dev */
17 u32 tb_id; /* table id for VRF */
18};
19
20struct slave {
21 struct list_head list;
22 struct net_device *dev;
23};
24
25struct slave_queue {
26 struct list_head all_slaves;
4e3c8992
DA
27};
28
29struct net_vrf {
30 struct slave_queue queue;
31 struct rtable *rth;
32 u32 tb_id;
33};
34
35
36#if IS_ENABLED(CONFIG_NET_VRF)
37/* called with rcu_read_lock() */
38static inline int vrf_master_ifindex_rcu(const struct net_device *dev)
39{
40 struct net_vrf_dev *vrf_ptr;
41 int ifindex = 0;
42
43 if (!dev)
44 return 0;
45
18041e31 46 if (netif_is_vrf(dev)) {
4e3c8992 47 ifindex = dev->ifindex;
18041e31 48 } else {
4e3c8992
DA
49 vrf_ptr = rcu_dereference(dev->vrf_ptr);
50 if (vrf_ptr)
51 ifindex = vrf_ptr->ifindex;
52 }
53
54 return ifindex;
55}
56
18041e31
NA
57static inline int vrf_master_ifindex(const struct net_device *dev)
58{
59 int ifindex;
60
61 rcu_read_lock();
62 ifindex = vrf_master_ifindex_rcu(dev);
63 rcu_read_unlock();
64
65 return ifindex;
66}
67
4e3c8992 68/* called with rcu_read_lock */
9b8ff518 69static inline u32 vrf_dev_table_rcu(const struct net_device *dev)
4e3c8992 70{
9b8ff518 71 u32 tb_id = 0;
4e3c8992
DA
72
73 if (dev) {
74 struct net_vrf_dev *vrf_ptr;
75
76 vrf_ptr = rcu_dereference(dev->vrf_ptr);
77 if (vrf_ptr)
78 tb_id = vrf_ptr->tb_id;
79 }
80 return tb_id;
81}
82
9b8ff518 83static inline u32 vrf_dev_table(const struct net_device *dev)
4e3c8992 84{
9b8ff518 85 u32 tb_id;
4e3c8992
DA
86
87 rcu_read_lock();
88 tb_id = vrf_dev_table_rcu(dev);
89 rcu_read_unlock();
90
91 return tb_id;
92}
93
9b8ff518 94static inline u32 vrf_dev_table_ifindex(struct net *net, int ifindex)
dc028da5
DA
95{
96 struct net_device *dev;
9b8ff518 97 u32 tb_id = 0;
dc028da5
DA
98
99 if (!ifindex)
100 return 0;
101
102 rcu_read_lock();
103
104 dev = dev_get_by_index_rcu(net, ifindex);
105 if (dev)
106 tb_id = vrf_dev_table_rcu(dev);
107
108 rcu_read_unlock();
109
110 return tb_id;
111}
112
4e3c8992 113/* called with rtnl */
9b8ff518 114static inline u32 vrf_dev_table_rtnl(const struct net_device *dev)
4e3c8992 115{
9b8ff518 116 u32 tb_id = 0;
4e3c8992
DA
117
118 if (dev) {
119 struct net_vrf_dev *vrf_ptr;
120
121 vrf_ptr = rtnl_dereference(dev->vrf_ptr);
122 if (vrf_ptr)
123 tb_id = vrf_ptr->tb_id;
124 }
125 return tb_id;
126}
127
128/* caller has already checked netif_is_vrf(dev) */
129static inline struct rtable *vrf_dev_get_rth(const struct net_device *dev)
130{
131 struct rtable *rth = ERR_PTR(-ENETUNREACH);
132 struct net_vrf *vrf = netdev_priv(dev);
133
134 if (vrf) {
135 rth = vrf->rth;
136 atomic_inc(&rth->dst.__refcnt);
137 }
138 return rth;
139}
140
141#else
142static inline int vrf_master_ifindex_rcu(const struct net_device *dev)
143{
144 return 0;
145}
146
18041e31
NA
147static inline int vrf_master_ifindex(const struct net_device *dev)
148{
149 return 0;
150}
151
9b8ff518 152static inline u32 vrf_dev_table_rcu(const struct net_device *dev)
4e3c8992
DA
153{
154 return 0;
155}
156
9b8ff518 157static inline u32 vrf_dev_table(const struct net_device *dev)
4e3c8992
DA
158{
159 return 0;
160}
161
9b8ff518 162static inline u32 vrf_dev_table_ifindex(struct net *net, int ifindex)
dc028da5
DA
163{
164 return 0;
165}
166
9b8ff518 167static inline u32 vrf_dev_table_rtnl(const struct net_device *dev)
4e3c8992
DA
168{
169 return 0;
170}
171
172static inline struct rtable *vrf_dev_get_rth(const struct net_device *dev)
173{
174 return ERR_PTR(-ENETUNREACH);
175}
176#endif
177
178#endif /* __LINUX_NET_VRF_H */