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