netrom.h 7.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/*
 *	Declarations of NET/ROM type objects.
 *
 *	Jonathan Naylor G4KLX	9/4/95
 */

#ifndef _NETROM_H
#define _NETROM_H 
9

L
Linus Torvalds 已提交
10 11
#include <linux/netrom.h>
#include <linux/list.h>
12
#include <linux/slab.h>
L
Linus Torvalds 已提交
13
#include <net/sock.h>
14
#include <linux/refcount.h>
L
Linus Torvalds 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27

#define	NR_NETWORK_LEN			15
#define	NR_TRANSPORT_LEN		5

#define	NR_PROTO_IP			0x0C

#define	NR_PROTOEXT			0x00
#define	NR_CONNREQ			0x01
#define	NR_CONNACK			0x02
#define	NR_DISCREQ			0x03
#define	NR_DISCACK			0x04
#define	NR_INFO				0x05
#define	NR_INFOACK			0x06
28
#define	NR_RESET			0x07
L
Linus Torvalds 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

#define	NR_CHOKE_FLAG			0x80
#define	NR_NAK_FLAG			0x40
#define	NR_MORE_FLAG			0x20

/* Define Link State constants. */
enum {
	NR_STATE_0,
	NR_STATE_1,
	NR_STATE_2,
	NR_STATE_3
};

#define	NR_COND_ACK_PENDING		0x01
#define	NR_COND_REJECT			0x02
#define	NR_COND_PEER_RX_BUSY		0x04
#define	NR_COND_OWN_RX_BUSY		0x08

47 48
#define NR_DEFAULT_T1			120000		/* Outstanding frames - 120 seconds */
#define NR_DEFAULT_T2			5000		/* Response delay     - 5 seconds */
L
Linus Torvalds 已提交
49
#define NR_DEFAULT_N2			3		/* Number of Retries - 3 */
50 51
#define	NR_DEFAULT_T4			180000		/* Busy Delay - 180 seconds */
#define	NR_DEFAULT_IDLE			0		/* No Activity Timeout - none */
L
Linus Torvalds 已提交
52 53 54 55 56 57
#define	NR_DEFAULT_WINDOW		4		/* Default Window Size - 4 */
#define	NR_DEFAULT_OBS			6		/* Default Obsolescence Count - 6 */
#define	NR_DEFAULT_QUAL			10		/* Default Neighbour Quality - 10 */
#define	NR_DEFAULT_TTL			16		/* Default Time To Live - 16 */
#define	NR_DEFAULT_ROUTING		1		/* Is routing enabled ? */
#define	NR_DEFAULT_FAILS		2		/* Link fails until route fails */
58
#define	NR_DEFAULT_RESET		0		/* Sent / accept reset cmds? */
L
Linus Torvalds 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

#define NR_MODULUS 			256
#define NR_MAX_WINDOW_SIZE		127			/* Maximum Window Allowable - 127 */
#define	NR_MAX_PACKET_SIZE		236			/* Maximum Packet Length - 236 */

struct nr_sock {
	struct sock		sock;
	ax25_address		user_addr, source_addr, dest_addr;
	struct net_device		*device;
	unsigned char		my_index,   my_id;
	unsigned char		your_index, your_id;
	unsigned char		state, condition, bpqext, window;
	unsigned short		vs, vr, va, vl;
	unsigned char		n2, n2count;
	unsigned long		t1, t2, t4, idle;
	unsigned short		fraglen;
	struct timer_list	t1timer;
	struct timer_list	t2timer;
	struct timer_list	t4timer;
	struct timer_list	idletimer;
	struct sk_buff_head	ack_queue;
	struct sk_buff_head	reseq_queue;
	struct sk_buff_head	frag_queue;
};

#define nr_sk(sk) ((struct nr_sock *)(sk))

struct nr_neigh {
	struct hlist_node	neigh_node;
	ax25_address		callsign;
	ax25_digi		*digipeat;
	ax25_cb			*ax25;
	struct net_device	*dev;
	unsigned char		quality;
	unsigned char		locked;
	unsigned short		count;
	unsigned int		number;
	unsigned char		failed;
97
	refcount_t		refcount;
L
Linus Torvalds 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
};

struct nr_route {
	unsigned char   quality;
	unsigned char   obs_count;
	struct nr_neigh *neighbour;
};

struct nr_node {
	struct hlist_node	node_node;
	ax25_address		callsign;
	char			mnemonic[7];
	unsigned char		which;
	unsigned char		count;
	struct nr_route		routes[3];
	atomic_t		refcount;
	spinlock_t		node_lock;
};

/*********************************************************************
 *	nr_node & nr_neigh lists, refcounting and locking
 *********************************************************************/

#define nr_node_hold(__nr_node) \
	atomic_inc(&((__nr_node)->refcount))

static __inline__ void nr_node_put(struct nr_node *nr_node)
{
	if (atomic_dec_and_test(&nr_node->refcount)) {
		kfree(nr_node);
	}
}

#define nr_neigh_hold(__nr_neigh) \
132
	refcount_inc(&((__nr_neigh)->refcount))
L
Linus Torvalds 已提交
133 134 135

static __inline__ void nr_neigh_put(struct nr_neigh *nr_neigh)
{
136
	if (refcount_dec_and_test(&nr_neigh->refcount)) {
137 138
		if (nr_neigh->ax25)
			ax25_cb_put(nr_neigh->ax25);
139
		kfree(nr_neigh->digipeat);
L
Linus Torvalds 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
		kfree(nr_neigh);
	}
}

/* nr_node_lock and nr_node_unlock also hold/put the node's refcounter.
 */
