Blame view

include/linux/inetdevice.h 6.33 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  #ifndef _LINUX_INETDEVICE_H
  #define _LINUX_INETDEVICE_H
  
  #ifdef __KERNEL__
31be30854   Herbert Xu   [IPV4]: Add defau...
5
  #include <linux/bitmap.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
  #include <linux/if.h>
  #include <linux/netdevice.h>
  #include <linux/rcupdate.h>
  #include <linux/timer.h>
8bfe6d683   Satyam Sharma   [IPV4]: include s...
10
  #include <linux/sysctl.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
  
  struct ipv4_devconf
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  	void	*sysctl;
42f811b8b   Herbert Xu   [IPV4]: Convert I...
15
  	int	data[__NET_IPV4_CONF_MAX - 1];
31be30854   Herbert Xu   [IPV4]: Add defau...
16
  	DECLARE_BITMAP(state, __NET_IPV4_CONF_MAX - 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  struct in_device
  {
  	struct net_device	*dev;
  	atomic_t		refcnt;
  	int			dead;
  	struct in_ifaddr	*ifa_list;	/* IP ifaddr chain		*/
  	rwlock_t		mc_list_lock;
  	struct ip_mc_list	*mc_list;	/* IP multicast filter chain    */
  	spinlock_t		mc_tomb_lock;
  	struct ip_mc_list	*mc_tomb;
  	unsigned long		mr_v1_seen;
  	unsigned long		mr_v2_seen;
  	unsigned long		mr_maxdelay;
  	unsigned char		mr_qrv;
  	unsigned char		mr_gq_running;
  	unsigned char		mr_ifc_count;
  	struct timer_list	mr_gq_timer;	/* general query timer */
  	struct timer_list	mr_ifc_timer;	/* interface change timer */
  
  	struct neigh_parms	*arp_parms;
  	struct ipv4_devconf	cnf;
  	struct rcu_head		rcu_head;
  };
42f811b8b   Herbert Xu   [IPV4]: Convert I...
41
  #define IPV4_DEVCONF(cnf, attr) ((cnf).data[NET_IPV4_CONF_ ## attr - 1])
586f12115   Pavel Emelyanov   [IPV4]: Switch us...
42
43
  #define IPV4_DEVCONF_ALL(net, attr) \
  	IPV4_DEVCONF((*(net)->ipv4.devconf_all), attr)
42f811b8b   Herbert Xu   [IPV4]: Convert I...
44
45
46
47
48
49
50
51
52
53
54
  
  static inline int ipv4_devconf_get(struct in_device *in_dev, int index)
  {
  	index--;
  	return in_dev->cnf.data[index];
  }
  
  static inline void ipv4_devconf_set(struct in_device *in_dev, int index,
  				    int val)
  {
  	index--;
31be30854   Herbert Xu   [IPV4]: Add defau...
55
  	set_bit(index, in_dev->cnf.state);
42f811b8b   Herbert Xu   [IPV4]: Convert I...
56
57
  	in_dev->cnf.data[index] = val;
  }
71e27da96   Herbert Xu   [IPV4]: Restore o...
58
59
60
61
  static inline void ipv4_devconf_setall(struct in_device *in_dev)
  {
  	bitmap_fill(in_dev->cnf.state, __NET_IPV4_CONF_MAX - 1);
  }
42f811b8b   Herbert Xu   [IPV4]: Convert I...
62
63
64
65
66
67
  #define IN_DEV_CONF_GET(in_dev, attr) \
  	ipv4_devconf_get((in_dev), NET_IPV4_CONF_ ## attr)
  #define IN_DEV_CONF_SET(in_dev, attr, val) \
  	ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val))
  
  #define IN_DEV_ANDCONF(in_dev, attr) \
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
68
  	(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \
586f12115   Pavel Emelyanov   [IPV4]: Switch us...
69
  	 IN_DEV_CONF_GET((in_dev), attr))
42f811b8b   Herbert Xu   [IPV4]: Convert I...
70
  #define IN_DEV_ORCONF(in_dev, attr) \
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
71
  	(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) || \
586f12115   Pavel Emelyanov   [IPV4]: Switch us...
72
  	 IN_DEV_CONF_GET((in_dev), attr))
42f811b8b   Herbert Xu   [IPV4]: Convert I...
73
  #define IN_DEV_MAXCONF(in_dev, attr) \
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
74
  	(max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \
586f12115   Pavel Emelyanov   [IPV4]: Switch us...
75
  	     IN_DEV_CONF_GET((in_dev), attr)))
