1c5eb02667bb5952aeeac8a42a4cc0d61f31425b
[linux-flexiantxendom0-3.2.10.git] / include / linux / inetdevice.h
1 #ifndef _LINUX_INETDEVICE_H
2 #define _LINUX_INETDEVICE_H
3
4 #ifdef __KERNEL__
5
6 struct ipv4_devconf
7 {
8         int     accept_redirects;
9         int     send_redirects;
10         int     secure_redirects;
11         int     shared_media;
12         int     accept_source_route;
13         int     rp_filter;
14         int     proxy_arp;
15         int     bootp_relay;
16         int     log_martians;
17         int     forwarding;
18         int     mc_forwarding;
19         int     tag;
20         int     arp_filter;
21         int     medium_id;
22         int     no_xfrm;
23         int     no_policy;
24         int     force_igmp_version;
25         void    *sysctl;
26 };
27
28 extern struct ipv4_devconf ipv4_devconf;
29
30 struct in_device
31 {
32         struct net_device               *dev;
33         atomic_t                refcnt;
34         rwlock_t                lock;
35         int                     dead;
36         struct in_ifaddr        *ifa_list;      /* IP ifaddr chain              */
37         struct ip_mc_list       *mc_list;       /* IP multicast filter chain    */
38         rwlock_t                mc_lock;        /* for mc_tomb */
39         struct ip_mc_list       *mc_tomb;
40         unsigned long           mr_v1_seen;
41         unsigned long           mr_v2_seen;
42         unsigned long           mr_maxdelay;
43         unsigned char           mr_qrv;
44         unsigned char           mr_gq_running;
45         unsigned char           mr_ifc_count;
46         struct timer_list       mr_gq_timer;    /* general query timer */
47         struct timer_list       mr_ifc_timer;   /* interface change timer */
48
49         struct neigh_parms      *arp_parms;
50         struct ipv4_devconf     cnf;
51 };
52
53 #define IN_DEV_FORWARD(in_dev)          ((in_dev)->cnf.forwarding)
54 #define IN_DEV_MFORWARD(in_dev)         (ipv4_devconf.mc_forwarding && (in_dev)->cnf.mc_forwarding)
55 #define IN_DEV_RPFILTER(in_dev)         (ipv4_devconf.rp_filter && (in_dev)->cnf.rp_filter)
56 #define IN_DEV_SOURCE_ROUTE(in_dev)     (ipv4_devconf.accept_source_route && (in_dev)->cnf.accept_source_route)
57 #define IN_DEV_BOOTP_RELAY(in_dev)      (ipv4_devconf.bootp_relay && (in_dev)->cnf.bootp_relay)
58
59 #define IN_DEV_LOG_MARTIANS(in_dev)     (ipv4_devconf.log_martians || (in_dev)->cnf.log_martians)
60 #define IN_DEV_PROXY_ARP(in_dev)        (ipv4_devconf.proxy_arp || (in_dev)->cnf.proxy_arp)
61 #define IN_DEV_SHARED_MEDIA(in_dev)     (ipv4_devconf.shared_media || (in_dev)->cnf.shared_media)
62 #define IN_DEV_TX_REDIRECTS(in_dev)     (ipv4_devconf.send_redirects || (in_dev)->cnf.send_redirects)
63 #define IN_DEV_SEC_REDIRECTS(in_dev)    (ipv4_devconf.secure_redirects || (in_dev)->cnf.secure_redirects)
64 #define IN_DEV_IDTAG(in_dev)            ((in_dev)->cnf.tag)
65 #define IN_DEV_MEDIUM_ID(in_dev)        ((in_dev)->cnf.medium_id)
66
67 #define IN_DEV_RX_REDIRECTS(in_dev) \
68         ((IN_DEV_FORWARD(in_dev) && \
69           (ipv4_devconf.accept_redirects && (in_dev)->cnf.accept_redirects)) \
70          || (!IN_DEV_FORWARD(in_dev) && \
71           (ipv4_devconf.accept_redirects || (in_dev)->cnf.accept_redirects)))
72
73 #define IN_DEV_ARPFILTER(in_dev)        (ipv4_devconf.arp_filter || (in_dev)->cnf.arp_filter)
74
75 struct in_ifaddr
76 {
77         struct in_ifaddr        *ifa_next;
78         struct in_device        *ifa_dev;
79         u32                     ifa_local;
80         u32                     ifa_address;
81         u32                     ifa_mask;
82         u32                     ifa_broadcast;
83         u32                     ifa_anycast;
84         unsigned char           ifa_scope;
85         unsigned char           ifa_flags;
86         unsigned char           ifa_prefixlen;
87         char                    ifa_label[IFNAMSIZ];
88 };
89
90 extern int register_inetaddr_notifier(struct notifier_block *nb);
91 extern int unregister_inetaddr_notifier(struct notifier_block *nb);
92
93 extern struct net_device        *ip_dev_find(u32 addr);
94 extern int              inet_addr_onlink(struct in_device *in_dev, u32 a, u32 b);
95 extern int              devinet_ioctl(unsigned int cmd, void *);
96 extern void             devinet_init(void);
97 extern struct in_device *inetdev_init(struct net_device *dev);
98 extern struct in_device *inetdev_by_index(int);
99 extern u32              inet_select_addr(const struct net_device *dev, u32 dst, int scope);
100 extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, u32 prefix, u32 mask);
101 extern void             inet_forward_change(void);
102
103 static __inline__ int inet_ifa_match(u32 addr, struct in_ifaddr *ifa)
104 {
105         return !((addr^ifa->ifa_address)&ifa->ifa_mask);
106 }
107
108 /*
109  *      Check if a mask is acceptable.
110  */
111  
112 static __inline__ int bad_mask(u32 mask, u32 addr)
113 {
114         if (addr & (mask = ~mask))
115                 return 1;
116         mask = ntohl(mask);
117         if (mask & (mask+1))
118                 return 1;
119         return 0;
120 }
121
122 #define for_primary_ifa(in_dev) { struct in_ifaddr *ifa; \
123   for (ifa = (in_dev)->ifa_list; ifa && !(ifa->ifa_flags&IFA_F_SECONDARY); ifa = ifa->ifa_next)
124
125 #define for_ifa(in_dev) { struct in_ifaddr *ifa; \
126   for (ifa = (in_dev)->ifa_list; ifa; ifa = ifa->ifa_next)
127
128
129 #define endfor_ifa(in_dev) }
130
131 extern rwlock_t inetdev_lock;
132
133
134 static __inline__ struct in_device *
135 in_dev_get(const struct net_device *dev)
136 {
137         struct in_device *in_dev;
138
139         read_lock(&inetdev_lock);
140         in_dev = dev->ip_ptr;
141         if (in_dev)
142                 atomic_inc(&in_dev->refcnt);
143         read_unlock(&inetdev_lock);
144         return in_dev;
145 }
146
147 static __inline__ struct in_device *
148 __in_dev_get(const struct net_device *dev)
149 {
150         return (struct in_device*)dev->ip_ptr;
151 }
152
153 extern void in_dev_finish_destroy(struct in_device *idev);
154
155 static __inline__ void
156 in_dev_put(struct in_device *idev)
157 {
158         if (atomic_dec_and_test(&idev->refcnt))
159                 in_dev_finish_destroy(idev);
160 }
161
162 #define __in_dev_put(idev)  atomic_dec(&(idev)->refcnt)
163 #define in_dev_hold(idev)   atomic_inc(&(idev)->refcnt)
164
165 #endif /* __KERNEL__ */
166
167 static __inline__ __u32 inet_make_mask(int logmask)
168 {
169         if (logmask)
170                 return htonl(~((1<<(32-logmask))-1));
171         return 0;
172 }
173
174 static __inline__ int inet_mask_len(__u32 mask)
175 {
176         if (!(mask = ntohl(mask)))
177                 return 0;
178         return 32 - ffz(~mask);
179 }
180
181
182 #endif /* _LINUX_INETDEVICE_H */