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