1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __LINUX_ATALK_H__ 3*4882a593Smuzhiyun #define __LINUX_ATALK_H__ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <net/sock.h> 7*4882a593Smuzhiyun #include <uapi/linux/atalk.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct atalk_route { 10*4882a593Smuzhiyun struct net_device *dev; 11*4882a593Smuzhiyun struct atalk_addr target; 12*4882a593Smuzhiyun struct atalk_addr gateway; 13*4882a593Smuzhiyun int flags; 14*4882a593Smuzhiyun struct atalk_route *next; 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /** 18*4882a593Smuzhiyun * struct atalk_iface - AppleTalk Interface 19*4882a593Smuzhiyun * @dev - Network device associated with this interface 20*4882a593Smuzhiyun * @address - Our address 21*4882a593Smuzhiyun * @status - What are we doing? 22*4882a593Smuzhiyun * @nets - Associated direct netrange 23*4882a593Smuzhiyun * @next - next element in the list of interfaces 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun struct atalk_iface { 26*4882a593Smuzhiyun struct net_device *dev; 27*4882a593Smuzhiyun struct atalk_addr address; 28*4882a593Smuzhiyun int status; 29*4882a593Smuzhiyun #define ATIF_PROBE 1 /* Probing for an address */ 30*4882a593Smuzhiyun #define ATIF_PROBE_FAIL 2 /* Probe collided */ 31*4882a593Smuzhiyun struct atalk_netrange nets; 32*4882a593Smuzhiyun struct atalk_iface *next; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct atalk_sock { 36*4882a593Smuzhiyun /* struct sock has to be the first member of atalk_sock */ 37*4882a593Smuzhiyun struct sock sk; 38*4882a593Smuzhiyun __be16 dest_net; 39*4882a593Smuzhiyun __be16 src_net; 40*4882a593Smuzhiyun unsigned char dest_node; 41*4882a593Smuzhiyun unsigned char src_node; 42*4882a593Smuzhiyun unsigned char dest_port; 43*4882a593Smuzhiyun unsigned char src_port; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun at_sk(struct sock * sk)46*4882a593Smuzhiyunstatic inline struct atalk_sock *at_sk(struct sock *sk) 47*4882a593Smuzhiyun { 48*4882a593Smuzhiyun return (struct atalk_sock *)sk; 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct ddpehdr { 52*4882a593Smuzhiyun __be16 deh_len_hops; /* lower 10 bits are length, next 4 - hops */ 53*4882a593Smuzhiyun __be16 deh_sum; 54*4882a593Smuzhiyun __be16 deh_dnet; 55*4882a593Smuzhiyun __be16 deh_snet; 56*4882a593Smuzhiyun __u8 deh_dnode; 57*4882a593Smuzhiyun __u8 deh_snode; 58*4882a593Smuzhiyun __u8 deh_dport; 59*4882a593Smuzhiyun __u8 deh_sport; 60*4882a593Smuzhiyun /* And netatalk apps expect to stick the type in themselves */ 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun ddp_hdr(struct sk_buff * skb)63*4882a593Smuzhiyunstatic __inline__ struct ddpehdr *ddp_hdr(struct sk_buff *skb) 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun return (struct ddpehdr *)skb_transport_header(skb); 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* AppleTalk AARP headers */ 69*4882a593Smuzhiyun struct elapaarp { 70*4882a593Smuzhiyun __be16 hw_type; 71*4882a593Smuzhiyun #define AARP_HW_TYPE_ETHERNET 1 72*4882a593Smuzhiyun #define AARP_HW_TYPE_TOKENRING 2 73*4882a593Smuzhiyun __be16 pa_type; 74*4882a593Smuzhiyun __u8 hw_len; 75*4882a593Smuzhiyun __u8 pa_len; 76*4882a593Smuzhiyun #define AARP_PA_ALEN 4 77*4882a593Smuzhiyun __be16 function; 78*4882a593Smuzhiyun #define AARP_REQUEST 1 79*4882a593Smuzhiyun #define AARP_REPLY 2 80*4882a593Smuzhiyun #define AARP_PROBE 3 81*4882a593Smuzhiyun __u8 hw_src[ETH_ALEN]; 82*4882a593Smuzhiyun __u8 pa_src_zero; 83*4882a593Smuzhiyun __be16 pa_src_net; 84*4882a593Smuzhiyun __u8 pa_src_node; 85*4882a593Smuzhiyun __u8 hw_dst[ETH_ALEN]; 86*4882a593Smuzhiyun __u8 pa_dst_zero; 87*4882a593Smuzhiyun __be16 pa_dst_net; 88*4882a593Smuzhiyun __u8 pa_dst_node; 89*4882a593Smuzhiyun } __attribute__ ((packed)); 90*4882a593Smuzhiyun aarp_hdr(struct sk_buff * skb)91*4882a593Smuzhiyunstatic __inline__ struct elapaarp *aarp_hdr(struct sk_buff *skb) 92*4882a593Smuzhiyun { 93*4882a593Smuzhiyun return (struct elapaarp *)skb_transport_header(skb); 94*4882a593Smuzhiyun } 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* Not specified - how long till we drop a resolved entry */ 97*4882a593Smuzhiyun #define AARP_EXPIRY_TIME (5 * 60 * HZ) 98*4882a593Smuzhiyun /* Size of hash table */ 99*4882a593Smuzhiyun #define AARP_HASH_SIZE 16 100*4882a593Smuzhiyun /* Fast retransmission timer when resolving */ 101*4882a593Smuzhiyun #define AARP_TICK_TIME (HZ / 5) 102*4882a593Smuzhiyun /* Send 10 requests then give up (2 seconds) */ 103*4882a593Smuzhiyun #define AARP_RETRANSMIT_LIMIT 10 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * Some value bigger than total retransmit time + a bit for last reply to 106*4882a593Smuzhiyun * appear and to stop continual requests 107*4882a593Smuzhiyun */ 108*4882a593Smuzhiyun #define AARP_RESOLVE_TIME (10 * HZ) 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun extern struct datalink_proto *ddp_dl, *aarp_dl; 111*4882a593Smuzhiyun extern int aarp_proto_init(void); 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* Inter module exports */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* Give a device find its atif control structure */ 116*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IRDA) || IS_ENABLED(CONFIG_ATALK) atalk_find_dev(struct net_device * dev)117*4882a593Smuzhiyunstatic inline struct atalk_iface *atalk_find_dev(struct net_device *dev) 118*4882a593Smuzhiyun { 119*4882a593Smuzhiyun return dev->atalk_ptr; 120*4882a593Smuzhiyun } 121*4882a593Smuzhiyun #endif 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun extern struct atalk_addr *atalk_find_dev_addr(struct net_device *dev); 124*4882a593Smuzhiyun extern struct net_device *atrtr_get_dev(struct atalk_addr *sa); 125*4882a593Smuzhiyun extern int aarp_send_ddp(struct net_device *dev, 126*4882a593Smuzhiyun struct sk_buff *skb, 127*4882a593Smuzhiyun struct atalk_addr *sa, void *hwaddr); 128*4882a593Smuzhiyun extern void aarp_device_down(struct net_device *dev); 129*4882a593Smuzhiyun extern void aarp_probe_network(struct atalk_iface *atif); 130*4882a593Smuzhiyun extern int aarp_proxy_probe_network(struct atalk_iface *atif, 131*4882a593Smuzhiyun struct atalk_addr *sa); 132*4882a593Smuzhiyun extern void aarp_proxy_remove(struct net_device *dev, 133*4882a593Smuzhiyun struct atalk_addr *sa); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun extern void aarp_cleanup_module(void); 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun extern struct hlist_head atalk_sockets; 138*4882a593Smuzhiyun extern rwlock_t atalk_sockets_lock; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun extern struct atalk_route *atalk_routes; 141*4882a593Smuzhiyun extern rwlock_t atalk_routes_lock; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun extern struct atalk_iface *atalk_interfaces; 144*4882a593Smuzhiyun extern rwlock_t atalk_interfaces_lock; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun extern struct atalk_route atrtr_default; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun struct aarp_iter_state { 149*4882a593Smuzhiyun int bucket; 150*4882a593Smuzhiyun struct aarp_entry **table; 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun extern const struct seq_operations aarp_seq_ops; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun extern int sysctl_aarp_expiry_time; 156*4882a593Smuzhiyun extern int sysctl_aarp_tick_time; 157*4882a593Smuzhiyun extern int sysctl_aarp_retransmit_limit; 158*4882a593Smuzhiyun extern int sysctl_aarp_resolve_time; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #ifdef CONFIG_SYSCTL 161*4882a593Smuzhiyun extern int atalk_register_sysctl(void); 162*4882a593Smuzhiyun extern void atalk_unregister_sysctl(void); 163*4882a593Smuzhiyun #else atalk_register_sysctl(void)164*4882a593Smuzhiyunstatic inline int atalk_register_sysctl(void) 165*4882a593Smuzhiyun { 166*4882a593Smuzhiyun return 0; 167*4882a593Smuzhiyun } atalk_unregister_sysctl(void)168*4882a593Smuzhiyunstatic inline void atalk_unregister_sysctl(void) 169*4882a593Smuzhiyun { 170*4882a593Smuzhiyun } 171*4882a593Smuzhiyun #endif 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS 174*4882a593Smuzhiyun extern int atalk_proc_init(void); 175*4882a593Smuzhiyun extern void atalk_proc_exit(void); 176*4882a593Smuzhiyun #else atalk_proc_init(void)177*4882a593Smuzhiyunstatic inline int atalk_proc_init(void) 178*4882a593Smuzhiyun { 179*4882a593Smuzhiyun return 0; 180*4882a593Smuzhiyun } atalk_proc_exit(void)181*4882a593Smuzhiyunstatic inline void atalk_proc_exit(void) 182*4882a593Smuzhiyun { 183*4882a593Smuzhiyun } 184*4882a593Smuzhiyun #endif /* CONFIG_PROC_FS */ 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #endif /* __LINUX_ATALK_H__ */ 187