• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_INETDEVICE_H
3  #define _LINUX_INETDEVICE_H
4  
5  #ifdef __KERNEL__
6  
7  #include <linux/bitmap.h>
8  #include <linux/if.h>
9  #include <linux/ip.h>
10  #include <linux/netdevice.h>
11  #include <linux/rcupdate.h>
12  #include <linux/timer.h>
13  #include <linux/sysctl.h>
14  #include <linux/rtnetlink.h>
15  #include <linux/refcount.h>
16  
17  struct ipv4_devconf {
18  	void	*sysctl;
19  	int	data[IPV4_DEVCONF_MAX];
20  	DECLARE_BITMAP(state, IPV4_DEVCONF_MAX);
21  };
22  
23  #define MC_HASH_SZ_LOG 9
24  
25  struct in_device {
26  	struct net_device	*dev;
27  	refcount_t		refcnt;
28  	int			dead;
29  	struct in_ifaddr	*ifa_list;	/* IP ifaddr chain		*/
30  
31  	struct ip_mc_list __rcu	*mc_list;	/* IP multicast filter chain    */
32  	struct ip_mc_list __rcu	* __rcu *mc_hash;
33  
34  	int			mc_count;	/* Number of installed mcasts	*/
35  	spinlock_t		mc_tomb_lock;
36  	struct ip_mc_list	*mc_tomb;
37  	unsigned long		mr_v1_seen;
38  	unsigned long		mr_v2_seen;
39  	unsigned long		mr_maxdelay;
40  	unsigned char		mr_qrv;
41  	unsigned char		mr_gq_running;
42  	unsigned char		mr_ifc_count;
43  	struct timer_list	mr_gq_timer;	/* general query timer */
44  	struct timer_list	mr_ifc_timer;	/* interface change timer */
45  
46  	struct neigh_parms	*arp_parms;
47  	struct ipv4_devconf	cnf;
48  	struct rcu_head		rcu_head;
49  };
50  
51  #define IPV4_DEVCONF(cnf, attr) ((cnf).data[IPV4_DEVCONF_ ## attr - 1])
52  #define IPV4_DEVCONF_ALL(net, attr) \
53  	IPV4_DEVCONF((*(net)->ipv4.devconf_all), attr)
54  
ipv4_devconf_get(struct in_device * in_dev,int index)55  static inline int ipv4_devconf_get(struct in_device *in_dev, int index)
56  {
57  	index--;
58  	return in_dev->cnf.data[index];
59  }
60  
ipv4_devconf_set(struct in_device * in_dev,int index,int val)61  static inline void ipv4_devconf_set(struct in_device *in_dev, int index,
62  				    int val)
63  {
64  	index--;
65  	set_bit(index, in_dev->cnf.state);
66  	in_dev->cnf.data[index] = val;
67  }
68  
ipv4_devconf_setall(struct in_device * in_dev)69  static inline void ipv4_devconf_setall(struct in_device *in_dev)
70  {
71  	bitmap_fill(in_dev->cnf.state, IPV4_DEVCONF_MAX);
72  }
73  
74  #define IN_DEV_CONF_GET(in_dev, attr) \
75  	ipv4_devconf_get((in_dev), IPV4_DEVCONF_ ## attr)
76  #define IN_DEV_CONF_SET(in_dev, attr, val) \
77  	ipv4_devconf_set((in_dev), IPV4_DEVCONF_ ## attr, (val))
78  
79  #define IN_DEV_ANDCONF(in_dev, attr) \
80  	(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \
81  	 IN_DEV_CONF_GET((in_dev), attr))
82  
83  #define IN_DEV_NET_ORCONF(in_dev, net, attr) \
84  	(IPV4_DEVCONF_ALL(net, attr) || \
85  	 IN_DEV_CONF_GET((in_dev), attr))
86  
87  #define IN_DEV_ORCONF(in_dev, attr) \
88  	IN_DEV_NET_ORCONF(in_dev, dev_net(in_dev->dev), attr)
89  
90  #define IN_DEV_MAXCONF(in_dev, attr) \
91  	(max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \
92  	     IN_DEV_CONF_GET((in_dev), attr)))
93  
94  #define IN_DEV_FORWARD(in_dev)		IN_DEV_CONF_GET((in_dev), FORWARDING)
95  #define IN_DEV_MFORWARD(in_dev)		IN_DEV_ANDCONF((in_dev), MC_FORWARDING)
96  #define IN_DEV_RPFILTER(in_dev)		IN_DEV_MAXCONF((in_dev), RP_FILTER)
97  #define IN_DEV_SRC_VMARK(in_dev)    	IN_DEV_ORCONF((in_dev), SRC_VMARK)
98  #define IN_DEV_SOURCE_ROUTE(in_dev)	IN_DEV_ANDCONF((in_dev), \
99  						       ACCEPT_SOURCE_ROUTE)
100  #define IN_DEV_ACCEPT_LOCAL(in_dev)	IN_DEV_ORCONF((in_dev), ACCEPT_LOCAL)
101  #define IN_DEV_BOOTP_RELAY(in_dev)	IN_DEV_ANDCONF((in_dev), BOOTP_RELAY)
102  
103  #define IN_DEV_LOG_MARTIANS(in_dev)	IN_DEV_ORCONF((in_dev), LOG_MARTIANS)
104  #define IN_DEV_PROXY_ARP(in_dev)	IN_DEV_ORCONF((in_dev), PROXY_ARP)
105  #define IN_DEV_PROXY_ARP_PVLAN(in_dev)	IN_DEV_CONF_GET(in_dev, PROXY_ARP_PVLAN)
106  #define IN_DEV_SHARED_MEDIA(in_dev)	IN_DEV_ORCONF((in_dev), SHARED_MEDIA)
107  #define IN_DEV_TX_REDIRECTS(in_dev)	IN_DEV_ORCONF((in_dev), SEND_REDIRECTS)
108  #define IN_DEV_SEC_REDIRECTS(in_dev)	IN_DEV_ORCONF((in_dev), \
109  						      SECURE_REDIRECTS)
110  #define IN_DEV_IDTAG(in_dev)		IN_DEV_CONF_GET(in_dev, TAG)
111  #define IN_DEV_MEDIUM_ID(in_dev)	IN_DEV_CONF_GET(in_dev, MEDIUM_ID)
112  #define IN_DEV_PROMOTE_SECONDARIES(in_dev) \
113  					IN_DEV_ORCONF((in_dev), \
114  						      PROMOTE_SECONDARIES)
115  #define IN_DEV_ROUTE_LOCALNET(in_dev)	IN_DEV_ORCONF(in_dev, ROUTE_LOCALNET)
116  #define IN_DEV_NET_ROUTE_LOCALNET(in_dev, net)	\
117  	IN_DEV_NET_ORCONF(in_dev, net, ROUTE_LOCALNET)
118  
119  #define IN_DEV_RX_REDIRECTS(in_dev) \
120  	((IN_DEV_FORWARD(in_dev) && \
121  	  IN_DEV_ANDCONF((in_dev), ACCEPT_REDIRECTS)) \
122  	 || (!IN_DEV_FORWARD(in_dev) && \
123  	  IN_DEV_ORCONF((in_dev), ACCEPT_REDIRECTS)))
124  
125  #define IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN(in_dev) \
126  	IN_DEV_CONF_GET((in_dev), IGNORE_ROUTES_WITH_LINKDOWN)
127  
128  #define IN_DEV_ARPFILTER(in_dev)	IN_DEV_ORCONF((in_dev), ARPFILTER)
129  #define IN_DEV_ARP_ACCEPT(in_dev)	IN_DEV_ORCONF((in_dev), ARP_ACCEPT)
130  #define IN_DEV_ARP_ANNOUNCE(in_dev)	IN_DEV_MAXCONF((in_dev), ARP_ANNOUNCE)
131  #define IN_DEV_ARP_IGNORE(in_dev)	IN_DEV_MAXCONF((in_dev), ARP_IGNORE)
132  #define IN_DEV_ARP_NOTIFY(in_dev)	IN_DEV_MAXCONF((in_dev), ARP_NOTIFY)
133  
134  struct in_ifaddr {
135  	struct hlist_node	hash;
136  	struct in_ifaddr	*ifa_next;
137  	struct in_device	*ifa_dev;
138  	struct rcu_head		rcu_head;
139  	__be32			ifa_local;
140  	__be32			ifa_address;
141  	__be32			ifa_mask;
142  	__be32			ifa_broadcast;
143  	unsigned char		ifa_scope;
144  	unsigned char		ifa_prefixlen;
145  	__u32			ifa_flags;
146  	char			ifa_label[IFNAMSIZ];
147  
148  	/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */
149  	__u32			ifa_valid_lft;
150  	__u32			ifa_preferred_lft;
151  	unsigned long		ifa_cstamp; /* created timestamp */
152  	unsigned long		ifa_tstamp; /* updated timestamp */
153  };
154  
155  struct in_validator_info {
156  	__be32			ivi_addr;
157  	struct in_device	*ivi_dev;
158  };
159  
160  int register_inetaddr_notifier(struct notifier_block *nb);
161  int unregister_inetaddr_notifier(struct notifier_block *nb);
162  int register_inetaddr_validator_notifier(struct notifier_block *nb);
163  int unregister_inetaddr_validator_notifier(struct notifier_block *nb);
164  
165  void inet_netconf_notify_devconf(struct net *net, int event, int type,
166  				 int ifindex, struct ipv4_devconf *devconf);
167  
168  struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref);
ip_dev_find(struct net * net,__be32 addr)169  static inline struct net_device *ip_dev_find(struct net *net, __be32 addr)
170  {
171  	return __ip_dev_find(net, addr, true);
172  }
173  
174  int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
175  int devinet_ioctl(struct net *net, unsigned int cmd, void __user *);
176  void devinet_init(void);
177  struct in_device *inetdev_by_index(struct net *, int);
178  __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
179  __be32 inet_confirm_addr(struct net *net, struct in_device *in_dev, __be32 dst,
180  			 __be32 local, int scope);
181  struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
182  				    __be32 mask);
inet_ifa_match(__be32 addr,struct in_ifaddr * ifa)183  static __inline__ bool inet_ifa_match(__be32 addr, struct in_ifaddr *ifa)
184  {
185  	return !((addr^ifa->ifa_address)&ifa->ifa_mask);
186  }
187  
188  /*
189   *	Check if a mask is acceptable.
190   */
191  
bad_mask(__be32 mask,__be32 addr)192  static __inline__ bool bad_mask(__be32 mask, __be32 addr)
193  {
194  	__u32 hmask;
195  	if (addr & (mask = ~mask))
196  		return true;
197  	hmask = ntohl(mask);
198  	if (hmask & (hmask+1))
199  		return true;
200  	return false;
201  }
202  
203  #define for_primary_ifa(in_dev)	{ struct in_ifaddr *ifa; \
204    for (ifa = (in_dev)->ifa_list; ifa && !(ifa->ifa_flags&IFA_F_SECONDARY); ifa = ifa->ifa_next)
205  
206  #define for_ifa(in_dev)	{ struct in_ifaddr *ifa; \
207    for (ifa = (in_dev)->ifa_list; ifa; ifa = ifa->ifa_next)
208  
209  
210  #define endfor_ifa(in_dev) }
211  
__in_dev_get_rcu(const struct net_device * dev)212  static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev)
213  {
214  	return rcu_dereference(dev->ip_ptr);
215  }
216  
in_dev_get(const struct net_device * dev)217  static inline struct in_device *in_dev_get(const struct net_device *dev)
218  {
219  	struct in_device *in_dev;
220  
221  	rcu_read_lock();
222  	in_dev = __in_dev_get_rcu(dev);
223  	if (in_dev)
224  		refcount_inc(&in_dev->refcnt);
225  	rcu_read_unlock();
226  	return in_dev;
227  }
228  
__in_dev_get_rtnl(const struct net_device * dev)229  static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev)
230  {
231  	return rtnl_dereference(dev->ip_ptr);
232  }
233  
__in_dev_arp_parms_get_rcu(const struct net_device * dev)234  static inline struct neigh_parms *__in_dev_arp_parms_get_rcu(const struct net_device *dev)
235  {
236  	struct in_device *in_dev = __in_dev_get_rcu(dev);
237  
238  	return in_dev ? in_dev->arp_parms : NULL;
239  }
240  
241  void in_dev_finish_destroy(struct in_device *idev);
242  
in_dev_put(struct in_device * idev)243  static inline void in_dev_put(struct in_device *idev)
244  {
245  	if (refcount_dec_and_test(&idev->refcnt))
246  		in_dev_finish_destroy(idev);
247  }
248  
249  #define __in_dev_put(idev)  refcount_dec(&(idev)->refcnt)
250  #define in_dev_hold(idev)   refcount_inc(&(idev)->refcnt)
251  
252  #endif /* __KERNEL__ */
253  
inet_make_mask(int logmask)254  static __inline__ __be32 inet_make_mask(int logmask)
255  {
256  	if (logmask)
257  		return htonl(~((1U<<(32-logmask))-1));
258  	return 0;
259  }
260  
inet_mask_len(__be32 mask)261  static __inline__ int inet_mask_len(__be32 mask)
262  {
263  	__u32 hmask = ntohl(mask);
264  	if (!hmask)
265  		return 0;
266  	return 32 - ffz(~hmask);
267  }
268  
269  
270  #endif /* _LINUX_INETDEVICE_H */
271