Annotation of kernel/bsd/netccitt/llc_var.h, revision 1.1.1.2

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: 
1.1.1.2 ! root      600: #if defined (KERNEL) && LLC
1.1       root      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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.