911c09cb9bf922ea48583dfd7dbac8ee330cfc88
[linux-2.6.git] / include / linux / atalk.h
1 #ifndef __LINUX_ATALK_H__
2 #define __LINUX_ATALK_H__
3
4 #include <asm/byteorder.h>
5
6 /*
7  * AppleTalk networking structures
8  *
9  * The following are directly referenced from the University Of Michigan
10  * netatalk for compatibility reasons.
11  */
12 #define ATPORT_FIRST    1
13 #define ATPORT_RESERVED 128
14 #define ATPORT_LAST     254             /* 254 is only legal on localtalk */ 
15 #define ATADDR_ANYNET   (__u16)0
16 #define ATADDR_ANYNODE  (__u8)0
17 #define ATADDR_ANYPORT  (__u8)0
18 #define ATADDR_BCAST    (__u8)255
19 #define DDP_MAXSZ       587
20 #define DDP_MAXHOPS     15              /* 4 bits of hop counter */
21
22 #define SIOCATALKDIFADDR       (SIOCPROTOPRIVATE + 0)
23
24 struct atalk_addr {
25         __be16  s_net;
26         __u8    s_node;
27 };
28
29 struct sockaddr_at {
30         sa_family_t       sat_family;
31         __u8              sat_port;
32         struct atalk_addr sat_addr;
33         char              sat_zero[8];
34 };
35
36 struct atalk_netrange {
37         __u8    nr_phase;
38         __be16  nr_firstnet;
39         __be16  nr_lastnet;
40 };
41
42 #ifdef __KERNEL__
43
44 #include <net/sock.h>
45
46 struct atalk_route {
47         struct net_device  *dev;
48         struct atalk_addr  target;
49         struct atalk_addr  gateway;
50         int                flags;
51         struct atalk_route *next;
52 };
53
54 /**
55  *      struct atalk_iface - AppleTalk Interface
56  *      @dev - Network device associated with this interface
57  *      @address - Our address
58  *      @status - What are we doing?
59  *      @nets - Associated direct netrange
60  *      @next - next element in the list of interfaces
61  */
62 struct atalk_iface {
63         struct net_device       *dev;
64         struct atalk_addr       address;
65         int                     status;
66 #define ATIF_PROBE      1               /* Probing for an address */
67 #define ATIF_PROBE_FAIL 2               /* Probe collided */
68         struct atalk_netrange   nets;
69         struct atalk_iface      *next;
70 };
71         
72 struct atalk_sock {
73         /* struct sock has to be the first member of atalk_sock */
74         struct sock     sk;
75         __be16          dest_net;
76         __be16          src_net;
77         unsigned char   dest_node;
78         unsigned char   src_node;
79         unsigned char   dest_port;
80         unsigned char   src_port;
81 };
82
83 static inline struct atalk_sock *at_sk(struct sock *sk)
84 {
85         return (struct atalk_sock *)sk;
86 }
87
88 #include <asm/byteorder.h>
89
90 struct ddpehdr {
91 #ifdef __LITTLE_ENDIAN_BITFIELD
92         __u16   deh_len:10,
93                 deh_hops:4,
94                 deh_pad:2;
95 #else
96         __u16   deh_pad:2,
97                 deh_hops:4,
98                 deh_len:10;
99 #endif
100         __be16  deh_sum;
101         __be16  deh_dnet;
102         __be16  deh_snet;
103         __u8    deh_dnode;
104         __u8    deh_snode;
105         __u8    deh_dport;
106         __u8    deh_sport;
107         /* And netatalk apps expect to stick the type in themselves */
108 };
109
110 static __inline__ struct ddpehdr *ddp_hdr(struct sk_buff *skb)
111 {
112         return (struct ddpehdr *)skb->h.raw;
113 }
114
115 /*
116  *      Don't drop the struct into the struct above.  You'll get some
117  *      surprise padding.
118  */
119 struct ddpebits {
120 #ifdef __LITTLE_ENDIAN_BITFIELD
121         __u16   deh_len:10,
122                 deh_hops:4,
123                 deh_pad:2;
124 #else
125         __u16   deh_pad:2,
126                 deh_hops:4,
127                 deh_len:10;
128 #endif
129 };
130
131 /* Short form header */
132 struct ddpshdr {
133 #ifdef __LITTLE_ENDIAN_BITFIELD
134         __u16   dsh_len:10,
135                 dsh_pad:6;
136 #else
137         __u16   dsh_pad:6,
138                 dsh_len:10;
139 #endif
140         __u8    dsh_dport;
141         __u8    dsh_sport;
142         /* And netatalk apps expect to stick the type in themselves */
143 };
144
145 /* AppleTalk AARP headers */
146 struct elapaarp {
147         __be16  hw_type;
148 #define AARP_HW_TYPE_ETHERNET           1
149 #define AARP_HW_TYPE_TOKENRING          2
150         __be16  pa_type;
151         __u8    hw_len;
152         __u8    pa_len;
153 #define AARP_PA_ALEN                    4
154         __be16  function;
155 #define AARP_REQUEST                    1
156 #define AARP_REPLY                      2
157 #define AARP_PROBE                      3
158         __u8    hw_src[ETH_ALEN]        __attribute__ ((packed));
159         __u8    pa_src_zero             __attribute__ ((packed));
160         __be16  pa_src_net              __attribute__ ((packed));
161         __u8    pa_src_node             __attribute__ ((packed));
162         __u8    hw_dst[ETH_ALEN]        __attribute__ ((packed));
163         __u8    pa_dst_zero             __attribute__ ((packed));
164         __be16  pa_dst_net              __attribute__ ((packed));
165         __u8    pa_dst_node             __attribute__ ((packed));       
166 };
167
168 static __inline__ struct elapaarp *aarp_hdr(struct sk_buff *skb)
169 {
170         return (struct elapaarp *)skb->h.raw;
171 }
172
173 /* Not specified - how long till we drop a resolved entry */
174 #define AARP_EXPIRY_TIME        (5 * 60 * HZ)
175 /* Size of hash table */
176 #define AARP_HASH_SIZE          16
177 /* Fast retransmission timer when resolving */
178 #define AARP_TICK_TIME          (HZ / 5)
179 /* Send 10 requests then give up (2 seconds) */
180 #define AARP_RETRANSMIT_LIMIT   10
181 /*
182  * Some value bigger than total retransmit time + a bit for last reply to
183  * appear and to stop continual requests
184  */
185 #define AARP_RESOLVE_TIME       (10 * HZ)
186
187 extern struct datalink_proto *ddp_dl, *aarp_dl;
188 extern void aarp_proto_init(void);
189
190 /* Inter module exports */
191
192 /* Give a device find its atif control structure */
193 static inline struct atalk_iface *atalk_find_dev(struct net_device *dev)
194 {
195         return dev->atalk_ptr;
196 }
197
198 extern struct atalk_addr *atalk_find_dev_addr(struct net_device *dev);
199 extern struct net_device *atrtr_get_dev(struct atalk_addr *sa);
200 extern int               aarp_send_ddp(struct net_device *dev,
201                                        struct sk_buff *skb,
202                                        struct atalk_addr *sa, void *hwaddr);
203 extern void              aarp_device_down(struct net_device *dev);
204 extern void              aarp_probe_network(struct atalk_iface *atif);
205 extern int               aarp_proxy_probe_network(struct atalk_iface *atif,
206                                      struct atalk_addr *sa);
207 extern void              aarp_proxy_remove(struct net_device *dev,
208                                            struct atalk_addr *sa);
209
210 extern void             aarp_cleanup_module(void);
211
212 extern struct hlist_head atalk_sockets;
213 extern rwlock_t atalk_sockets_lock;
214
215 extern struct atalk_route *atalk_routes;
216 extern rwlock_t atalk_routes_lock;
217
218 extern struct atalk_iface *atalk_interfaces;
219 extern rwlock_t atalk_interfaces_lock;
220
221 extern struct atalk_route atrtr_default;
222
223 extern struct file_operations atalk_seq_arp_fops;
224
225 extern int sysctl_aarp_expiry_time;
226 extern int sysctl_aarp_tick_time;
227 extern int sysctl_aarp_retransmit_limit;
228 extern int sysctl_aarp_resolve_time;
229
230 #ifdef CONFIG_SYSCTL
231 extern void atalk_register_sysctl(void);
232 extern void atalk_unregister_sysctl(void);
233 #else
234 #define atalk_register_sysctl()         do { } while(0)
235 #define atalk_unregister_sysctl()       do { } while(0)
236 #endif
237
238 #ifdef CONFIG_PROC_FS
239 extern int atalk_proc_init(void);
240 extern void atalk_proc_exit(void);
241 #else
242 #define atalk_proc_init()       ({ 0; })
243 #define atalk_proc_exit()       do { } while(0)
244 #endif /* CONFIG_PROC_FS */
245
246 #endif /* __KERNEL__ */
247 #endif /* __LINUX_ATALK_H__ */