-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAX25.H
304 lines (259 loc) · 10.2 KB
/
AX25.H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
97
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/* Mods by G1EMM */
#ifndef _AX25_H
#define _AX25_H
#ifndef _GLOBAL_H
#include "global.h"
#endif
#ifndef _IP_H
#include "ip.h"
#endif
#ifndef _MBUF_H
#include "mbuf.h"
#endif
#ifndef _IFACE_H
#include "iface.h"
#endif
#ifndef _SOCKADDR_H
#include "sockaddr.h"
#endif
/* AX.25 datagram (address) sub-layer definitions */
#define MAXDIGIS 7 /* Maximum number of digipeaters */
#define ALEN 6 /* Number of chars in callsign field */
#define AXALEN 7 /* Total AX.25 address length, including SSID */
#define AXBUF 10 /* Buffer size for maximum-length ascii call */
#ifndef _LAPB_H
#include "lapb.h"
#endif
/* Bits within SSID field of AX.25 address */
#define SSID 0x1e /* Sub station ID */
#define REPEATED 0x80 /* Has-been-repeated bit in repeater field */
#define E 0x01 /* Address extension bit */
#define C 0x80 /* Command/response designation */
/* Our AX.25 address */
extern char Mycall[AXALEN];
extern char Bbscall[AXALEN];
/* List of AX.25 multicast addresses, e.g., "QST -0" in shifted ASCII */
extern char Ax25multi[][AXALEN];
#define QSTCALL 0
#define NODESCALL 1
#define MAILCALL 2
#define IDCALL 3
/*currently not used in this code*/
#define OPENCALL 4
#define CQCALL 5
#define BEACONCALL 6
#define RMNCCALL 7
#define ALLCALL 8
extern int Digipeat;
extern int Ax25mbox;
/* Number of chars in interface field. The involved definition takes possible
* alignment requirements into account, since ax25_addr is of an odd size.
*/
#define ILEN (sizeof(struct sockaddr) - sizeof(short) - AXALEN)
/* Socket address, AX.25 style */
struct sockaddr_ax {
short sax_family; /* 2 bytes */
char ax25_addr[AXALEN];
char iface[ILEN]; /* Interface name */
};
/* Internal representation of an AX.25 header */
struct ax25 {
char dest[AXALEN]; /* Destination address */
char source[AXALEN]; /* Source address */
char digis[MAXDIGIS][AXALEN]; /* Digi string */
int ndigis; /* Number of digipeaters */
int nextdigi; /* Index to next digi in chain */
int cmdrsp; /* Command/response */
};
/* C-bit stuff */
#define LAPB_UNKNOWN 0
#define LAPB_COMMAND 1
#define LAPB_RESPONSE 2
/* AX.25 routing table entry */
struct ax_route {
struct ax_route *next; /* Linked list pointer */
char target[AXALEN];
struct iface *iface;
char digis[MAXDIGIS][AXALEN];
int ndigis;
char type;
#define AX_LOCAL 1 /* Set by local ax25 route command */
#define AX_AUTO 2 /* Set by incoming packet */
#define AX_PERM 3 /* Make this a permanent entry - K5JB */
char mode; /* Connection mode (G1EMM) */
#define AX_DEFMODE 0 /* Use default interface mode */
#define AX_VC_MODE 1 /* Try to use Virtual circuit */
#define AX_DATMODE 2 /* Try to use Datagrams only */
};
#define NULLAXR ((struct ax_route *)0)
extern struct ax_route *Ax_routes;
extern struct ax_route Ax_default;
/* AX.25 Level 3 Protocol IDs (PIDs) */
#define PID_X25 0x01 /* CCITT X.25 PLP */
#define PID_SEGMENT 0x08 /* Segmentation fragment */
#define PID_TEXNET 0xc3 /* TEXNET datagram protocol */
#define PID_LQ 0xc4 /* Link quality protocol */
#define PID_APPLETALK 0xca /* Appletalk */
#define PID_APPLEARP 0xcb /* Appletalk ARP */
#define PID_IP 0xcc /* ARPA Internet Protocol */
#define PID_ARP 0xcd /* ARPA Address Resolution Protocol */
#define PID_RARP 0xce /* ARPA Reverse Address Resolution Protocol */
#define PID_NETROM 0xcf /* NET/ROM */
#define PID_NO_L3 0xf0 /* No level 3 protocol */
#define SEG_FIRST 0x80 /* First segment of a sequence */
#define SEG_REM 0x7f /* Mask for # segments remaining */
#define AX_EOL "\r" /* AX.25 end-of-line convention */
/* Link quality report packet header, internal format */
struct lqhdr {
int16 version; /* Version number of protocol */
#define LINKVERS 1
int32 ip_addr; /* Sending station's IP address */
};
#define LQHDR 6
/* Link quality entry, internal format */
struct lqentry {
char addr[AXALEN]; /* Address of heard station */
int32 count; /* Count of packets heard from that station */
};
#define LQENTRY 11
/* Link quality database record format
* Currently used only by AX.25 interfaces
*/
struct lq {
struct lq *next;
char addr[AXALEN]; /* Hardware address of station heard */
struct iface *iface; /* Interface address was heard on */
int32 time; /* Time station was last heard */
int32 currxcnt; /* Current # of packets heard from this station */
#ifdef notdef /* Not yet implemented */
/* # of packets heard from this station as of his last update */
int32 lastrxcnt;
/* # packets reported as transmitted by station as of his last update */
int32 lasttxcnt;
int16 hisqual; /* Fraction (0-1000) of station's packets heard
* as of last update
*/
int16 myqual; /* Fraction (0-1000) of our packets heard by station
* as of last update
*/
#endif
};
#define NULLLQ (struct lq *)0
extern struct lq *Lq; /* Link quality record headers */
/* Structure used to keep track of monitored destination addresses */
struct ld {
struct ld *next; /* Linked list pointers */
char addr[AXALEN];/* Hardware address of destination overheard */
struct iface *iface; /* Interface address was heard on */
int32 time; /* Time station was last mentioned */
int32 currxcnt; /* Current # of packets destined to this station */
};
#define NULLLD (struct ld *)0
extern struct ld *Ld; /* Destination address record headers */
#ifdef __GNUC__
struct ax25_cb; /* forward declaration */
#endif
/* Linkage to network protocols atop ax25 */
struct axlink {
int pid;
void (*funct) __ARGS((struct iface *,struct ax25_cb *,char *, char *,
struct mbuf *,int));
};
extern struct axlink Axlink[];
/* Codes for the open_ax25 call */
#define AX_PASSIVE 0
#define AX_ACTIVE 1
#define AX_SERVER 2 /* Passive, clone on opening */
/* Max number of fake AX.25 interfaces for RFC-1226 encapsulation */
#ifndef NAX25
#define NAX25 16
#endif
#define AXHEARD_PASS 0 /* Log both src and dest callsigns */
#define AXHEARD_NOSRC 1 /* do not log source callsign */
#define AXHEARD_NODST 2 /* do not log destination callsign */
#define AXHEARD_NONE 3 /* do not log any callsign */
/* an call that should not be jump-started */
struct no_js {
struct no_js *next;
char call[AXALEN];
};
/* AX.25 protocol data kept per interface */
struct ifax25 {
int paclen;
int lapbtimertype;
long irtt;
int version;
long t2;
long t3;
long t4;
int n2;
int maxframe;
int pthresh;
int window;
long blimit;
long maxwait; /* maximum backoff time */
char *bctext;
char cdigi[AXALEN];
#ifdef MAILBOX
char bbscall[AXALEN];
#endif
};
/* In ax25.c: */
struct ax_route *ax_add __ARGS((char *,int,char digis[][AXALEN],int,struct iface *));
int ax_drop __ARGS((char *,struct iface *,int));
struct ax_route *ax_lookup __ARGS((char *,struct iface *));
void axip_input __ARGS((struct iface *iface,struct ip *ip,struct mbuf *bp,int rxbroadcast));
void ax_recv __ARGS((struct iface *,struct mbuf *));
int ax_send __ARGS((struct mbuf *bp,struct iface *iface,int32 gateway,int prec,
int del,int tput,int rel));
int ax_output __ARGS((struct iface *iface,char *dest,char *source,int16 pid,
struct mbuf *data));
int sendframe __ARGS((struct ax25_cb *axp,int cmdrsp,int ctl,struct mbuf *data));
void axnl3 __ARGS((struct iface *iface,struct ax25_cb *axp,char *src,
char *dest,struct mbuf *bp,int mcast));
void paxipdest __ARGS((struct iface *iface));
/* In ax25cmd.c: */
void st_ax25 __ARGS((struct ax25_cb *axp));
int axheard __ARGS((struct iface *ifp));
void init_ifax25 __ARGS((struct ifax25 *));
int connect_filt __ARGS((int argc,char *argv[],char target[],struct iface *ifp));
/* In axhdr.c: */
struct mbuf *htonax25 __ARGS((struct ax25 *hdr,struct mbuf *data));
int ntohax25 __ARGS((struct ax25 *hdr,struct mbuf **bpp));
/* In axlink.c: */
void getlqentry __ARGS((struct lqentry *ep,struct mbuf **bpp));
void getlqhdr __ARGS((struct lqhdr *hp,struct mbuf **bpp));
void logsrc __ARGS((struct iface *iface,char *addr));
void logdest __ARGS((struct iface *iface,char *addr));
char *putlqentry __ARGS((char *cp,char *addr,int32 count));
char *putlqhdr __ARGS((char *cp,int16 version,int32 ip_addr));
struct lq *al_lookup __ARGS((struct iface *ifp,char *addr,int sort));
/* In ax25user.c: */
int ax25val __ARGS((struct ax25_cb *axp));
int disc_ax25 __ARGS((struct ax25_cb *axp));
int kick_ax25 __ARGS((struct ax25_cb *axp));
struct ax25_cb *open_ax25 __ARGS((struct iface *,char *,char *,
int,int16,
void (*) __ARGS((struct ax25_cb *,int)),
void (*) __ARGS((struct ax25_cb *,int)),
void (*) __ARGS((struct ax25_cb *,int,int)),
int user));
struct mbuf *recv_ax25 __ARGS((struct ax25_cb *axp,int16 cnt));
int reset_ax25 __ARGS((struct ax25_cb *axp));
int send_ax25 __ARGS((struct ax25_cb *axp,struct mbuf *bp,int pid));
/* In ax25subr.c: */
int addreq __ARGS((char *a,char *b));
struct ax25_cb *cr_ax25 __ARGS((char *local,char *remote,struct iface *iface));
void del_ax25 __ARGS((struct ax25_cb *axp));
struct ax25_cb *find_ax25 __ARGS((char *local,char *remote,struct iface *iface));
char *pax25 __ARGS((char *e,char *addr));
int setcall __ARGS((char *out,char *call));
/* In axui.c: */
int doaxui __ARGS((int argc, char *argv[],void *p));
void axui_input __ARGS((struct iface *iface,struct ax25_cb *axp,char *src,char *dest,struct mbuf *bp,int mcast));
/* In socket.c: */
void beac_input __ARGS((struct iface *iface,char *src,struct mbuf *bp));
void s_arcall __ARGS((struct ax25_cb *axp,int cnt));
void s_ascall __ARGS((struct ax25_cb *axp,int old,int new));
void s_atcall __ARGS((struct ax25_cb *axp,int cnt));
#endif /* _AX25_H */