42f811b8b   Herbert Xu   [IPV4]: Convert I...
76
77
  
  #define IN_DEV_FORWARD(in_dev)		IN_DEV_CONF_GET((in_dev), FORWARDING)
01ecfe9ba   Pavel Emelyanov   [IPV4]: Cleanup I...
78
  #define IN_DEV_MFORWARD(in_dev)		IN_DEV_ANDCONF((in_dev), MC_FORWARDING)
42f811b8b   Herbert Xu   [IPV4]: Convert I...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  #define IN_DEV_RPFILTER(in_dev)		IN_DEV_ANDCONF((in_dev), RP_FILTER)
  #define IN_DEV_SOURCE_ROUTE(in_dev)	IN_DEV_ANDCONF((in_dev), \
  						       ACCEPT_SOURCE_ROUTE)
  #define IN_DEV_BOOTP_RELAY(in_dev)	IN_DEV_ANDCONF((in_dev), BOOTP_RELAY)
  
  #define IN_DEV_LOG_MARTIANS(in_dev)	IN_DEV_ORCONF((in_dev), LOG_MARTIANS)
  #define IN_DEV_PROXY_ARP(in_dev)	IN_DEV_ORCONF((in_dev), PROXY_ARP)
  #define IN_DEV_SHARED_MEDIA(in_dev)	IN_DEV_ORCONF((in_dev), SHARED_MEDIA)
  #define IN_DEV_TX_REDIRECTS(in_dev)	IN_DEV_ORCONF((in_dev), SEND_REDIRECTS)
  #define IN_DEV_SEC_REDIRECTS(in_dev)	IN_DEV_ORCONF((in_dev), \
  						      SECURE_REDIRECTS)
  #define IN_DEV_IDTAG(in_dev)		IN_DEV_CONF_GET(in_dev, TAG)
  #define IN_DEV_MEDIUM_ID(in_dev)	IN_DEV_CONF_GET(in_dev, MEDIUM_ID)
  #define IN_DEV_PROMOTE_SECONDARIES(in_dev) \
  					IN_DEV_ORCONF((in_dev), \
  						      PROMOTE_SECONDARIES)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
  
  #define IN_DEV_RX_REDIRECTS(in_dev) \
  	((IN_DEV_FORWARD(in_dev) && \
42f811b8b   Herbert Xu   [IPV4]: Convert I...
98
  	  IN_DEV_ANDCONF((in_dev), ACCEPT_REDIRECTS)) \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  	 || (!IN_DEV_FORWARD(in_dev) && \
42f811b8b   Herbert Xu   [IPV4]: Convert I...
100
  	  IN_DEV_ORCONF((in_dev), ACCEPT_REDIRECTS)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101

42f811b8b   Herbert Xu   [IPV4]: Convert I...
102
103
104
  #define IN_DEV_ARPFILTER(in_dev)	IN_DEV_ORCONF((in_dev), ARPFILTER)
  #define IN_DEV_ARP_ANNOUNCE(in_dev)	IN_DEV_MAXCONF((in_dev), ARP_ANNOUNCE)
  #define IN_DEV_ARP_IGNORE(in_dev)	IN_DEV_MAXCONF((in_dev), ARP_IGNORE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
107
108
109
110
  
  struct in_ifaddr
  {
  	struct in_ifaddr	*ifa_next;
  	struct in_device	*ifa_dev;
  	struct rcu_head		rcu_head;
a144ea4b7   Al Viro   [IPV4]: annotate ...
111
112
113
114
  	__be32			ifa_local;
  	__be32			ifa_address;
  	__be32			ifa_mask;
  	__be32			ifa_broadcast;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
117
118
119
120
121
122
  	unsigned char		ifa_scope;
  	unsigned char		ifa_flags;
  	unsigned char		ifa_prefixlen;
  	char			ifa_label[IFNAMSIZ];
  };
  
  extern int register_inetaddr_notifier(struct notifier_block *nb);
  extern int unregister_inetaddr_notifier(struct notifier_block *nb);
1ab352768   Denis V. Lunev   [NETNS]: Add name...
123
  extern struct net_device *ip_dev_find(struct net *net, __be32 addr);
ff428d72c   Al Viro   [IPV4]: inet_addr...
124
  extern int		inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
e5b13cb10   Denis V. Lunev   [NETNS]: Process ...
125
  extern int		devinet_ioctl(struct net *net, unsigned int cmd, void __user *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
  extern void		devinet_init(void);
7fee0ca23   Denis V. Lunev   [NETNS]: Add netn...
127
  extern struct in_device	*inetdev_by_index(struct net *, int);
a61ced5d1   Al Viro   [IPV4]: inet_sele...
128
  extern __be32		inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
9bd85e326   Denis V. Lunev   [IPV4]: Remove ex...
129
  extern __be32		inet_confirm_addr(struct in_device *in_dev, __be32 dst, __be32 local, int scope);
60cad5da5   Al Viro   [IPV4]: annotate ...
130
  extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, __be32 mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131

60cad5da5   Al Viro   [IPV4]: annotate ...
132
  static __inline__ int inet_ifa_match(__be32 addr, struct in_ifaddr *ifa)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
135
136
137
138
139
140
  {
  	return !((addr^ifa->ifa_address)&ifa->ifa_mask);
  }
  
  /*
   *	Check if a mask is acceptable.
   */
   
714e85be3   Al Viro   [IPV6]: Assorted ...
141
  static __inline__ int bad_mask(__be32 mask, __be32 addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  {
714e85be3   Al Viro   [IPV6]: Assorted ...
143
  	__u32 hmask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
  	if (addr & (mask = ~mask))
  		return 1;
714e85be3   Al Viro   [IPV6]: Assorted ...
146
147
  	hmask = ntohl(mask);
  	if (hmask & (hmask+1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
150
151
152
153
154
155
156
157
158
159
  		return 1;
  	return 0;
  }
  
  #define for_primary_ifa(in_dev)	{ struct in_ifaddr *ifa; \
    for (ifa = (in_dev)->ifa_list; ifa && !(ifa->ifa_flags&IFA_F_SECONDARY); ifa = ifa->ifa_next)
  
  #define for_ifa(in_dev)	{ struct in_ifaddr *ifa; \
    for (ifa = (in_dev)->ifa_list; ifa; ifa = ifa->ifa_next)
  
  
  #define endfor_ifa(in_dev) }
e5ed63991   Herbert Xu   [IPV4]: Replace _...
160
161
162
163
164
165
166
  static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev)
  {
  	struct in_device *in_dev = dev->ip_ptr;
  	if (in_dev)
  		in_dev = rcu_dereference(in_dev);
  	return in_dev;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
170
171
172
  static __inline__ struct in_device *
  in_dev_get(const struct net_device *dev)
  {
  	struct in_device *in_dev;
  
  	rcu_read_lock();
e5ed63991   Herbert Xu   [IPV4]: Replace _...
173
  	in_dev = __in_dev_get_rcu(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
178
179
180
  	if (in_dev)
  		atomic_inc(&in_dev->refcnt);
  	rcu_read_unlock();
  	return in_dev;
  }
  
  static __inline__ struct in_device *
e5ed63991   Herbert Xu   [IPV4]: Replace _...
181
  __in_dev_get_rtnl(const struct net_device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  {
  	return (struct in_device*)dev->ip_ptr;
  }
  
  extern void in_dev_finish_destroy(struct in_device *idev);
  
  static inline void in_dev_put(struct in_device *idev)
  {
  	if (atomic_dec_and_test(&idev->refcnt))
  		in_dev_finish_destroy(idev);
  }
  
  #define __in_dev_put(idev)  atomic_dec(&(idev)->refcnt)
  #define in_dev_hold(idev)   atomic_inc(&(idev)->refcnt)
  
  #endif /* __KERNEL__ */
60cad5da5   Al Viro   [IPV4]: annotate ...
198
  static __inline__ __be32 inet_make_mask(int logmask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
200
201
202
203
  {
  	if (logmask)
  		return htonl(~((1<<(32-logmask))-1));
  	return 0;
  }
714e85be3   Al Viro   [IPV6]: Assorted ...
204
  static __inline__ int inet_mask_len(__be32 mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  {
714e85be3   Al Viro   [IPV6]: Assorted ...
206
207
  	__u32 hmask = ntohl(mask);
  	if (!hmask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  		return 0;
714e85be3   Al Viro   [IPV6]: Assorted ...
209
  	return 32 - ffz(~hmask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
212
213
  }
  
  
  #endif /* _LINUX_INETDEVICE_H */