xref: /linux/include/linux/atalk.h (revision d6c6d0bb)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef __LINUX_ATALK_H__
31da177e4SLinus Torvalds #define __LINUX_ATALK_H__
41da177e4SLinus Torvalds 
59f3786dcSDavid S. Miller 
69f3786dcSDavid S. Miller #include <net/sock.h>
7607ca46eSDavid Howells #include <uapi/linux/atalk.h>
89f3786dcSDavid S. Miller 
91da177e4SLinus Torvalds struct atalk_route {
101da177e4SLinus Torvalds 	struct net_device  *dev;
111da177e4SLinus Torvalds 	struct atalk_addr  target;
121da177e4SLinus Torvalds 	struct atalk_addr  gateway;
131da177e4SLinus Torvalds 	int		   flags;
141da177e4SLinus Torvalds 	struct atalk_route *next;
151da177e4SLinus Torvalds };
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds /**
181da177e4SLinus Torvalds  *	struct atalk_iface - AppleTalk Interface
191da177e4SLinus Torvalds  *	@dev - Network device associated with this interface
201da177e4SLinus Torvalds  *	@address - Our address
211da177e4SLinus Torvalds  *	@status - What are we doing?
221da177e4SLinus Torvalds  *	@nets - Associated direct netrange
231da177e4SLinus Torvalds  *	@next - next element in the list of interfaces
241da177e4SLinus Torvalds  */
251da177e4SLinus Torvalds struct atalk_iface {
261da177e4SLinus Torvalds 	struct net_device	*dev;
271da177e4SLinus Torvalds 	struct atalk_addr	address;
281da177e4SLinus Torvalds 	int			status;
291da177e4SLinus Torvalds #define ATIF_PROBE	1		/* Probing for an address */
301da177e4SLinus Torvalds #define ATIF_PROBE_FAIL	2		/* Probe collided */
311da177e4SLinus Torvalds 	struct atalk_netrange	nets;
321da177e4SLinus Torvalds 	struct atalk_iface	*next;
331da177e4SLinus Torvalds };
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds struct atalk_sock {
361da177e4SLinus Torvalds 	/* struct sock has to be the first member of atalk_sock */
371da177e4SLinus Torvalds 	struct sock	sk;
38f6e276eeSAlexey Dobriyan 	__be16		dest_net;
39f6e276eeSAlexey Dobriyan 	__be16		src_net;
401da177e4SLinus Torvalds 	unsigned char	dest_node;
411da177e4SLinus Torvalds 	unsigned char	src_node;
421da177e4SLinus Torvalds 	unsigned char	dest_port;
431da177e4SLinus Torvalds 	unsigned char	src_port;
441da177e4SLinus Torvalds };
451da177e4SLinus Torvalds 
at_sk(struct sock * sk)461da177e4SLinus Torvalds static inline struct atalk_sock *at_sk(struct sock *sk)
471da177e4SLinus Torvalds {
481da177e4SLinus Torvalds 	return (struct atalk_sock *)sk;
491da177e4SLinus Torvalds }
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds struct ddpehdr {
522a50f28cSAl Viro 	__be16	deh_len_hops;	/* lower 10 bits are length, next 4 - hops */
53f6e276eeSAlexey Dobriyan 	__be16	deh_sum;
54f6e276eeSAlexey Dobriyan 	__be16	deh_dnet;
55f6e276eeSAlexey Dobriyan 	__be16	deh_snet;
561da177e4SLinus Torvalds 	__u8	deh_dnode;
571da177e4SLinus Torvalds 	__u8	deh_snode;
581da177e4SLinus Torvalds 	__u8	deh_dport;
591da177e4SLinus Torvalds 	__u8	deh_sport;
601da177e4SLinus Torvalds 	/* And netatalk apps expect to stick the type in themselves */
611da177e4SLinus Torvalds };
621da177e4SLinus Torvalds 
ddp_hdr(struct sk_buff * skb)631da177e4SLinus Torvalds static __inline__ struct ddpehdr *ddp_hdr(struct sk_buff *skb)
641da177e4SLinus Torvalds {
659c70220bSArnaldo Carvalho de Melo 	return (struct ddpehdr *)skb_transport_header(skb);
661da177e4SLinus Torvalds }
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds /* AppleTalk AARP headers */
691da177e4SLinus Torvalds struct elapaarp {
70f6e276eeSAlexey Dobriyan 	__be16	hw_type;
711da177e4SLinus Torvalds #define AARP_HW_TYPE_ETHERNET		1
721da177e4SLinus Torvalds #define AARP_HW_TYPE_TOKENRING		2
73f6e276eeSAlexey Dobriyan 	__be16	pa_type;
741da177e4SLinus Torvalds 	__u8	hw_len;
751da177e4SLinus Torvalds 	__u8	pa_len;
761da177e4SLinus Torvalds #define AARP_PA_ALEN			4
77f6e276eeSAlexey Dobriyan 	__be16	function;
781da177e4SLinus Torvalds #define AARP_REQUEST			1
791da177e4SLinus Torvalds #define AARP_REPLY			2
801da177e4SLinus Torvalds #define AARP_PROBE			3
816a878184SJan Blunck 	__u8	hw_src[ETH_ALEN];
826a878184SJan Blunck 	__u8	pa_src_zero;
836a878184SJan Blunck 	__be16	pa_src_net;
846a878184SJan Blunck 	__u8	pa_src_node;
856a878184SJan Blunck 	__u8	hw_dst[ETH_ALEN];
866a878184SJan Blunck 	__u8	pa_dst_zero;
876a878184SJan Blunck 	__be16	pa_dst_net;
886a878184SJan Blunck 	__u8	pa_dst_node;
896a878184SJan Blunck } __attribute__ ((packed));
901da177e4SLinus Torvalds 
aarp_hdr(struct sk_buff * skb)911da177e4SLinus Torvalds static __inline__ struct elapaarp *aarp_hdr(struct sk_buff *skb)
921da177e4SLinus Torvalds {
939c70220bSArnaldo Carvalho de Melo 	return (struct elapaarp *)skb_transport_header(skb);
941da177e4SLinus Torvalds }
951da177e4SLinus Torvalds 
961da177e4SLinus Torvalds /* Not specified - how long till we drop a resolved entry */
971da177e4SLinus Torvalds #define AARP_EXPIRY_TIME	(5 * 60 * HZ)
981da177e4SLinus Torvalds /* Size of hash table */
991da177e4SLinus Torvalds #define AARP_HASH_SIZE		16
1001da177e4SLinus Torvalds /* Fast retransmission timer when resolving */
1011da177e4SLinus Torvalds #define AARP_TICK_TIME		(HZ / 5)
1021da177e4SLinus Torvalds /* Send 10 requests then give up (2 seconds) */
1031da177e4SLinus Torvalds #define AARP_RETRANSMIT_LIMIT	10
1041da177e4SLinus Torvalds /*
1051da177e4SLinus Torvalds  * Some value bigger than total retransmit time + a bit for last reply to
1061da177e4SLinus Torvalds  * appear and to stop continual requests
1071da177e4SLinus Torvalds  */
1081da177e4SLinus Torvalds #define AARP_RESOLVE_TIME	(10 * HZ)
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds extern struct datalink_proto *ddp_dl, *aarp_dl;
1119804501fSYueHaibing extern int aarp_proto_init(void);
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds /* Inter module exports */
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds /* Give a device find its atif control structure */
116*d6c6d0bbSLukas Bulwahn #if IS_ENABLED(CONFIG_ATALK)
atalk_find_dev(struct net_device * dev)1171da177e4SLinus Torvalds static inline struct atalk_iface *atalk_find_dev(struct net_device *dev)
1181da177e4SLinus Torvalds {
1191da177e4SLinus Torvalds 	return dev->atalk_ptr;
1201da177e4SLinus Torvalds }
12189e58148SDavid Ahern #endif
1221da177e4SLinus Torvalds 
1231da177e4SLinus Torvalds extern struct atalk_addr *atalk_find_dev_addr(struct net_device *dev);
1241da177e4SLinus Torvalds extern struct net_device *atrtr_get_dev(struct atalk_addr *sa);
1251da177e4SLinus Torvalds extern int		 aarp_send_ddp(struct net_device *dev,
1261da177e4SLinus Torvalds 				       struct sk_buff *skb,
1271da177e4SLinus Torvalds 				       struct atalk_addr *sa, void *hwaddr);
1281da177e4SLinus Torvalds extern void		 aarp_device_down(struct net_device *dev);
1291da177e4SLinus Torvalds extern void		 aarp_probe_network(struct atalk_iface *atif);
1301da177e4SLinus Torvalds extern int 		 aarp_proxy_probe_network(struct atalk_iface *atif,
1311da177e4SLinus Torvalds 				     struct atalk_addr *sa);
1321da177e4SLinus Torvalds extern void		 aarp_proxy_remove(struct net_device *dev,
1331da177e4SLinus Torvalds 					   struct atalk_addr *sa);
1341da177e4SLinus Torvalds 
1351da177e4SLinus Torvalds extern void		aarp_cleanup_module(void);
1361da177e4SLinus Torvalds 
1371da177e4SLinus Torvalds extern struct hlist_head atalk_sockets;
1381da177e4SLinus Torvalds extern rwlock_t atalk_sockets_lock;
1391da177e4SLinus Torvalds 
1401da177e4SLinus Torvalds extern struct atalk_route *atalk_routes;
1411da177e4SLinus Torvalds extern rwlock_t atalk_routes_lock;
1421da177e4SLinus Torvalds 
1431da177e4SLinus Torvalds extern struct atalk_iface *atalk_interfaces;
1441da177e4SLinus Torvalds extern rwlock_t atalk_interfaces_lock;
1451da177e4SLinus Torvalds 
1461da177e4SLinus Torvalds extern struct atalk_route atrtr_default;
1471da177e4SLinus Torvalds 
14844414d82SChristoph Hellwig struct aarp_iter_state {
14944414d82SChristoph Hellwig 	int bucket;
15044414d82SChristoph Hellwig 	struct aarp_entry **table;
15144414d82SChristoph Hellwig };
15244414d82SChristoph Hellwig 
15344414d82SChristoph Hellwig extern const struct seq_operations aarp_seq_ops;
1541da177e4SLinus Torvalds 
1551da177e4SLinus Torvalds extern int sysctl_aarp_expiry_time;
1561da177e4SLinus Torvalds extern int sysctl_aarp_tick_time;
1571da177e4SLinus Torvalds extern int sysctl_aarp_retransmit_limit;
1581da177e4SLinus Torvalds extern int sysctl_aarp_resolve_time;
1591da177e4SLinus Torvalds 
1601da177e4SLinus Torvalds #ifdef CONFIG_SYSCTL
1616377f787SYueHaibing extern int atalk_register_sysctl(void);
1621da177e4SLinus Torvalds extern void atalk_unregister_sysctl(void);
1631da177e4SLinus Torvalds #else
atalk_register_sysctl(void)16427da0d2eSArnd Bergmann static inline int atalk_register_sysctl(void)
16527da0d2eSArnd Bergmann {
16627da0d2eSArnd Bergmann 	return 0;
16727da0d2eSArnd Bergmann }
atalk_unregister_sysctl(void)16827da0d2eSArnd Bergmann static inline void atalk_unregister_sysctl(void)
16927da0d2eSArnd Bergmann {
17027da0d2eSArnd Bergmann }
1711da177e4SLinus Torvalds #endif
1721da177e4SLinus Torvalds 
1731da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
1741da177e4SLinus Torvalds extern int atalk_proc_init(void);
1751da177e4SLinus Torvalds extern void atalk_proc_exit(void);
1761da177e4SLinus Torvalds #else
atalk_proc_init(void)17727da0d2eSArnd Bergmann static inline int atalk_proc_init(void)
17827da0d2eSArnd Bergmann {
17927da0d2eSArnd Bergmann 	return 0;
18027da0d2eSArnd Bergmann }
atalk_proc_exit(void)18127da0d2eSArnd Bergmann static inline void atalk_proc_exit(void)
18227da0d2eSArnd Bergmann {
18327da0d2eSArnd Bergmann }
1841da177e4SLinus Torvalds #endif /* CONFIG_PROC_FS */
1851da177e4SLinus Torvalds 
1861da177e4SLinus Torvalds #endif /* __LINUX_ATALK_H__ */
187