static __inline__ void nr_node_lock(struct nr_node *nr_node)
{
	nr_node_hold(nr_node);
	spin_lock_bh(&nr_node->node_lock);
}

static __inline__ void nr_node_unlock(struct nr_node *nr_node)
{
	spin_unlock_bh(&nr_node->node_lock);
	nr_node_put(nr_node);
}

158 159
#define nr_neigh_for_each(__nr_neigh, list) \
	hlist_for_each_entry(__nr_neigh, list, neigh_node)
L
Linus Torvalds 已提交
160

161 162
#define nr_neigh_for_each_safe(__nr_neigh, node2, list) \
	hlist_for_each_entry_safe(__nr_neigh, node2, list, neigh_node)
L
Linus Torvalds 已提交
163

164 165
#define nr_node_for_each(__nr_node, list) \
	hlist_for_each_entry(__nr_node, list, node_node)
L
Linus Torvalds 已提交
166

167 168
#define nr_node_for_each_safe(__nr_node, node2, list) \
	hlist_for_each_entry_safe(__nr_node, node2, list, node_node)
L
Linus Torvalds 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184


/*********************************************************************/

/* af_netrom.c */
extern int  sysctl_netrom_default_path_quality;
extern int  sysctl_netrom_obsolescence_count_initialiser;
extern int  sysctl_netrom_network_ttl_initialiser;
extern int  sysctl_netrom_transport_timeout;
extern int  sysctl_netrom_transport_maximum_tries;
extern int  sysctl_netrom_transport_acknowledge_delay;
extern int  sysctl_netrom_transport_busy_delay;
extern int  sysctl_netrom_transport_requested_window_size;
extern int  sysctl_netrom_transport_no_activity_timeout;
extern int  sysctl_netrom_routing_control;
extern int  sysctl_netrom_link_fails_count;
185 186
extern int  sysctl_netrom_reset_circuit;

187 188
int nr_rx_frame(struct sk_buff *, struct net_device *);
void nr_destroy_socket(struct sock *);
L
Linus Torvalds 已提交
189 190

/* nr_dev.c */
191 192
int nr_rx_ip(struct sk_buff *, struct net_device *);
void nr_setup(struct net_device *);
L
Linus Torvalds 已提交
193 194

/* nr_in.c */
195
int nr_process_rx_frame(struct sock *, struct sk_buff *);
L
Linus Torvalds 已提交
196 197

/* nr_loopback.c */
198 199 200
void nr_loopback_init(void);
void nr_loopback_clear(void);
int nr_loopback_queue(struct sk_buff *);
L
Linus Torvalds 已提交
201 202

/* nr_out.c */
203 204 205 206 207 208 209
void nr_output(struct sock *, struct sk_buff *);
void nr_send_nak_frame(struct sock *);
void nr_kick(struct sock *);
void nr_transmit_buffer(struct sock *, struct sk_buff *);
void nr_establish_data_link(struct sock *);
void nr_enquiry_response(struct sock *);
void nr_check_iframes_acked(struct sock *, unsigned short);
L
Linus Torvalds 已提交
210 211

/* nr_route.c */
212 213 214 215 216 217
void nr_rt_device_down(struct net_device *);
struct net_device *nr_dev_first(void);
struct net_device *nr_dev_get(ax25_address *);
int nr_rt_ioctl(unsigned int, void __user *);
void nr_link_failed(ax25_cb *, int);
int nr_route_frame(struct sk_buff *, ax25_cb *);
218 219
extern const struct file_operations nr_nodes_fops;
extern const struct file_operations nr_neigh_fops;
220
void nr_rt_free(void);
L
Linus Torvalds 已提交
221 222

/* nr_subr.c */
223 224 225 226 227 228
void nr_clear_queues(struct sock *);
void nr_frames_acked(struct sock *, unsigned short);
void nr_requeue_frames(struct sock *);
int nr_validate_nr(struct sock *, unsigned short);
int nr_in_rx_window(struct sock *, unsigned short);
void nr_write_internal(struct sock *, int);
229

230
void __nr_transmit_reply(struct sk_buff *skb, int mine, unsigned char cmdflags);
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

/*
 * This routine is called when a Connect Acknowledge with the Choke Flag
 * set is needed to refuse a connection.
 */
#define nr_transmit_refusal(skb, mine)					\
do {									\
	__nr_transmit_reply((skb), (mine), NR_CONNACK | NR_CHOKE_FLAG);	\
} while (0)

/*
 * This routine is called when we don't have a circuit matching an incoming
 * NET/ROM packet.  This is an G8PZT Xrouter extension.
 */
#define nr_transmit_reset(skb, mine)					\
do {									\
	__nr_transmit_reply((skb), (mine), NR_RESET);			\
} while (0)

250
void nr_disconnect(struct sock *, int);
L
Linus Torvalds 已提交
251 252

/* nr_timer.c */
253 254 255 256 257 258 259 260 261 262 263 264
void nr_init_timers(struct sock *sk);
void nr_start_heartbeat(struct sock *);
void nr_start_t1timer(struct sock *);
void nr_start_t2timer(struct sock *);
void nr_start_t4timer(struct sock *);
void nr_start_idletimer(struct sock *);
void nr_stop_heartbeat(struct sock *);
void nr_stop_t1timer(struct sock *);
void nr_stop_t2timer(struct sock *);
void nr_stop_t4timer(struct sock *);
void nr_stop_idletimer(struct sock *);
int nr_t1timer_running(struct sock *);
L
Linus Torvalds 已提交
265 266

/* sysctl_net_netrom.c */
267 268
void nr_register_sysctl(void);
void nr_unregister_sysctl(void);
L
Linus Torvalds 已提交
269 270

#endif