| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
|---|
| 2 | /* | 
|---|
| 3 | *	Declarations of NET/ROM type objects. | 
|---|
| 4 | * | 
|---|
| 5 | *	Jonathan Naylor G4KLX	9/4/95 | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef _NETROM_H | 
|---|
| 9 | #define _NETROM_H | 
|---|
| 10 |  | 
|---|
| 11 | #include <linux/netrom.h> | 
|---|
| 12 | #include <linux/list.h> | 
|---|
| 13 | #include <linux/slab.h> | 
|---|
| 14 | #include <net/sock.h> | 
|---|
| 15 | #include <linux/refcount.h> | 
|---|
| 16 | #include <linux/seq_file.h> | 
|---|
| 17 | #include <net/ax25.h> | 
|---|
| 18 |  | 
|---|
| 19 | #define	NR_NETWORK_LEN			15 | 
|---|
| 20 | #define	NR_TRANSPORT_LEN		5 | 
|---|
| 21 |  | 
|---|
| 22 | #define	NR_PROTO_IP			0x0C | 
|---|
| 23 |  | 
|---|
| 24 | #define	NR_PROTOEXT			0x00 | 
|---|
| 25 | #define	NR_CONNREQ			0x01 | 
|---|
| 26 | #define	NR_CONNACK			0x02 | 
|---|
| 27 | #define	NR_DISCREQ			0x03 | 
|---|
| 28 | #define	NR_DISCACK			0x04 | 
|---|
| 29 | #define	NR_INFO				0x05 | 
|---|
| 30 | #define	NR_INFOACK			0x06 | 
|---|
| 31 | #define	NR_RESET			0x07 | 
|---|
| 32 |  | 
|---|
| 33 | #define	NR_CHOKE_FLAG			0x80 | 
|---|
| 34 | #define	NR_NAK_FLAG			0x40 | 
|---|
| 35 | #define	NR_MORE_FLAG			0x20 | 
|---|
| 36 |  | 
|---|
| 37 | /* Define Link State constants. */ | 
|---|
| 38 | enum { | 
|---|
| 39 | NR_STATE_0, | 
|---|
| 40 | NR_STATE_1, | 
|---|
| 41 | NR_STATE_2, | 
|---|
| 42 | NR_STATE_3 | 
|---|
| 43 | }; | 
|---|
| 44 |  | 
|---|
| 45 | #define	NR_COND_ACK_PENDING		0x01 | 
|---|
| 46 | #define	NR_COND_REJECT			0x02 | 
|---|
| 47 | #define	NR_COND_PEER_RX_BUSY		0x04 | 
|---|
| 48 | #define	NR_COND_OWN_RX_BUSY		0x08 | 
|---|
| 49 |  | 
|---|
| 50 | #define NR_DEFAULT_T1			120000		/* Outstanding frames - 120 seconds */ | 
|---|
| 51 | #define NR_DEFAULT_T2			5000		/* Response delay     - 5 seconds */ | 
|---|
| 52 | #define NR_DEFAULT_N2			3		/* Number of Retries - 3 */ | 
|---|
| 53 | #define	NR_DEFAULT_T4			180000		/* Busy Delay - 180 seconds */ | 
|---|
| 54 | #define	NR_DEFAULT_IDLE			0		/* No Activity Timeout - none */ | 
|---|
| 55 | #define	NR_DEFAULT_WINDOW		4		/* Default Window Size - 4 */ | 
|---|
| 56 | #define	NR_DEFAULT_OBS			6		/* Default Obsolescence Count - 6 */ | 
|---|
| 57 | #define	NR_DEFAULT_QUAL			10		/* Default Neighbour Quality - 10 */ | 
|---|
| 58 | #define	NR_DEFAULT_TTL			16		/* Default Time To Live - 16 */ | 
|---|
| 59 | #define	NR_DEFAULT_ROUTING		1		/* Is routing enabled ? */ | 
|---|
| 60 | #define	NR_DEFAULT_FAILS		2		/* Link fails until route fails */ | 
|---|
| 61 | #define	NR_DEFAULT_RESET		0		/* Sent / accept reset cmds? */ | 
|---|
| 62 |  | 
|---|
| 63 | #define NR_MODULUS 			256 | 
|---|
| 64 | #define NR_MAX_WINDOW_SIZE		127			/* Maximum Window Allowable - 127 */ | 
|---|
| 65 | #define	NR_MAX_PACKET_SIZE		236			/* Maximum Packet Length - 236 */ | 
|---|
| 66 |  | 
|---|
| 67 | struct nr_sock { | 
|---|
| 68 | struct sock		sock; | 
|---|
| 69 | ax25_address		user_addr, source_addr, dest_addr; | 
|---|
| 70 | struct net_device		*device; | 
|---|
| 71 | unsigned char		my_index,   my_id; | 
|---|
| 72 | unsigned char		your_index, your_id; | 
|---|
| 73 | unsigned char		state, condition, bpqext, window; | 
|---|
| 74 | unsigned short		vs, vr, va, vl; | 
|---|
| 75 | unsigned char		n2, n2count; | 
|---|
| 76 | unsigned long		t1, t2, t4, idle; | 
|---|
| 77 | unsigned short		fraglen; | 
|---|
| 78 | struct timer_list	t1timer; | 
|---|
| 79 | struct timer_list	t2timer; | 
|---|
| 80 | struct timer_list	t4timer; | 
|---|
| 81 | struct timer_list	idletimer; | 
|---|
| 82 | struct sk_buff_head	ack_queue; | 
|---|
| 83 | struct sk_buff_head	reseq_queue; | 
|---|
| 84 | struct sk_buff_head	frag_queue; | 
|---|
| 85 | }; | 
|---|
| 86 |  | 
|---|
| 87 | #define nr_sk(sk) ((struct nr_sock *)(sk)) | 
|---|
| 88 |  | 
|---|
| 89 | struct nr_neigh { | 
|---|
| 90 | struct hlist_node	neigh_node; | 
|---|
| 91 | ax25_address		callsign; | 
|---|
| 92 | ax25_digi		*digipeat; | 
|---|
| 93 | ax25_cb			*ax25; | 
|---|
| 94 | struct net_device	*dev; | 
|---|
| 95 | unsigned char		quality; | 
|---|
| 96 | unsigned char		locked; | 
|---|
| 97 | unsigned short		count; | 
|---|
| 98 | unsigned int		number; | 
|---|
| 99 | unsigned char		failed; | 
|---|
| 100 | refcount_t		refcount; | 
|---|
| 101 | }; | 
|---|
| 102 |  | 
|---|
| 103 | struct nr_route { | 
|---|
| 104 | unsigned char   quality; | 
|---|
| 105 | unsigned char   obs_count; | 
|---|
| 106 | struct nr_neigh *neighbour; | 
|---|
| 107 | }; | 
|---|
| 108 |  | 
|---|
| 109 | struct nr_node { | 
|---|
| 110 | struct hlist_node	node_node; | 
|---|
| 111 | ax25_address		callsign; | 
|---|
| 112 | char			mnemonic[7]; | 
|---|
| 113 | unsigned char		which; | 
|---|
| 114 | unsigned char		count; | 
|---|
| 115 | struct nr_route		routes[3]; | 
|---|
| 116 | refcount_t		refcount; | 
|---|
| 117 | spinlock_t		node_lock; | 
|---|
| 118 | }; | 
|---|
| 119 |  | 
|---|
| 120 | /********************************************************************* | 
|---|
| 121 | *	nr_node & nr_neigh lists, refcounting and locking | 
|---|
| 122 | *********************************************************************/ | 
|---|
| 123 |  | 
|---|
| 124 | #define nr_node_hold(__nr_node) \ | 
|---|
| 125 | refcount_inc(&((__nr_node)->refcount)) | 
|---|
| 126 |  | 
|---|
| 127 | static __inline__ void nr_node_put(struct nr_node *nr_node) | 
|---|
| 128 | { | 
|---|
| 129 | if (refcount_dec_and_test(r: &nr_node->refcount)) { | 
|---|
| 130 | kfree(objp: nr_node); | 
|---|
| 131 | } | 
|---|
| 132 | } | 
|---|
| 133 |  | 
|---|
| 134 | #define nr_neigh_hold(__nr_neigh) \ | 
|---|
| 135 | refcount_inc(&((__nr_neigh)->refcount)) | 
|---|
| 136 |  | 
|---|
| 137 | static __inline__ void nr_neigh_put(struct nr_neigh *nr_neigh) | 
|---|
| 138 | { | 
|---|
| 139 | if (refcount_dec_and_test(r: &nr_neigh->refcount)) { | 
|---|
| 140 | if (nr_neigh->ax25) | 
|---|
| 141 | ax25_cb_put(ax25: nr_neigh->ax25); | 
|---|
| 142 | kfree(objp: nr_neigh->digipeat); | 
|---|
| 143 | kfree(objp: nr_neigh); | 
|---|
| 144 | } | 
|---|
| 145 | } | 
|---|
| 146 |  | 
|---|
| 147 | /* nr_node_lock and nr_node_unlock also hold/put the node's refcounter. | 
|---|
| 148 | */ | 
|---|
| 149 | static __inline__ void nr_node_lock(struct nr_node *nr_node) | 
|---|
| 150 | { | 
|---|
| 151 | nr_node_hold(nr_node); | 
|---|
| 152 | spin_lock_bh(lock: &nr_node->node_lock); | 
|---|
| 153 | } | 
|---|
| 154 |  | 
|---|
| 155 | static __inline__ void nr_node_unlock(struct nr_node *nr_node) | 
|---|
| 156 | { | 
|---|
| 157 | spin_unlock_bh(lock: &nr_node->node_lock); | 
|---|
| 158 | nr_node_put(nr_node); | 
|---|
| 159 | } | 
|---|
| 160 |  | 
|---|
| 161 | #define nr_neigh_for_each(__nr_neigh, list) \ | 
|---|
| 162 | hlist_for_each_entry(__nr_neigh, list, neigh_node) | 
|---|
| 163 |  | 
|---|
| 164 | #define nr_neigh_for_each_safe(__nr_neigh, node2, list) \ | 
|---|
| 165 | hlist_for_each_entry_safe(__nr_neigh, node2, list, neigh_node) | 
|---|
| 166 |  | 
|---|
| 167 | #define nr_node_for_each(__nr_node, list) \ | 
|---|
| 168 | hlist_for_each_entry(__nr_node, list, node_node) | 
|---|
| 169 |  | 
|---|
| 170 | #define nr_node_for_each_safe(__nr_node, node2, list) \ | 
|---|
| 171 | hlist_for_each_entry_safe(__nr_node, node2, list, node_node) | 
|---|
| 172 |  | 
|---|
| 173 |  | 
|---|
| 174 | /*********************************************************************/ | 
|---|
| 175 |  | 
|---|
| 176 | /* af_netrom.c */ | 
|---|
| 177 | extern int  sysctl_netrom_default_path_quality; | 
|---|
| 178 | extern int  sysctl_netrom_obsolescence_count_initialiser; | 
|---|
| 179 | extern int  sysctl_netrom_network_ttl_initialiser; | 
|---|
| 180 | extern int  sysctl_netrom_transport_timeout; | 
|---|
| 181 | extern int  sysctl_netrom_transport_maximum_tries; | 
|---|
| 182 | extern int  sysctl_netrom_transport_acknowledge_delay; | 
|---|
| 183 | extern int  sysctl_netrom_transport_busy_delay; | 
|---|
| 184 | extern int  sysctl_netrom_transport_requested_window_size; | 
|---|
| 185 | extern int  sysctl_netrom_transport_no_activity_timeout; | 
|---|
| 186 | extern int  sysctl_netrom_routing_control; | 
|---|
| 187 | extern int  sysctl_netrom_link_fails_count; | 
|---|
| 188 | extern int  sysctl_netrom_reset_circuit; | 
|---|
| 189 |  | 
|---|
| 190 | int nr_rx_frame(struct sk_buff *, struct net_device *); | 
|---|
| 191 | void nr_destroy_socket(struct sock *); | 
|---|
| 192 |  | 
|---|
| 193 | /* nr_dev.c */ | 
|---|
| 194 | int nr_rx_ip(struct sk_buff *, struct net_device *); | 
|---|
| 195 | void nr_setup(struct net_device *); | 
|---|
| 196 |  | 
|---|
| 197 | /* nr_in.c */ | 
|---|
| 198 | int nr_process_rx_frame(struct sock *, struct sk_buff *); | 
|---|
| 199 |  | 
|---|
| 200 | /* nr_loopback.c */ | 
|---|
| 201 | void nr_loopback_init(void); | 
|---|
| 202 | void nr_loopback_clear(void); | 
|---|
| 203 | int nr_loopback_queue(struct sk_buff *); | 
|---|
| 204 |  | 
|---|
| 205 | /* nr_out.c */ | 
|---|
| 206 | void nr_output(struct sock *, struct sk_buff *); | 
|---|
| 207 | void nr_send_nak_frame(struct sock *); | 
|---|
| 208 | void nr_kick(struct sock *); | 
|---|
| 209 | void nr_transmit_buffer(struct sock *, struct sk_buff *); | 
|---|
| 210 | void nr_establish_data_link(struct sock *); | 
|---|
| 211 | void nr_enquiry_response(struct sock *); | 
|---|
| 212 | void nr_check_iframes_acked(struct sock *, unsigned short); | 
|---|
| 213 |  | 
|---|
| 214 | /* nr_route.c */ | 
|---|
| 215 | void nr_rt_device_down(struct net_device *); | 
|---|
| 216 | struct net_device *nr_dev_first(void); | 
|---|
| 217 | struct net_device *nr_dev_get(ax25_address *); | 
|---|
| 218 | int nr_rt_ioctl(unsigned int, void __user *); | 
|---|
| 219 | void nr_link_failed(ax25_cb *, int); | 
|---|
| 220 | int nr_route_frame(struct sk_buff *, ax25_cb *); | 
|---|
| 221 | extern const struct seq_operations nr_node_seqops; | 
|---|
| 222 | extern const struct seq_operations nr_neigh_seqops; | 
|---|
| 223 | void nr_rt_free(void); | 
|---|
| 224 |  | 
|---|
| 225 | /* nr_subr.c */ | 
|---|
| 226 | void nr_clear_queues(struct sock *); | 
|---|
| 227 | void nr_frames_acked(struct sock *, unsigned short); | 
|---|
| 228 | void nr_requeue_frames(struct sock *); | 
|---|
| 229 | int nr_validate_nr(struct sock *, unsigned short); | 
|---|
| 230 | int nr_in_rx_window(struct sock *, unsigned short); | 
|---|
| 231 | void nr_write_internal(struct sock *, int); | 
|---|
| 232 |  | 
|---|
| 233 | void __nr_transmit_reply(struct sk_buff *skb, int mine, unsigned char cmdflags); | 
|---|
| 234 |  | 
|---|
| 235 | /* | 
|---|
| 236 | * This routine is called when a Connect Acknowledge with the Choke Flag | 
|---|
| 237 | * set is needed to refuse a connection. | 
|---|
| 238 | */ | 
|---|
| 239 | #define nr_transmit_refusal(skb, mine)					\ | 
|---|
| 240 | do {									\ | 
|---|
| 241 | __nr_transmit_reply((skb), (mine), NR_CONNACK | NR_CHOKE_FLAG);	\ | 
|---|
| 242 | } while (0) | 
|---|
| 243 |  | 
|---|
| 244 | /* | 
|---|
| 245 | * This routine is called when we don't have a circuit matching an incoming | 
|---|
| 246 | * NET/ROM packet.  This is an G8PZT Xrouter extension. | 
|---|
| 247 | */ | 
|---|
| 248 | #define nr_transmit_reset(skb, mine)					\ | 
|---|
| 249 | do {									\ | 
|---|
| 250 | __nr_transmit_reply((skb), (mine), NR_RESET);			\ | 
|---|
| 251 | } while (0) | 
|---|
| 252 |  | 
|---|
| 253 | void nr_disconnect(struct sock *, int); | 
|---|
| 254 |  | 
|---|
| 255 | /* nr_timer.c */ | 
|---|
| 256 | void nr_init_timers(struct sock *sk); | 
|---|
| 257 | void nr_start_heartbeat(struct sock *); | 
|---|
| 258 | void nr_start_t1timer(struct sock *); | 
|---|
| 259 | void nr_start_t2timer(struct sock *); | 
|---|
| 260 | void nr_start_t4timer(struct sock *); | 
|---|
| 261 | void nr_start_idletimer(struct sock *); | 
|---|
| 262 | void nr_stop_heartbeat(struct sock *); | 
|---|
| 263 | void nr_stop_t1timer(struct sock *); | 
|---|
| 264 | void nr_stop_t2timer(struct sock *); | 
|---|
| 265 | void nr_stop_t4timer(struct sock *); | 
|---|
| 266 | void nr_stop_idletimer(struct sock *); | 
|---|
| 267 | int nr_t1timer_running(struct sock *); | 
|---|
| 268 |  | 
|---|
| 269 | /* sysctl_net_netrom.c */ | 
|---|
| 270 | int nr_register_sysctl(void); | 
|---|
| 271 | void nr_unregister_sysctl(void); | 
|---|
| 272 |  | 
|---|
| 273 | #endif | 
|---|
| 274 |  | 
|---|