1 #ifndef _LINUX_INETDEVICE_H 2 #define _LINUX_INETDEVICE_H 3 4 #ifdef __KERNEL__ 5 6 #include <linux/bitmap.h> 7 #include <linux/if.h> 8 #include <linux/netdevice.h> 9 #include <linux/rcupdate.h> 10 #include <linux/timer.h> 11 #include <linux/sysctl.h> 12 13 struct ipv4_devconf 14 { 15 void *sysctl; 16 int data[__NET_IPV4_CONF_MAX - 1]; 17 DECLARE_BITMAP(state, __NET_IPV4_CONF_MAX - 1); 18 }; 19 20 struct in_device 21 { 22 struct net_device *dev; 23 atomic_t refcnt; 24 int dead; 25 struct in_ifaddr *ifa_list; /* IP ifaddr chain */ 26 rwlock_t mc_list_lock; 27 struct ip_mc_list *mc_list; /* IP multicast filter chain */ 28 spinlock_t mc_tomb_lock; 29 struct ip_mc_list *mc_tomb; 30 unsigned long mr_v1_seen; 31 unsigned long mr_v2_seen; 32 unsigned long mr_maxdelay; 33 unsigned char mr_qrv; 34 unsigned char mr_gq_running; 35 unsigned char mr_ifc_count; 36 struct timer_list mr_gq_timer; /* general query timer */ 37 struct timer_list mr_ifc_timer; /* interface change timer */ 38 39 struct neigh_parms *arp_parms; 40 struct ipv4_devconf cnf; 41 struct rcu_head rcu_head; 42 }; 43 44 #define IPV4_DEVCONF(cnf, attr) ((cnf).data[NET_IPV4_CONF_ ## attr - 1]) 45 #define IPV4_DEVCONF_ALL(net, attr) \ 46 IPV4_DEVCONF((*(net)->ipv4.devconf_all), attr) 47 48 static inline int ipv4_devconf_get(struct in_device *in_dev, int index) 49 { 50 index--; 51 return in_dev->cnf.data[index]; 52 } 53 54 static inline void ipv4_devconf_set(struct in_device *in_dev, int index, 55 int val) 56 { 57 index--; 58 set_bit(index, in_dev->cnf.state); 59 in_dev->cnf.data[index] = val; 60 } 61 62 static inline void ipv4_devconf_setall(struct in_device *in_dev) 63 { 64 bitmap_fill(in_dev->cnf.state, __NET_IPV4_CONF_MAX - 1); 65 } 66 67 #define IN_DEV_CONF_GET(in_dev, attr) \ 68 ipv4_devconf_get((in_dev), NET_IPV4_CONF_ ## attr) 69 #define IN_DEV_CONF_SET(in_dev, attr, val) \ 70 ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val)) 71 72 #define IN_DEV_ANDCONF(in_dev, attr) \ 73 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \ 74 IN_DEV_CONF_GET((in_dev), attr)) 75 #define IN_DEV_ORCONF(in_dev, attr) \ 76 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) || \ 77 IN_DEV_CONF_GET((in_dev), attr)) 78 #define IN_DEV_MAXCONF(in_dev, attr) \ 79 (max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \ 80 IN_DEV_CONF_GET((in_dev), attr))) 81 82 #define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING) 83 #define IN_DEV_MFORWARD(in_dev) IN_DEV_ANDCONF((in_dev), MC_FORWARDING) 84 #define IN_DEV_RPFILTER(in_dev) IN_DEV_ANDCONF((in_dev), RP_FILTER) 85 #define IN_DEV_SOURCE_ROUTE(in_dev) IN_DEV_ANDCONF((in_dev), \ 86 ACCEPT_SOURCE_ROUTE) 87 #define IN_DEV_BOOTP_RELAY(in_dev) IN_DEV_ANDCONF((in_dev), BOOTP_RELAY) 88 89 #define IN_DEV_LOG_MARTIANS(in_dev) IN_DEV_ORCONF((in_dev), LOG_MARTIANS) 90 #define IN_DEV_PROXY_ARP(in_dev) IN_DEV_ORCONF((in_dev), PROXY_ARP) 91 #define IN_DEV_SHARED_MEDIA(in_dev) IN_DEV_ORCONF((in_dev), SHARED_MEDIA) 92 #define IN_DEV_TX_REDIRECTS(in_dev) IN_DEV_ORCONF((in_dev), SEND_REDIRECTS) 93 #define IN_DEV_SEC_REDIRECTS(in_dev) IN_DEV_ORCONF((in_dev), \ 94 SECURE_REDIRECTS) 95 #define IN_DEV_IDTAG(in_dev) IN_DEV_CONF_GET(in_dev, TAG) 96 #define IN_DEV_MEDIUM_ID(in_dev) IN_DEV_CONF_GET(in_dev, MEDIUM_ID) 97 #define IN_DEV_PROMOTE_SECONDARIES(in_dev) \ 98 IN_DEV_ORCONF((in_dev), \ 99 PROMOTE_SECONDARIES) 100 101 #define IN_DEV_RX_REDIRECTS(in_dev) \ 102 ((IN_DEV_FORWARD(in_dev) && \ 103 IN_DEV_ANDCONF((in_dev), ACCEPT_REDIRECTS)) \ 104 || (!IN_DEV_FORWARD(in_dev) && \ 105 IN_DEV_ORCONF((in_dev), ACCEPT_REDIRECTS))) 106 107 #define IN_DEV_ARPFILTER(in_dev) IN_DEV_ORCONF((in_dev), ARPFILTER) 108 #define IN_DEV_ARP_ANNOUNCE(in_dev) IN_DEV_MAXCONF((in_dev), ARP_ANNOUNCE) 109 #define IN_DEV_ARP_IGNORE(in_dev) IN_DEV_MAXCONF((in_dev), ARP_IGNORE) 110 111 struct in_ifaddr 112 { 113 struct in_ifaddr *ifa_next; 114 struct in_device *ifa_dev; 115 struct rcu_head rcu_head; 116 __be32 ifa_local; 117 __be32 ifa_address; 118 __be32 ifa_mask; 119 __be32 ifa_broadcast; 120 unsigned char ifa_scope; 121 unsigned char ifa_flags; 122 unsigned char ifa_prefixlen; 123 char ifa_label[IFNAMSIZ]; 124 }; 125 126 extern int register_inetaddr_notifier(struct notifier_block *nb); 127 extern int unregister_inetaddr_notifier(struct notifier_block *nb); 128 129 extern struct net_device *ip_dev_find(struct net *net, __be32 addr); 130 extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); 131 extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); 132 extern void devinet_init(void); 133 extern struct in_device *inetdev_by_index(struct net *, int); 134 extern __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope); 135 extern __be32 inet_confirm_addr(struct in_device *in_dev, __be32 dst, __be32 local, int scope); 136 extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, __be32 mask); 137 138 static __inline__ int inet_ifa_match(__be32 addr, struct in_ifaddr *ifa) 139 { 140 return !((addr^ifa->ifa_address)&ifa->ifa_mask); 141 } 142 143 /* 144 * Check if a mask is acceptable. 145 */ 146 147 static __inline__ int bad_mask(__be32 mask, __be32 addr) 148 { 149 __u32 hmask; 150 if (addr & (mask = ~mask)) 151 return 1; 152 hmask = ntohl(mask); 153 if (hmask & (hmask+1)) 154 return 1; 155 return 0; 156 } 157 158 #define for_primary_ifa(in_dev) { struct in_ifaddr *ifa; \ 159 for (ifa = (in_dev)->ifa_list; ifa && !(ifa->ifa_flags&IFA_F_SECONDARY); ifa = ifa->ifa_next) 160 161 #define for_ifa(in_dev) { struct in_ifaddr *ifa; \ 162 for (ifa = (in_dev)->ifa_list; ifa; ifa = ifa->ifa_next) 163 164 165 #define endfor_ifa(in_dev) } 166 167 static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) 168 { 169 struct in_device *in_dev = dev->ip_ptr; 170 if (in_dev) 171 in_dev = rcu_dereference(in_dev); 172 return in_dev; 173 } 174 175 static __inline__ struct in_device * 176 in_dev_get(const struct net_device *dev) 177 { 178 struct in_device *in_dev; 179 180 rcu_read_lock(); 181 in_dev = __in_dev_get_rcu(dev); 182 if (in_dev) 183 atomic_inc(&in_dev->refcnt); 184 rcu_read_unlock(); 185 return in_dev; 186 } 187 188 static __inline__ struct in_device * 189 __in_dev_get_rtnl(const struct net_device *dev) 190 { 191 return (struct in_device*)dev->ip_ptr; 192 } 193 194 extern void in_dev_finish_destroy(struct in_device *idev); 195 196 static inline void in_dev_put(struct in_device *idev) 197 { 198 if (atomic_dec_and_test(&idev->refcnt)) 199 in_dev_finish_destroy(idev); 200 } 201 202 #define __in_dev_put(idev) atomic_dec(&(idev)->refcnt) 203 #define in_dev_hold(idev) atomic_inc(&(idev)->refcnt) 204 205 #endif /* __KERNEL__ */ 206 207 static __inline__ __be32 inet_make_mask(int logmask) 208 { 209 if (logmask) 210 return htonl(~((1<<(32-logmask))-1)); 211 return 0; 212 } 213 214 static __inline__ int inet_mask_len(__be32 mask) 215 { 216 __u32 hmask = ntohl(mask); 217 if (!hmask) 218 return 0; 219 return 32 - ffz(~hmask); 220 } 221 222 223 #endif /* _LINUX_INETDEVICE_H */ 224