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 Torvaldsstatic 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 Torvaldsstatic __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 Torvaldsstatic __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 Torvaldsstatic 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 Bergmannstatic inline int atalk_register_sysctl(void) 16527da0d2eSArnd Bergmann { 16627da0d2eSArnd Bergmann return 0; 16727da0d2eSArnd Bergmann } atalk_unregister_sysctl(void)16827da0d2eSArnd Bergmannstatic 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 Bergmannstatic inline int atalk_proc_init(void) 17827da0d2eSArnd Bergmann { 17927da0d2eSArnd Bergmann return 0; 18027da0d2eSArnd Bergmann } atalk_proc_exit(void)18127da0d2eSArnd Bergmannstatic 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