1 |
1275 |
phoenix |
/*
|
2 |
|
|
* Declarations of AX.25 type objects.
|
3 |
|
|
*
|
4 |
|
|
* Alan Cox (GW4PTS) 10/11/93
|
5 |
|
|
*/
|
6 |
|
|
|
7 |
|
|
#ifndef _AX25_H
|
8 |
|
|
#define _AX25_H
|
9 |
|
|
#include <linux/config.h>
|
10 |
|
|
#include <linux/ax25.h>
|
11 |
|
|
|
12 |
|
|
#define AX25_T1CLAMPLO 1
|
13 |
|
|
#define AX25_T1CLAMPHI (30 * HZ)
|
14 |
|
|
|
15 |
|
|
#define AX25_BPQ_HEADER_LEN 16
|
16 |
|
|
#define AX25_KISS_HEADER_LEN 1
|
17 |
|
|
|
18 |
|
|
#define AX25_HEADER_LEN 17
|
19 |
|
|
#define AX25_ADDR_LEN 7
|
20 |
|
|
#define AX25_DIGI_HEADER_LEN (AX25_MAX_DIGIS * AX25_ADDR_LEN)
|
21 |
|
|
#define AX25_MAX_HEADER_LEN (AX25_HEADER_LEN + AX25_DIGI_HEADER_LEN)
|
22 |
|
|
|
23 |
|
|
/* AX.25 Protocol IDs */
|
24 |
|
|
#define AX25_P_ROSE 0x01
|
25 |
|
|
#define AX25_P_IP 0xCC
|
26 |
|
|
#define AX25_P_ARP 0xCD
|
27 |
|
|
#define AX25_P_TEXT 0xF0
|
28 |
|
|
#define AX25_P_NETROM 0xCF
|
29 |
|
|
#define AX25_P_SEGMENT 0x08
|
30 |
|
|
|
31 |
|
|
/* AX.25 Segment control values */
|
32 |
|
|
#define AX25_SEG_REM 0x7F
|
33 |
|
|
#define AX25_SEG_FIRST 0x80
|
34 |
|
|
|
35 |
|
|
#define AX25_CBIT 0x80 /* Command/Response bit */
|
36 |
|
|
#define AX25_EBIT 0x01 /* HDLC Address Extension bit */
|
37 |
|
|
#define AX25_HBIT 0x80 /* Has been repeated bit */
|
38 |
|
|
|
39 |
|
|
#define AX25_SSSID_SPARE 0x60 /* Unused bits in SSID for standard AX.25 */
|
40 |
|
|
#define AX25_ESSID_SPARE 0x20 /* Unused bits in SSID for extended AX.25 */
|
41 |
|
|
#define AX25_DAMA_FLAG 0x20 /* Well, it is *NOT* unused! (dl1bke 951121 */
|
42 |
|
|
|
43 |
|
|
#define AX25_COND_ACK_PENDING 0x01
|
44 |
|
|
#define AX25_COND_REJECT 0x02
|
45 |
|
|
#define AX25_COND_PEER_RX_BUSY 0x04
|
46 |
|
|
#define AX25_COND_OWN_RX_BUSY 0x08
|
47 |
|
|
#define AX25_COND_DAMA_MODE 0x10
|
48 |
|
|
|
49 |
|
|
#ifndef _LINUX_NETDEVICE_H
|
50 |
|
|
#include <linux/netdevice.h>
|
51 |
|
|
#endif
|
52 |
|
|
|
53 |
|
|
/* Upper sub-layer (LAPB) definitions */
|
54 |
|
|
|
55 |
|
|
/* Control field templates */
|
56 |
|
|
#define AX25_I 0x00 /* Information frames */
|
57 |
|
|
#define AX25_S 0x01 /* Supervisory frames */
|
58 |
|
|
#define AX25_RR 0x01 /* Receiver ready */
|
59 |
|
|
#define AX25_RNR 0x05 /* Receiver not ready */
|
60 |
|
|
#define AX25_REJ 0x09 /* Reject */
|
61 |
|
|
#define AX25_U 0x03 /* Unnumbered frames */
|
62 |
|
|
#define AX25_SABM 0x2f /* Set Asynchronous Balanced Mode */
|
63 |
|
|
#define AX25_SABME 0x6f /* Set Asynchronous Balanced Mode Extended */
|
64 |
|
|
#define AX25_DISC 0x43 /* Disconnect */
|
65 |
|
|
#define AX25_DM 0x0f /* Disconnected mode */
|
66 |
|
|
#define AX25_UA 0x63 /* Unnumbered acknowledge */
|
67 |
|
|
#define AX25_FRMR 0x87 /* Frame reject */
|
68 |
|
|
#define AX25_UI 0x03 /* Unnumbered information */
|
69 |
|
|
|
70 |
|
|
#define AX25_PF 0x10 /* Poll/final bit for standard AX.25 */
|
71 |
|
|
#define AX25_EPF 0x01 /* Poll/final bit for extended AX.25 */
|
72 |
|
|
|
73 |
|
|
#define AX25_ILLEGAL 0x100 /* Impossible to be a real frame type */
|
74 |
|
|
|
75 |
|
|
#define AX25_POLLOFF 0
|
76 |
|
|
#define AX25_POLLON 1
|
77 |
|
|
|
78 |
|
|
/* AX25 L2 C-bit */
|
79 |
|
|
#define AX25_COMMAND 1
|
80 |
|
|
#define AX25_RESPONSE 2
|
81 |
|
|
|
82 |
|
|
/* Define Link State constants. */
|
83 |
|
|
|
84 |
|
|
enum {
|
85 |
|
|
AX25_STATE_0,
|
86 |
|
|
AX25_STATE_1,
|
87 |
|
|
AX25_STATE_2,
|
88 |
|
|
AX25_STATE_3,
|
89 |
|
|
AX25_STATE_4
|
90 |
|
|
};
|
91 |
|
|
|
92 |
|
|
#define AX25_MODULUS 8 /* Standard AX.25 modulus */
|
93 |
|
|
#define AX25_EMODULUS 128 /* Extended AX.25 modulus */
|
94 |
|
|
|
95 |
|
|
enum {
|
96 |
|
|
AX25_PROTO_STD_SIMPLEX,
|
97 |
|
|
AX25_PROTO_STD_DUPLEX,
|
98 |
|
|
AX25_PROTO_DAMA_SLAVE,
|
99 |
|
|
AX25_PROTO_DAMA_MASTER
|
100 |
|
|
};
|
101 |
|
|
|
102 |
|
|
enum {
|
103 |
|
|
AX25_VALUES_IPDEFMODE, /* 0=DG 1=VC */
|
104 |
|
|
AX25_VALUES_AXDEFMODE, /* 0=Normal 1=Extended Seq Nos */
|
105 |
|
|
AX25_VALUES_BACKOFF, /* 0=None 1=Linear 2=Exponential */
|
106 |
|
|
AX25_VALUES_CONMODE, /* Allow connected modes - 0=No 1=no "PID text" 2=all PIDs */
|
107 |
|
|
AX25_VALUES_WINDOW, /* Default window size for standard AX.25 */
|
108 |
|
|
AX25_VALUES_EWINDOW, /* Default window size for extended AX.25 */
|
109 |
|
|
AX25_VALUES_T1, /* Default T1 timeout value */
|
110 |
|
|
AX25_VALUES_T2, /* Default T2 timeout value */
|
111 |
|
|
AX25_VALUES_T3, /* Default T3 timeout value */
|
112 |
|
|
AX25_VALUES_IDLE, /* Connected mode idle timer */
|
113 |
|
|
AX25_VALUES_N2, /* Default N2 value */
|
114 |
|
|
AX25_VALUES_PACLEN, /* AX.25 MTU */
|
115 |
|
|
AX25_VALUES_PROTOCOL, /* Std AX.25, DAMA Slave, DAMA Master */
|
116 |
|
|
AX25_VALUES_DS_TIMEOUT, /* DAMA Slave timeout */
|
117 |
|
|
AX25_MAX_VALUES /* THIS MUST REMAIN THE LAST ENTRY OF THIS LIST */
|
118 |
|
|
};
|
119 |
|
|
|
120 |
|
|
#define AX25_DEF_IPDEFMODE 0 /* Datagram */
|
121 |
|
|
#define AX25_DEF_AXDEFMODE 0 /* Normal */
|
122 |
|
|
#define AX25_DEF_BACKOFF 1 /* Linear backoff */
|
123 |
|
|
#define AX25_DEF_CONMODE 2 /* Connected mode allowed */
|
124 |
|
|
#define AX25_DEF_WINDOW 2 /* Window=2 */
|
125 |
|
|
#define AX25_DEF_EWINDOW 32 /* Module-128 Window=32 */
|
126 |
|
|
#define AX25_DEF_T1 (10 * HZ) /* T1=10s */
|
127 |
|
|
#define AX25_DEF_T2 (3 * HZ) /* T2=3s */
|
128 |
|
|
#define AX25_DEF_T3 (300 * HZ) /* T3=300s */
|
129 |
|
|
#define AX25_DEF_N2 10 /* N2=10 */
|
130 |
|
|
#define AX25_DEF_IDLE (0 * 60 * HZ) /* Idle=None */
|
131 |
|
|
#define AX25_DEF_PACLEN 256 /* Paclen=256 */
|
132 |
|
|
#define AX25_DEF_PROTOCOL AX25_PROTO_STD_SIMPLEX /* Standard AX.25 */
|
133 |
|
|
#define AX25_DEF_DS_TIMEOUT (3 * 60 * HZ) /* DAMA timeout 3 minutes */
|
134 |
|
|
|
135 |
|
|
typedef struct ax25_uid_assoc {
|
136 |
|
|
struct ax25_uid_assoc *next;
|
137 |
|
|
uid_t uid;
|
138 |
|
|
ax25_address call;
|
139 |
|
|
} ax25_uid_assoc;
|
140 |
|
|
|
141 |
|
|
typedef struct {
|
142 |
|
|
ax25_address calls[AX25_MAX_DIGIS];
|
143 |
|
|
unsigned char repeated[AX25_MAX_DIGIS];
|
144 |
|
|
unsigned char ndigi;
|
145 |
|
|
char lastrepeat;
|
146 |
|
|
} ax25_digi;
|
147 |
|
|
|
148 |
|
|
typedef struct ax25_route {
|
149 |
|
|
struct ax25_route *next;
|
150 |
|
|
ax25_address callsign;
|
151 |
|
|
struct net_device *dev;
|
152 |
|
|
ax25_digi *digipeat;
|
153 |
|
|
char ip_mode;
|
154 |
|
|
} ax25_route;
|
155 |
|
|
|
156 |
|
|
typedef struct {
|
157 |
|
|
char slave; /* slave_mode? */
|
158 |
|
|
struct timer_list slave_timer; /* timeout timer */
|
159 |
|
|
unsigned short slave_timeout; /* when? */
|
160 |
|
|
} ax25_dama_info;
|
161 |
|
|
|
162 |
|
|
struct ctl_table;
|
163 |
|
|
|
164 |
|
|
typedef struct ax25_dev {
|
165 |
|
|
struct ax25_dev *next;
|
166 |
|
|
struct net_device *dev;
|
167 |
|
|
struct net_device *forward;
|
168 |
|
|
struct ctl_table *systable;
|
169 |
|
|
int values[AX25_MAX_VALUES];
|
170 |
|
|
#if defined(CONFIG_AX25_DAMA_SLAVE) || defined(CONFIG_AX25_DAMA_MASTER)
|
171 |
|
|
ax25_dama_info dama;
|
172 |
|
|
#endif
|
173 |
|
|
} ax25_dev;
|
174 |
|
|
|
175 |
|
|
typedef struct ax25_cb {
|
176 |
|
|
struct ax25_cb *next;
|
177 |
|
|
ax25_address source_addr, dest_addr;
|
178 |
|
|
ax25_digi *digipeat;
|
179 |
|
|
ax25_dev *ax25_dev;
|
180 |
|
|
unsigned char iamdigi;
|
181 |
|
|
unsigned char state, modulus, pidincl;
|
182 |
|
|
unsigned short vs, vr, va;
|
183 |
|
|
unsigned char condition, backoff;
|
184 |
|
|
unsigned char n2, n2count;
|
185 |
|
|
struct timer_list t1timer, t2timer, t3timer, idletimer;
|
186 |
|
|
unsigned long t1, t2, t3, idle, rtt;
|
187 |
|
|
unsigned short paclen, fragno, fraglen;
|
188 |
|
|
struct sk_buff_head write_queue;
|
189 |
|
|
struct sk_buff_head reseq_queue;
|
190 |
|
|
struct sk_buff_head ack_queue;
|
191 |
|
|
struct sk_buff_head frag_queue;
|
192 |
|
|
unsigned char window;
|
193 |
|
|
struct timer_list timer;
|
194 |
|
|
struct sock *sk; /* Backlink to socket */
|
195 |
|
|
} ax25_cb;
|
196 |
|
|
|
197 |
|
|
/* af_ax25.c */
|
198 |
|
|
extern ax25_cb *volatile ax25_list;
|
199 |
|
|
extern void ax25_free_cb(ax25_cb *);
|
200 |
|
|
extern void ax25_insert_socket(ax25_cb *);
|
201 |
|
|
struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
|
202 |
|
|
struct sock *ax25_find_socket(ax25_address *, ax25_address *, int);
|
203 |
|
|
extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
|
204 |
|
|
extern struct sock *ax25_addr_match(ax25_address *);
|
205 |
|
|
extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int);
|
206 |
|
|
extern void ax25_destroy_socket(ax25_cb *);
|
207 |
|
|
extern ax25_cb *ax25_create_cb(void);
|
208 |
|
|
extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);
|
209 |
|
|
extern int ax25_create(struct socket *, int);
|
210 |
|
|
extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
|
211 |
|
|
|
212 |
|
|
/* ax25_addr.c */
|
213 |
|
|
extern ax25_address null_ax25_address;
|
214 |
|
|
extern char *ax2asc(ax25_address *);
|
215 |
|
|
extern ax25_address *asc2ax(char *);
|
216 |
|
|
extern int ax25cmp(ax25_address *, ax25_address *);
|
217 |
|
|
extern int ax25digicmp(ax25_digi *, ax25_digi *);
|
218 |
|
|
extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *);
|
219 |
|
|
extern int ax25_addr_build(unsigned char *, ax25_address *, ax25_address *, ax25_digi *, int, int);
|
220 |
|
|
extern int ax25_addr_size(ax25_digi *);
|
221 |
|
|
extern void ax25_digi_invert(ax25_digi *, ax25_digi *);
|
222 |
|
|
|
223 |
|
|
/* ax25_dev.c */
|
224 |
|
|
extern ax25_dev *ax25_dev_list;
|
225 |
|
|
extern ax25_dev *ax25_dev_ax25dev(struct net_device *);
|
226 |
|
|
extern ax25_dev *ax25_addr_ax25dev(ax25_address *);
|
227 |
|
|
extern void ax25_dev_device_up(struct net_device *);
|
228 |
|
|
extern void ax25_dev_device_down(struct net_device *);
|
229 |
|
|
extern int ax25_fwd_ioctl(unsigned int, struct ax25_fwd_struct *);
|
230 |
|
|
extern struct net_device *ax25_fwd_dev(struct net_device *);
|
231 |
|
|
extern void ax25_dev_free(void);
|
232 |
|
|
|
233 |
|
|
/* ax25_ds_in.c */
|
234 |
|
|
extern int ax25_ds_frame_in(ax25_cb *, struct sk_buff *, int);
|
235 |
|
|
|
236 |
|
|
/* ax25_ds_subr.c */
|
237 |
|
|
extern void ax25_ds_nr_error_recovery(ax25_cb *);
|
238 |
|
|
extern void ax25_ds_enquiry_response(ax25_cb *);
|
239 |
|
|
extern void ax25_ds_establish_data_link(ax25_cb *);
|
240 |
|
|
extern void ax25_dev_dama_on(ax25_dev *);
|
241 |
|
|
extern void ax25_dev_dama_off(ax25_dev *);
|
242 |
|
|
extern void ax25_dama_on(ax25_cb *);
|
243 |
|
|
extern void ax25_dama_off(ax25_cb *);
|
244 |
|
|
|
245 |
|
|
/* ax25_ds_timer.c */
|
246 |
|
|
extern void ax25_ds_set_timer(ax25_dev *);
|
247 |
|
|
extern void ax25_ds_del_timer(ax25_dev *);
|
248 |
|
|
extern void ax25_ds_timer(ax25_cb *);
|
249 |
|
|
extern void ax25_ds_t1_timeout(ax25_cb *);
|
250 |
|
|
extern void ax25_ds_heartbeat_expiry(ax25_cb *);
|
251 |
|
|
extern void ax25_ds_t3timer_expiry(ax25_cb *);
|
252 |
|
|
extern void ax25_ds_idletimer_expiry(ax25_cb *);
|
253 |
|
|
|
254 |
|
|
/* ax25_iface.c */
|
255 |
|
|
extern int ax25_protocol_register(unsigned int, int (*)(struct sk_buff *, ax25_cb *));
|
256 |
|
|
extern void ax25_protocol_release(unsigned int);
|
257 |
|
|
extern int ax25_linkfail_register(void (*)(ax25_cb *, int));
|
258 |
|
|
extern void ax25_linkfail_release(void (*)(ax25_cb *, int));
|
259 |
|
|
extern int ax25_listen_register(ax25_address *, struct net_device *);
|
260 |
|
|
extern void ax25_listen_release(ax25_address *, struct net_device *);
|
261 |
|
|
extern int (*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *);
|
262 |
|
|
extern int ax25_listen_mine(ax25_address *, struct net_device *);
|
263 |
|
|
extern void ax25_link_failed(ax25_cb *, int);
|
264 |
|
|
extern int ax25_protocol_is_registered(unsigned int);
|
265 |
|
|
|
266 |
|
|
/* ax25_in.c */
|
267 |
|
|
extern int ax25_rx_iframe(ax25_cb *, struct sk_buff *);
|
268 |
|
|
extern int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *);
|
269 |
|
|
|
270 |
|
|
/* ax25_ip.c */
|
271 |
|
|
extern int ax25_encapsulate(struct sk_buff *, struct net_device *, unsigned short, void *, void *, unsigned int);
|
272 |
|
|
extern int ax25_rebuild_header(struct sk_buff *);
|
273 |
|
|
|
274 |
|
|
/* ax25_out.c */
|
275 |
|
|
extern ax25_cb *ax25_send_frame(struct sk_buff *, int, ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
|
276 |
|
|
extern void ax25_output(ax25_cb *, int, struct sk_buff *);
|
277 |
|
|
extern void ax25_kick(ax25_cb *);
|
278 |
|
|
extern void ax25_transmit_buffer(ax25_cb *, struct sk_buff *, int);
|
279 |
|
|
extern void ax25_queue_xmit(struct sk_buff *);
|
280 |
|
|
extern int ax25_check_iframes_acked(ax25_cb *, unsigned short);
|
281 |
|
|
|
282 |
|
|
/* ax25_route.c */
|
283 |
|
|
extern void ax25_rt_device_down(struct net_device *);
|
284 |
|
|
extern int ax25_rt_ioctl(unsigned int, void *);
|
285 |
|
|
extern int ax25_rt_get_info(char *, char **, off_t, int);
|
286 |
|
|
extern int ax25_rt_autobind(ax25_cb *, ax25_address *);
|
287 |
|
|
extern ax25_route *ax25_rt_find_route(ax25_address *, struct net_device *);
|
288 |
|
|
extern struct sk_buff *ax25_rt_build_path(struct sk_buff *, ax25_address *, ax25_address *, ax25_digi *);
|
289 |
|
|
extern void ax25_rt_free(void);
|
290 |
|
|
|
291 |
|
|
/* ax25_std_in.c */
|
292 |
|
|
extern int ax25_std_frame_in(ax25_cb *, struct sk_buff *, int);
|
293 |
|
|
|
294 |
|
|
/* ax25_std_subr.c */
|
295 |
|
|
extern void ax25_std_nr_error_recovery(ax25_cb *);
|
296 |
|
|
extern void ax25_std_establish_data_link(ax25_cb *);
|
297 |
|
|
extern void ax25_std_transmit_enquiry(ax25_cb *);
|
298 |
|
|
extern void ax25_std_enquiry_response(ax25_cb *);
|
299 |
|
|
extern void ax25_std_timeout_response(ax25_cb *);
|
300 |
|
|
|
301 |
|
|
/* ax25_std_timer.c */
|
302 |
|
|
extern void ax25_std_heartbeat_expiry(ax25_cb *);
|
303 |
|
|
extern void ax25_std_t1timer_expiry(ax25_cb *);
|
304 |
|
|
extern void ax25_std_t2timer_expiry(ax25_cb *);
|
305 |
|
|
extern void ax25_std_t3timer_expiry(ax25_cb *);
|
306 |
|
|
extern void ax25_std_idletimer_expiry(ax25_cb *);
|
307 |
|
|
|
308 |
|
|
/* ax25_subr.c */
|
309 |
|
|
extern void ax25_clear_queues(ax25_cb *);
|
310 |
|
|
extern void ax25_frames_acked(ax25_cb *, unsigned short);
|
311 |
|
|
extern void ax25_requeue_frames(ax25_cb *);
|
312 |
|
|
extern int ax25_validate_nr(ax25_cb *, unsigned short);
|
313 |
|
|
extern int ax25_decode(ax25_cb *, struct sk_buff *, int *, int *, int *);
|
314 |
|
|
extern void ax25_send_control(ax25_cb *, int, int, int);
|
315 |
|
|
extern void ax25_return_dm(struct net_device *, ax25_address *, ax25_address *, ax25_digi *);
|
316 |
|
|
extern void ax25_calculate_t1(ax25_cb *);
|
317 |
|
|
extern void ax25_calculate_rtt(ax25_cb *);
|
318 |
|
|
extern void ax25_disconnect(ax25_cb *, int);
|
319 |
|
|
|
320 |
|
|
/* ax25_timer.c */
|
321 |
|
|
extern void ax25_start_heartbeat(ax25_cb *);
|
322 |
|
|
extern void ax25_start_t1timer(ax25_cb *);
|
323 |
|
|
extern void ax25_start_t2timer(ax25_cb *);
|
324 |
|
|
extern void ax25_start_t3timer(ax25_cb *);
|
325 |
|
|
extern void ax25_start_idletimer(ax25_cb *);
|
326 |
|
|
extern void ax25_stop_heartbeat(ax25_cb *);
|
327 |
|
|
extern void ax25_stop_t1timer(ax25_cb *);
|
328 |
|
|
extern void ax25_stop_t2timer(ax25_cb *);
|
329 |
|
|
extern void ax25_stop_t3timer(ax25_cb *);
|
330 |
|
|
extern void ax25_stop_idletimer(ax25_cb *);
|
331 |
|
|
extern int ax25_t1timer_running(ax25_cb *);
|
332 |
|
|
extern unsigned long ax25_display_timer(struct timer_list *);
|
333 |
|
|
|
334 |
|
|
/* ax25_uid.c */
|
335 |
|
|
extern int ax25_uid_policy;
|
336 |
|
|
extern ax25_address *ax25_findbyuid(uid_t);
|
337 |
|
|
extern int ax25_uid_ioctl(int, struct sockaddr_ax25 *);
|
338 |
|
|
extern int ax25_uid_get_info(char *, char **, off_t, int);
|
339 |
|
|
extern void ax25_uid_free(void);
|
340 |
|
|
|
341 |
|
|
/* sysctl_net_ax25.c */
|
342 |
|
|
#ifdef CONFIG_SYSCTL
|
343 |
|
|
extern void ax25_register_sysctl(void);
|
344 |
|
|
extern void ax25_unregister_sysctl(void);
|
345 |
|
|
#else
|
346 |
|
|
extern inline void ax25_register_sysctl(void) {};
|
347 |
|
|
extern inline void ax25_unregister_sysctl(void) {};
|
348 |
|
|
#endif /* CONFIG_SYSCTL */
|
349 |
|
|
|
350 |
|
|
#endif
|