xref: /linux-6.15/include/linux/atalk.h (revision 87c2ce3b)
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];
159 	__u8	pa_src_zero;
160 	__be16	pa_src_net;
161 	__u8	pa_src_node;
162 	__u8	hw_dst[ETH_ALEN];
163 	__u8	pa_dst_zero;
164 	__be16	pa_dst_net;
165 	__u8	pa_dst_node;
166 } __attribute__ ((packed));
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__ */
248