]> git.saurik.com Git - apple/xnu.git/blob - bsd/netccitt/llc_var.h
xnu-201.42.3.tar.gz
[apple/xnu.git] / bsd / netccitt / llc_var.h
1 /*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 /*
23 * Copyright (C) Dirk Husemann, Computer Science Department IV,
24 * University of Erlangen-Nuremberg, Germany, 1990, 1991, 1992
25 * Copyright (c) 1992, 1993
26 * The Regents of the University of California. All rights reserved.
27 *
28 * This code is derived from software contributed to Berkeley by
29 * Dirk Husemann and the Computer Science Department (IV) of
30 * the University of Erlangen-Nuremberg, Germany.
31 *
32 * Redistribution and use in source and binary forms, with or without
33 * modification, are permitted provided that the following conditions
34 * are met:
35 * 1. Redistributions of source code must retain the above copyright
36 * notice, this list of conditions and the following disclaimer.
37 * 2. Redistributions in binary form must reproduce the above copyright
38 * notice, this list of conditions and the following disclaimer in the
39 * documentation and/or other materials provided with the distribution.
40 * 3. All advertising materials mentioning features or use of this software
41 * must display the following acknowledgement:
42 * This product includes software developed by the University of
43 * California, Berkeley and its contributors.
44 * 4. Neither the name of the University nor the names of its contributors
45 * may be used to endorse or promote products derived from this software
46 * without specific prior written permission.
47 *
48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE.
59 *
60 * @(#)llc_var.h 8.1 (Berkeley) 6/10/93
61 */
62
63 #ifdef __STDC__
64 /*
65 * Forward structure declarations for function prototypes [sic].
66 */
67 struct llc;
68 #endif
69
70 #define NPAIDB_LINK 0
71
72 struct npaidbentry {
73 union {
74 /* MAC,DLSAP -> CONS */
75 struct {
76 struct llc_linkcb *NE_link;
77 struct rtentry *NE_rt;
78 } NE;
79 /* SAP info for unconfigured incoming calls */
80 struct {
81 u_short SI_class;
82 #define LLC_CLASS_I 0x1
83 #define LLC_CLASS_II 0x3
84 #define LLC_CLASS_III 0x4 /* Future */
85 #define LLC_CLASS_IV 0x7 /* Future */
86 u_short SI_window;
87 u_short SI_trace;
88 u_short SI_xchxid;
89 void (*SI_input)
90 __P((struct mbuf *));
91 caddr_t (*SI_ctlinput)
92 __P((int, struct sockaddr *, caddr_t));
93 } SI;
94 } NESIun;
95 };
96 #define np_link NESIun.NE.NE_link
97 #define np_rt NESIun.NE.NE_rt
98 #define si_class NESIun.SI.SI_class
99 #define si_window NESIun.SI.SI_window
100 #define si_trace NESIun.SI.SI_trace
101 #define si_xchxid NESIun.SI.SI_xchxid
102 #define si_input NESIun.SI.SI_input
103 #define si_ctlinput NESIun.SI.SI_ctlinput
104
105 #define NPDL_SAPNETMASK 0x7e
106
107 /*
108 * Definitions for accessing bitfields/bitslices inside
109 * LLC2 headers
110 */
111 struct bitslice {
112 unsigned int bs_mask;
113 unsigned int bs_shift;
114 };
115
116
117 #define i_z 0
118 #define i_ns 1
119 #define i_pf 0
120 #define i_nr 1
121 #define s_oz 2
122 #define s_selector 3
123 #define s_pf 0
124 #define s_nr 1
125 #define u_bb 2
126 #define u_select_other 3
127 #define u_pf 4
128 #define u_select 5
129 #define f_vs 1
130 #define f_cr 0
131 #define f_vr 1
132 #define f_wxyzv 6
133
134 #define LLCGBITS(Arg, Index) (((Arg) & llc_bitslice[(Index)].bs_mask) >> llc_bitslice[(Index)].bs_shift)
135 #define LLCSBITS(Arg, Index, Val) (Arg) |= (((Val) << llc_bitslice[(Index)].bs_shift) & llc_bitslice[(Index)].bs_mask)
136 #define LLCCSBITS(Arg, Index, Val) (Arg) = (((Val) << llc_bitslice[(Index)].bs_shift) & llc_bitslice[(Index)].bs_mask)
137
138 extern struct bitslice llc_bitslice[];
139
140 #define LLC_CMD 0
141 #define LLC_RSP 1
142 #define LLC_MAXCMDRSP 2
143
144 /*
145 * LLC events --- These events may either be frames received from the
146 * remote LLC DSAP, request from the network layer user,
147 * timer events from llc_timer(), or diagnostic events from
148 * llc_input().
149 */
150
151 /* LLC frame types */
152 #define LLCFT_INFO 0 * LLC_MAXCMDRSP
153 #define LLCFT_RR 1 * LLC_MAXCMDRSP
154 #define LLCFT_RNR 2 * LLC_MAXCMDRSP
155 #define LLCFT_REJ 3 * LLC_MAXCMDRSP
156 #define LLCFT_DM 4 * LLC_MAXCMDRSP
157 #define LLCFT_SABME 5 * LLC_MAXCMDRSP
158 #define LLCFT_DISC 6 * LLC_MAXCMDRSP
159 #define LLCFT_UA 7 * LLC_MAXCMDRSP
160 #define LLCFT_FRMR 8 * LLC_MAXCMDRSP
161 #define LLCFT_UI 9 * LLC_MAXCMDRSP
162 #define LLCFT_XID 10 * LLC_MAXCMDRSP
163 #define LLCFT_TEST 11 * LLC_MAXCMDRSP
164
165 /* LLC2 timer events */
166 #define LLC_ACK_TIMER_EXPIRED 12 * LLC_MAXCMDRSP
167 #define LLC_P_TIMER_EXPIRED 13 * LLC_MAXCMDRSP
168 #define LLC_REJ_TIMER_EXPIRED 14 * LLC_MAXCMDRSP
169 #define LLC_BUSY_TIMER_EXPIRED 15 * LLC_MAXCMDRSP
170
171 /* LLC2 diagnostic events */
172 #define LLC_INVALID_NR 16 * LLC_MAXCMDRSP
173 #define LLC_INVALID_NS 17 * LLC_MAXCMDRSP
174 #define LLC_BAD_PDU 18 * LLC_MAXCMDRSP
175 #define LLC_LOCAL_BUSY_DETECTED 19 * LLC_MAXCMDRSP
176 #define LLC_LOCAL_BUSY_CLEARED 20 * LLC_MAXCMDRSP
177
178 /* Network layer user requests */
179 /*
180 * NL_CONNECT_REQUEST --- The user has requested that a data link connection
181 * be established with a remote LLC DSAP.
182 */
183 #define NL_CONNECT_REQUEST 21 * LLC_MAXCMDRSP
184 /*
185 * NL_CONNECT_RESPONSE --- The user has accepted the data link connection.
186 */
187 #define NL_CONNECT_RESPONSE 22 * LLC_MAXCMDRSP
188 /*
189 * NL_RESET_REQUEST --- The user has requested that the data link with the
190 * remote LLC DSAP be reset.
191 */
192 #define NL_RESET_REQUEST 23 * LLC_MAXCMDRSP
193 /*
194 * NL_RESET_RESPONSE --- The user has accepted the reset of the data link
195 * connection.
196 */
197 #define NL_RESET_RESPONSE 24 * LLC_MAXCMDRSP
198 /*
199 * NL_DISCONNECT_REQUEST --- The user has requested that the data link
200 * connection with remote LLC DSAP be terminated.
201 */
202 #define NL_DISCONNECT_REQUEST 25 * LLC_MAXCMDRSP
203 /*
204 * NL_DATA_REQUEST --- The user has requested that a data unit be sent ot the
205 * remote LLC DSAP.
206 */
207 #define NL_DATA_REQUEST 26 * LLC_MAXCMDRSP
208 /*
209 * NL_INITIATE_PF_CYCLE --- The local LLC wants to initiate a P/F cycle.
210 */
211 #define NL_INITIATE_PF_CYCLE 27 * LLC_MAXCMDRSP
212 /*
213 * NL_LOCAL_BUSY_DETECTED --- The local entity has encountered a busy condition
214 */
215 #define NL_LOCAL_BUSY_DETECTED 28 * LLC_MAXCMDRSP
216
217 #define LLCFT_NONE 255
218
219 /* return message from state handlers */
220
221 /*
222 * LLC_CONNECT_INDICATION --- Inform the user that a connection has been
223 * requested by a remote LLC SSAP.
224 */
225 #define LLC_CONNECT_INDICATION 1
226 /*
227 * LLC_CONNECT_CONFIRM --- The connection service component indicates that the
228 * remote network entity has accepted the connection.
229 */
230 #define LLC_CONNECT_CONFIRM 2
231 /*
232 * LLC_DISCONNECT_INDICATION --- Inform the user that the remote network
233 * entity has intiated disconnection of the data
234 * link connection.
235 */
236 #define LLC_DISCONNECT_INDICATION 3
237 /*
238 * LLC_RESET_CONFIRM --- The connection service component indicates that the
239 * remote network entity has accepted the reset.
240 */
241 #define LLC_RESET_CONFIRM 4
242 /*
243 * LLC_RESET_INDICATION_REMOTE --- The remote network entity or remote peer
244 * has initiated a reset of the data link
245 * connection.
246 */
247 #define LLC_RESET_INDICATION_REMOTE 5
248 /*
249 * LLC_RESET_INDICATION_LOCAL --- The local LLC has determined that the data
250 * link connection is in need of
251 * reinitialization.
252 */
253 #define LLC_RESET_INDICATION_LOCAL 6
254 /*
255 * LLC_FRMR_RECEIVED --- The local connection service component has received a
256 * FRMR response PDU.
257 */
258 #define LLC_FRMR_RECEIVED 7
259 /*
260 * LLC_FRMR_SENT --- The local connection component has received an ivalid
261 * PDU, and has sent a FRMR response PDU.
262 */
263 #define LLC_FRMR_SENT 8
264 /*
265 * LLC_DATA_INDICATION --- The connection service component passes the data
266 * unit from the received I PDU to the user.
267 */
268 #define LLC_DATA_INDICATION 9
269 /*
270 * LLC_REMOTE_NOT_BUSY --- The remote LLC DSAP is no longer busy. The local
271 * connection service component will now accept a
272 * DATA_REQUEST.
273 */
274 #define LLC_REMOTE_NOT_BUSY 10
275 /*
276 * LLC_REMOTE_BUSY --- The remote LLC DSAP is busy. The local connection
277 * service component will not accept a DATA_REQUEST.
278 */
279 #define LLC_REMOTE_BUSY 11
280
281 /* Internal return code */
282 #define LLC_PASSITON 255
283
284 #define INFORMATION_CONTROL 0x00
285 #define SUPERVISORY_CONTROL 0x02
286 #define UNUMBERED_CONTROL 0x03
287
288 /*
289 * Other necessary definitions
290 */
291
292 #define LLC_MAX_SEQUENCE 128
293 #define LLC_MAX_WINDOW 127
294 #define LLC_WINDOW_SIZE 7
295
296 /*
297 * Don't we love this one? CCITT likes its bits 8=)
298 */
299 #define NLHDRSIZEGUESS 3
300
301 /*
302 * LLC control block
303 */
304
305 struct llc_linkcb {
306 struct llccb_q {
307 struct llccb_q *q_forw; /* admin chain */
308 struct llccb_q *q_backw;
309 } llcl_q;
310 struct npaidbentry *llcl_sapinfo; /* SAP information */
311 struct sockaddr_dl llcl_addr; /* link snpa address */
312 struct rtentry *llcl_nlrt; /* layer 3 -> LLC */
313 struct rtentry *llcl_llrt; /* LLC -> layer 3 */
314 struct ifnet *llcl_if; /* our interface */
315 caddr_t llcl_nlnext; /* cb for network layer */
316 struct mbuf *llcl_writeqh; /* Write queue head */
317 struct mbuf *llcl_writeqt; /* Write queue tail */
318 struct mbuf **llcl_output_buffers;
319 short llcl_timers[6]; /* timer array */
320 long llcl_timerflags; /* flags signalling running timers */
321 int (*llcl_statehandler)
322 __P((struct llc_linkcb *, struct llc *, int, int, int));
323 int llcl_P_flag;
324 int llcl_F_flag;
325 int llcl_S_flag;
326 int llcl_DATA_flag;
327 int llcl_REMOTE_BUSY_flag;
328 int llcl_DACTION_flag; /* delayed action */
329 int llcl_retry;
330 /*
331 * The following components deal --- in one way or the other ---
332 * with the LLC2 window. Indicated by either [L] or [W] is the
333 * domain of the specific component:
334 *
335 * [L] The domain is 0--LLC_MAX_WINDOW
336 * [W] The domain is 0--llcl_window
337 */
338 short llcl_vr; /* next to receive [L] */
339 short llcl_vs; /* next to send [L] */
340 short llcl_nr_received; /* next frame to b ack'd [L] */
341 short llcl_freeslot; /* next free slot [W] */
342 short llcl_projvs; /* V(S) associated with freeslot */
343 short llcl_slotsfree; /* free slots [W] */
344 short llcl_window; /* window size */
345 /*
346 * In llcl_frmrinfo we jot down the last frmr info field, which we
347 * need to do as we need to be able to resend it in the ERROR state.
348 */
349 struct frmrinfo llcl_frmrinfo; /* last FRMR info field */
350 };
351 #define llcl_frmr_pdu0 llcl_frmrinfo.rej_pdu_0
352 #define llcl_frmr_pdu1 llcl_frmrinfo.rej_pdu_1
353 #define llcl_frmr_control llcl_frmrinfo.frmr_control
354 #define llcl_frmr_control_ext llcl_frmrinfo.frmr_control_ext
355 #define llcl_frmr_cause llcl_frmrinfo.frmr_cause
356
357 #define LQNEXT(l) (struct llc_linkcb *)((l)->llcl_q.q_forw)
358 #define LQEMPTY (llccb_q.q_forw == &llccb_q)
359 #define LQFIRST (struct llc_linkcb *)(llccb_q.q_forw)
360 #define LQVALID(l) (!((struct llccb_q *)(l) == &llccb_q))
361
362 #define LLC_ENQUEUE(l, m) if ((l)->llcl_writeqh == NULL) { \
363 (l)->llcl_writeqh = (m); \
364 (l)->llcl_writeqt = (m); \
365 } else { \
366 (l)->llcl_writeqt->m_nextpkt = (m); \
367 (l)->llcl_writeqt = (m); \
368 }
369
370 #define LLC_DEQUEUE(l, m) if ((l)->llcl_writeqh == NULL) \
371 (m) = NULL; \
372 else { \
373 (m) = (l)->llcl_writeqh; \
374 (l)->llcl_writeqh = (l)->llcl_writeqh->m_nextpkt; \
375 }
376
377 #define LLC_SETFRAME(l, m) { \
378 if ((l)->llcl_slotsfree > 0) { \
379 (l)->llcl_slotsfree--; \
380 (l)->llcl_output_buffers[(l)->llcl_freeslot] = (m); \
381 (l)->llcl_freeslot = ((l)->llcl_freeslot+1) % (l)->llcl_window; \
382 LLC_INC((l)->llcl_projvs); \
383 } \
384 }
385
386 /*
387 * handling of sockaddr_dl's
388 */
389
390 #define LLADDRLEN(s) ((s)->sdl_alen + (s)->sdl_nlen)
391 #define LLSAPADDR(s) ((s)->sdl_data[LLADDRLEN(s)-1] & 0xff)
392 #define LLSAPLOC(s, if) ((s)->sdl_nlen + (if)->if_addrlen)
393
394 struct sdl_hdr {
395 struct sockaddr_dl sdlhdr_dst;
396 struct sockaddr_dl sdlhdr_src;
397 long sdlhdr_len;
398 };
399
400 #define LLC_GETHDR(f,m) { \
401 struct mbuf *_m = (struct mbuf *) (m); \
402 if (_m) { \
403 M_PREPEND(_m, LLC_ISFRAMELEN, M_DONTWAIT); \
404 bzero(mtod(_m, caddr_t), LLC_ISFRAMELEN); \
405 } else { \
406 MGETHDR (_m, M_DONTWAIT, MT_HEADER); \
407 if (_m != NULL) { \
408 _m->m_pkthdr.len = _m->m_len = LLC_UFRAMELEN; \
409 _m->m_next = _m->m_act = NULL; \
410 bzero(mtod(_m, caddr_t), LLC_UFRAMELEN); \
411 } else return; \
412 } \
413 (m) = _m; \
414 (f) = mtod(m, struct llc *); \
415 }
416
417 #define LLC_NEWSTATE(l, LLCstate) (l)->llcl_statehandler = llc_state_##LLCstate
418 #define LLC_STATEEQ(l, LLCstate) ((l)->llcl_statehandler == llc_state_##LLCstate ? 1 : 0)
419
420 #define LLC_ACK_SHIFT 0
421 #define LLC_P_SHIFT 1
422 #define LLC_BUSY_SHIFT 2
423 #define LLC_REJ_SHIFT 3
424 #define LLC_AGE_SHIFT 4
425 #define LLC_DACTION_SHIFT 5
426
427 #define LLC_TIMER_NOTRUNNING 0
428 #define LLC_TIMER_RUNNING 1
429 #define LLC_TIMER_EXPIRED 2
430
431 #define LLC_STARTTIMER(l, LLCtimer) { \
432 (l)->llcl_timers[LLC_##LLCtimer##_SHIFT] = llc_##LLCtimer##_timer; \
433 (l)->llcl_timerflags |= (1<<LLC_##LLCtimer##_SHIFT); \
434 }
435 #define LLC_STOPTIMER(l, LLCtimer) { \
436 (l)->llcl_timers[LLC_##LLCtimer##_SHIFT] = 0; \
437 (l)->llcl_timerflags &= ~(1<<LLC_##LLCtimer##_SHIFT); \
438 }
439 #define LLC_AGETIMER(l, LLCtimer) if ((l)->llcl_timers[LLC_##LLCtimer##_SHIFT] > 0) \
440 (l)->llcl_timers[LLC_##LLCtimer##_SHIFT]--;
441
442 #define LLC_TIMERXPIRED(l, LLCtimer) \
443 (((l)->llcl_timerflags & (1<<LLC_##LLCtimer##_SHIFT)) ? \
444 (((l)->llcl_timers[LLC_##LLCtimer##_SHIFT] == 0 ) ? \
445 LLC_TIMER_EXPIRED : LLC_TIMER_RUNNING) : LLC_TIMER_NOTRUNNING)
446
447 #define FOR_ALL_LLC_TIMERS(t) for ((t) = LLC_ACK_SHIFT; (t) < LLC_AGE_SHIFT; (t)++)
448
449 #define LLC_SETFLAG(l, LLCflag, v) (l)->llcl_##LLCflag##_flag = (v)
450 #define LLC_GETFLAG(l, LLCflag) (l)->llcl_##LLCflag##_flag
451
452 #define LLC_RESETCOUNTER(l) { \
453 (l)->llcl_vs = (l)->llcl_vr = (l)->llcl_retry = 0; \
454 llc_resetwindow((l)); \
455 }
456
457 /*
458 * LLC2 macro definitions
459 */
460
461
462 #define LLC_START_ACK_TIMER(l) LLC_STARTTIMER((l), ACK)
463 #define LLC_STOP_ACK_TIMER(l) LLC_STOPTIMER((l), ACK)
464 #define LLC_START_REJ_TIMER(l) LLC_STARTTIMER((l), REJ)
465 #define LLC_STOP_REJ_TIMER(l) LLC_STOPTIMER((l), REJ)
466 #define LLC_START_P_TIMER(l) { \
467 LLC_STARTTIMER((l), P); \
468 if (LLC_GETFLAG((l), P) == 0) \
469 (l)->llcl_retry = 0; \
470 LLC_SETFLAG((l), P, 1); \
471 }
472 #define LLC_STOP_P_TIMER(l) { \
473 LLC_STOPTIMER((l), P); \
474 LLC_SETFLAG((l), P, 0); \
475 }
476 #define LLC_STOP_ALL_TIMERS(l) { \
477 LLC_STOPTIMER((l), ACK); \
478 LLC_STOPTIMER((l), REJ); \
479 LLC_STOPTIMER((l), BUSY); \
480 LLC_STOPTIMER((l), P); \
481 }
482
483
484 #define LLC_INC(i) (i) = ((i)+1) % LLC_MAX_SEQUENCE
485
486 #define LLC_NR_VALID(l, nr) ((l)->llcl_vs < (l)->llcl_nr_received ? \
487 (((nr) >= (l)->llcl_nr_received) || \
488 ((nr) <= (l)->llcl_vs) ? 1 : 0) : \
489 (((nr) <= (l)->llcl_vs) && \
490 ((nr) >= (l)->llcl_nr_received) ? 1 : 0))
491
492 #define LLC_UPDATE_P_FLAG(l, cr, pf) { \
493 if ((cr) == LLC_RSP && (pf) == 1) { \
494 LLC_SETFLAG((l), P, 0); \
495 LLC_STOPTIMER((l), P); \
496 } \
497 }
498
499 #define LLC_UPDATE_NR_RECEIVED(l, nr) { \
500 while ((l)->llcl_nr_received != (nr)) { \
501 struct mbuf *_m; \
502 register short seq; \
503 if ((_m = (l)->llcl_output_buffers[seq = llc_seq2slot((l), (l)->llcl_nr_received)])) \
504 m_freem(_m); \
505 (l)->llcl_output_buffers[seq] = NULL; \
506 LLC_INC((l)->llcl_nr_received); \
507 (l)->llcl_slotsfree++; \
508 } \
509 (l)->llcl_retry = 0; \
510 if ((l)->llcl_slotsfree < (l)->llcl_window) { \
511 LLC_START_ACK_TIMER(l); \
512 } else LLC_STOP_ACK_TIMER(l); \
513 LLC_STARTTIMER((l), DACTION); \
514 }
515
516 #define LLC_SET_REMOTE_BUSY(l,a) { \
517 if (LLC_GETFLAG((l), REMOTE_BUSY) == 0) { \
518 LLC_SETFLAG((l), REMOTE_BUSY, 1); \
519 LLC_STARTTIMER((l), BUSY); \
520 (a) = LLC_REMOTE_BUSY; \
521 } else { \
522 (a) = 0; \
523 } \
524 }
525 #define LLC_CLEAR_REMOTE_BUSY(l,a) { \
526 if (LLC_GETFLAG((l), REMOTE_BUSY) == 1) { \
527 LLC_SETFLAG((l), REMOTE_BUSY, 1); \
528 LLC_STOPTIMER((l), BUSY); \
529 if (LLC_STATEEQ((l), NORMAL) || \
530 LLC_STATEEQ((l), REJECT) || \
531 LLC_STATEEQ((l), BUSY)) \
532 llc_resend((l), LLC_CMD, 0); \
533 (a) = LLC_REMOTE_NOT_BUSY; \
534 } else { \
535 (a) = 0; \
536 } \
537 }
538
539 #define LLC_DACKCMD 0x1
540 #define LLC_DACKCMDPOLL 0x2
541 #define LLC_DACKRSP 0x3
542 #define LLC_DACKRSPFINAL 0x4
543
544 #define LLC_SENDACKNOWLEDGE(l, cmd, pf) { \
545 if ((cmd) == LLC_CMD) { \
546 LLC_SETFLAG((l), DACTION, ((pf) == 0 ? LLC_DACKCMD : LLC_DACKCMDPOLL)); \
547 } else { \
548 LLC_SETFLAG((l), DACTION, ((pf) == 0 ? LLC_DACKRSP : LLC_DACKRSPFINAL)); \
549 } \
550 }
551
552 #define LLC_FRMR_W (1<<0)
553 #define LLC_FRMR_X (1<<1)
554 #define LLC_FRMR_Y (1<<2)
555 #define LLC_FRMR_Z (1<<3)
556 #define LLC_FRMR_V (1<<4)
557
558 #define LLC_SETFRMR(l, f, cr, c) { \
559 if ((f)->llc_control & 0x3) { \
560 (l)->llcl_frmr_pdu0 = (f)->llc_control; \
561 (l)->llcl_frmr_pdu1 = 0; \
562 } else { \
563 (l)->llcl_frmr_pdu0 = (f)->llc_control; \
564 (l)->llcl_frmr_pdu1 = (f)->llc_control_ext; \
565 } \
566 LLCCSBITS((l)->llcl_frmr_control, f_vs, (l)->llcl_vs); \
567 LLCCSBITS((l)->llcl_frmr_control_ext, f_cr, (cr)); \
568 LLCSBITS((l)->llcl_frmr_control_ext, f_vr, (l)->llcl_vr); \
569 LLCCSBITS((l)->llcl_frmr_cause, f_wxyzv, (c)); \
570 }
571
572 /*
573 * LLC tracing levels:
574 * LLCTR_INTERESTING interesting event, we might care to know about
575 * it, but then again, we might not ...
576 * LLCTR_SHOULDKNOW we probably should know about this event
577 * LLCTR_URGENT something has gone utterly wrong ...
578 */
579 #define LLCTR_INTERESTING 1
580 #define LLCTR_SHOULDKNOW 2
581 #define LLCTR_URGENT 3
582
583 #ifdef LLCDEBUG
584 #define LLC_TRACE(lp, l, msg) llc_trace((lp), (l), (msg))
585 #else /* LLCDEBUG */
586 #define LLC_TRACE(lp, l, msg) /* NOOP */
587 #endif /* LLCDEBUG */
588
589 #define LLC_N2_VALUE 15 /* up to 15 retries */
590 #define LLC_ACK_TIMER 10 /* 5 secs */
591 #define LLC_P_TIMER 4 /* 2 secs */
592 #define LLC_BUSY_TIMER 12 /* 6 secs */
593 #define LLC_REJ_TIMER 12 /* 6 secs */
594 #define LLC_AGE_TIMER 40 /* 20 secs */
595 #define LLC_DACTION_TIMER 2 /* 1 secs */
596
597 #if defined (KERNEL) && defined(LLC)
598 extern int llc_n2;
599 extern int llc_ACK_timer;
600 extern int llc_P_timer;
601 extern int llc_REJ_timer;
602 extern int llc_BUSY_timer;
603 extern int llc_AGE_timer;
604 extern int llc_DACTION_timer;
605
606 extern int af_link_rts_init_done;
607
608 #define USES_AF_LINK_RTS { \
609 if (!af_link_rts_init_done) { \
610 rn_inithead((void **)&rt_tables[AF_LINK], 32); \
611 af_link_rts_init_done++; \
612 } \
613 }
614
615 struct ifqueue llcintrq;
616
617 extern struct llccb_q llccb_q;
618 extern char *frame_names[];
619
620 /*
621 * Function prototypes
622 */
623 int sdl_cmp __P((struct sockaddr_dl *, struct sockaddr_dl *));
624 int sdl_copy __P((struct sockaddr_dl *, struct sockaddr_dl *));
625 int sdl_swapaddr __P((struct sockaddr_dl *, struct sockaddr_dl *));
626 int sdl_checkaddrif __P((struct ifnet *, struct sockaddr_dl *));
627 int sdl_setaddrif __P((struct ifnet *, u_char *, u_char, u_char,
628 struct sockaddr_dl *));
629 int sdl_sethdrif __P((struct ifnet *, u_char *, u_char, u_char *, u_char, u_char,
630 struct sdl_hdr *));
631 struct npaidbentry *llc_setsapinfo __P((struct ifnet *, u_char, u_char,
632 struct dllconfig *));
633 struct npaidbentry *llc_getsapinfo __P((u_char, struct ifnet *));
634 struct rtentry *npaidb_enrich __P((short, caddr_t, struct sockaddr_dl *));
635 int npaidb_destroy __P((struct rtentry *));
636 short llc_seq2slot __P((struct llc_linkcb *, short));
637 int llc_state_ADM __P((struct llc_linkcb *, struct llc *, int, int, int));
638 int llc_state_CONN __P((struct llc_linkcb *, struct llc *, int, int, int));
639 int llc_state_RESET_WAIT __P((struct llc_linkcb *, struct llc *,
640 int, int, int));
641 int llc_state_RESET_CHECK __P((struct llc_linkcb *, struct llc *,
642 int, int, int));
643 int llc_state_SETUP __P((struct llc_linkcb *, struct llc *, int, int, int));
644 int llc_state_RESET __P((struct llc_linkcb *, struct llc *, int, int, int));
645 int llc_state_D_CONN __P((struct llc_linkcb *, struct llc *, int, int, int));
646 int llc_state_ERROR __P((struct llc_linkcb *, struct llc *, int, int, int));
647 int llc_state_NBRAcore __P((struct llc_linkcb *, struct llc *, int, int, int));
648 int llc_state_NORMAL __P((struct llc_linkcb *, struct llc *, int, int, int));
649 int llc_state_BUSY __P((struct llc_linkcb *, struct llc *, int, int, int));
650 int llc_state_REJECT __P((struct llc_linkcb *, struct llc *, int, int, int));
651 int llc_state_AWAIT __P((struct llc_linkcb *, struct llc *, int, int, int));
652 int llc_state_AWAIT_BUSY __P((struct llc_linkcb *, struct llc *, int, int, int));
653 int llc_state_AWAIT_REJECT __P((struct llc_linkcb *, struct llc *, int, int, int));
654 int llc_statehandler __P((struct llc_linkcb *, struct llc *, int, int, int));
655 int llc_init __P((void));
656 struct llc_linkcb *llc_newlink __P((struct sockaddr_dl *, struct ifnet *,
657 struct rtentry *, caddr_t, struct rtentry *));
658 int llc_dellink __P((struct llc_linkcb *));
659 int llc_anytimersup __P((struct llc_linkcb *));
660 char * llc_getstatename __P((struct llc_linkcb *));
661 void llc_link_dump __P((struct llc_linkcb *, const char *));
662 void llc_trace __P((struct llc_linkcb *, int, const char *));
663 void llc_resetwindow __P((struct llc_linkcb *));
664 int llc_decode __P((struct llc *, struct llc_linkcb *));
665 void llc_timer __P((void));
666 void llcintr __P((void));
667 int llc_input __P((struct llc_linkcb *, struct mbuf *, u_char));
668 caddr_t llc_ctlinput __P((int, struct sockaddr *, caddr_t));
669 int llc_output __P((struct llc_linkcb *, struct mbuf *));
670 void llc_start __P((struct llc_linkcb *));
671 int llc_send __P((struct llc_linkcb *, int, int, int));
672 int llc_resend __P((struct llc_linkcb *, int, int));
673 int llc_rawsend __P((struct llc_linkcb *, struct mbuf *, struct llc *, int, int,
674 int, int));
675 int cons_rtrequest __P((int, struct rtentry *, struct sockaddr *));
676 int x25_llcglue __P((int, struct sockaddr *));
677
678 #endif
679
680