|
|
1.1 root 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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.