Annotation of XNU/bsd/netccitt/llc_var.h, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

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