Subversion Repositories shark

Rev

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 */