Annotation of 43BSDReno/contrib/isode-beta/h/spkt.h, revision 1.1.1.1

1.1       root        1: /* spkt.h - include file for session providers (SS-PROVIDER) */
                      2: 
                      3: /* 
                      4:  * $Header: /f/osi/h/RCS/spkt.h,v 7.1 89/11/27 10:30:35 mrose Exp $
                      5:  *
                      6:  *
                      7:  * $Log:       spkt.h,v $
                      8:  * Revision 7.1  89/11/27  10:30:35  mrose
                      9:  * sync
                     10:  * 
                     11:  * Revision 7.0  89/11/23  21:56:00  mrose
                     12:  * Release 6.0
                     13:  * 
                     14:  */
                     15: 
                     16: /*
                     17:  *                               NOTICE
                     18:  *
                     19:  *    Acquisition, use, and distribution of this module and related
                     20:  *    materials are subject to the restrictions of a license agreement.
                     21:  *    Consult the Preface in the User's Manual for the full terms of
                     22:  *    this agreement.
                     23:  *
                     24:  */
                     25: 
                     26: 
                     27: #ifndef        _SSAP_
                     28: #include "ssap.h"              /* definitions for SS-USERs */
                     29: #endif
                     30: 
                     31: #include "tsap.h"              /* definitions for TS-USERs */
                     32: 
                     33: 
                     34: /*  */
                     35: 
                     36: #define        ssapPsig(sb, sd) \
                     37: { \
                     38:     if ((sb = findsblk (sd)) == NULL) { \
                     39:        (void) sigiomask (smask); \
                     40:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                     41:                            "invalid session descriptor"); \
                     42:     } \
                     43:     if (!(sb -> sb_flags & SB_CONN)) {\
                     44:        (void) sigiomask (smask); \
                     45:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                     46:                            "session descriptor not connected"); \
                     47:     } \
                     48:     if (sb -> sb_flags & SB_FINN) { \
                     49:        (void) sigiomask (smask); \
                     50:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     51:                            "session descriptor finishing"); \
                     52:     } \
                     53:     if (sb -> sb_flags & SB_RELEASE) { \
                     54:        (void) sigiomask (smask); \
                     55:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     56:                            "release in progress"); \
                     57:     } \
                     58:     if (sb -> sb_flags & SB_MAP) { \
                     59:        (void) sigiomask (smask); \
                     60:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     61:                            "majorsync in progress"); \
                     62:     } \
                     63:     if (sb -> sb_flags & SB_RS) { \
                     64:        (void) sigiomask (smask); \
                     65:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     66:                            "resync in progress"); \
                     67:     } \
                     68:     if (sb -> sb_flags & SB_RA) { \
                     69:        (void) sigiomask (smask); \
                     70:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     71:                            "awaiting your resync response"); \
                     72:     } \
                     73:     if (sb -> sb_flags & SB_AI) { \
                     74:        (void) sigiomask (smask); \
                     75:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     76:                            "activity interrupt/discard in progress"); \
                     77:     } \
                     78:     if (sb -> sb_flags & SB_AIA) { \
                     79:        (void) sigiomask (smask); \
                     80:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     81:                            "awaiting your activity interrupt/discard response"); \
                     82:     } \
                     83:     if (sb -> sb_flags & (SB_ED | SB_EDACK | SB_ERACK)) { \
                     84:        (void) sigiomask (smask); \
                     85:        return ssaplose (si, SC_OPERATION, NULLCP, \
                     86:                            "exception in progress"); \
                     87:     } \
                     88: }
                     89: 
                     90: #define        ssapXsig(sb, sd) \
                     91: { \
                     92:     if ((sb = findsblk (sd)) == NULL) { \
                     93:        (void) sigiomask (smask); \
                     94:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                     95:                            "invalid session descriptor"); \
                     96:     } \
                     97:     if (!(sb -> sb_flags & SB_CONN)) {\
                     98:        (void) sigiomask (smask); \
                     99:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    100:                            "session descriptor not connected"); \
                    101:     } \
                    102:     if (sb -> sb_flags & SB_FINN) { \
                    103:        (void) sigiomask (smask); \
                    104:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    105:                            "session descriptor finishing"); \
                    106:     } \
                    107:     if (sb -> sb_flags & SB_RELEASE) { \
                    108:        (void) sigiomask (smask); \
                    109:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    110:                            "release in progress"); \
                    111:     } \
                    112:     if (sb -> sb_flags & SB_RS) { \
                    113:        (void) sigiomask (smask); \
                    114:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    115:                            "resync in progress"); \
                    116:     } \
                    117:     if (sb -> sb_flags & SB_RA) { \
                    118:        (void) sigiomask (smask); \
                    119:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    120:                            "awaiting your resync response"); \
                    121:     } \
                    122:     if (sb -> sb_flags & SB_AI) { \
                    123:        (void) sigiomask (smask); \
                    124:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    125:                            "activity interrupt/discard in progress"); \
                    126:     } \
                    127:     if (sb -> sb_flags & SB_AIA) { \
                    128:        (void) sigiomask (smask); \
                    129:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    130:                            "awaiting your activity interrupt/discard response"); \
                    131:     } \
                    132:     if (sb -> sb_flags & SB_ED) { \
                    133:        (void) sigiomask (smask); \
                    134:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    135:                            "exception in progress"); \
                    136:     } \
                    137: }
                    138: 
                    139: #define        ssapRsig(sb, sd) \
                    140: { \
                    141:     if ((sb = findsblk (sd)) == NULL) { \
                    142:        (void) sigiomask (smask); \
                    143:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    144:                            "invalid session descriptor"); \
                    145:     } \
                    146:     if (!(sb -> sb_flags & SB_CONN)) {\
                    147:        (void) sigiomask (smask); \
                    148:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    149:                            "session descriptor not connected"); \
                    150:     } \
                    151:     if (sb -> sb_flags & SB_FINN) { \
                    152:        (void) sigiomask (smask); \
                    153:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    154:                            "session descriptor finishing"); \
                    155:     } \
                    156:     if (sb -> sb_flags & SB_RELEASE) { \
                    157:        (void) sigiomask (smask); \
                    158:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    159:                            "release in progress"); \
                    160:     } \
                    161:     if (sb -> sb_flags & SB_RS) { \
                    162:        (void) sigiomask (smask); \
                    163:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    164:                            "resync in progress"); \
                    165:     } \
                    166:     if (sb -> sb_flags & SB_AI) { \
                    167:        (void) sigiomask (smask); \
                    168:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    169:                            "activity interrupt/discard in progress"); \
                    170:     } \
                    171:     if (sb -> sb_flags & SB_AIA) { \
                    172:        (void) sigiomask (smask); \
                    173:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    174:                            "awaiting your activity interrupt/discard response"); \
                    175:     } \
                    176:     if (sb -> sb_flags & SB_AE) { \
                    177:        (void) sigiomask (smask); \
                    178:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    179:                            "activity end in progress"); \
                    180:     } \
                    181:     if (sb -> sb_flags & SB_ED) { \
                    182:        (void) sigiomask (smask); \
                    183:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    184:                            "exception in progress"); \
                    185:     } \
                    186: }
                    187: 
                    188: #define        ssapAsig(sb, sd) \
                    189: { \
                    190:     if ((sb = findsblk (sd)) == NULL) { \
                    191:        (void) sigiomask (smask); \
                    192:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    193:                            "invalid session descriptor"); \
                    194:     } \
                    195:     if (!(sb -> sb_flags & SB_CONN)) {\
                    196:        (void) sigiomask (smask); \
                    197:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    198:                            "session descriptor not connected"); \
                    199:     } \
                    200:     if (sb -> sb_flags & SB_FINN) { \
                    201:        (void) sigiomask (smask); \
                    202:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    203:                            "session descriptor finishing"); \
                    204:     } \
                    205:     if (sb -> sb_flags & SB_RELEASE) { \
                    206:        (void) sigiomask (smask); \
                    207:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    208:                            "release in progress"); \
                    209:     } \
                    210:     if (sb -> sb_flags & SB_MAA) { \
                    211:        (void) sigiomask (smask); \
                    212:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    213:                            "awaiting your majorsync response"); \
                    214:     } \
                    215:     if (sb -> sb_flags & SB_RS) { \
                    216:        (void) sigiomask (smask); \
                    217:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    218:                            "resync in progress"); \
                    219:     } \
                    220:     if (sb -> sb_flags & SB_AI) { \
                    221:        (void) sigiomask (smask); \
                    222:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    223:                            "activity interrupt/discard in response"); \
                    224:     } \
                    225:     if (sb -> sb_flags & (SB_ED | SB_EDACK | SB_ERACK)) { \
                    226:        (void) sigiomask (smask); \
                    227:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    228:                            "exception in progress"); \
                    229:     } \
                    230: }
                    231: 
                    232: #define        ssapFsig(sb, sd) \
                    233: { \
                    234:     if ((sb = findsblk (sd)) == NULL) { \
                    235:        (void) sigiomask (smask); \
                    236:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    237:                            "invalid session descriptor"); \
                    238:     } \
                    239:     if (!(sb -> sb_flags & SB_CONN)) {\
                    240:        (void) sigiomask (smask); \
                    241:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    242:                            "session descriptor not connected"); \
                    243:     } \
                    244:     if (!(sb -> sb_flags & SB_FINN)) { \
                    245:        (void) sigiomask (smask); \
                    246:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    247:                            "session descriptor not finishing"); \
                    248:     } \
                    249:     if (sb -> sb_flags & SB_RELEASE) { \
                    250:        (void) sigiomask (smask); \
                    251:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    252:                            "release in progress"); \
                    253:     } \
                    254:     if (sb -> sb_flags & SB_MAA) { \
                    255:        (void) sigiomask (smask); \
                    256:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    257:                            "awaiting your majorsync response"); \
                    258:     } \
                    259:     if (sb -> sb_flags & SB_RS) { \
                    260:        (void) sigiomask (smask); \
                    261:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    262:                            "resync in progress"); \
                    263:     } \
                    264:     if (sb -> sb_flags & SB_RA) { \
                    265:        (void) sigiomask (smask); \
                    266:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    267:                            "awaiting your resync response"); \
                    268:     } \
                    269:     if (sb -> sb_flags & SB_AI) { \
                    270:        (void) sigiomask (smask); \
                    271:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    272:                            "activity interrupt/discard in progress"); \
                    273:     } \
                    274:     if (sb -> sb_flags & SB_AIA) { \
                    275:        (void) sigiomask (smask); \
                    276:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    277:                            "awaiting your activity interrupt/discard response"); \
                    278:     } \
                    279:     if (sb -> sb_flags & (SB_ED | SB_EDACK | SB_ERACK)) { \
                    280:        (void) sigiomask (smask); \
                    281:        return ssaplose (si, SC_OPERATION, NULLCP, \
                    282:                            "exception in progress"); \
                    283:     } \
                    284: }
                    285: 
                    286: #define        missingP(p) \
                    287: { \
                    288:     if (p == NULL) \
                    289:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    290:                            "mandatory parameter \"%s\" missing", "p"); \
                    291: }
                    292: 
                    293: #define        refmuchP(sr) \
                    294: { \
                    295:     if ((sr) -> sr_ulen > SREF_USER_SIZE \
                    296:            || (sr) -> sr_clen > SREF_COMM_SIZE \
                    297:            || (sr) -> sr_alen > SREF_ADDT_SIZE \
                    298:            || (sr) -> sr_vlen > SREF_USER_SIZE) \
                    299:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    300:                "bad format for reference"); \
                    301: }
                    302: 
                    303: #define        idmuchP(sd) \
                    304: { \
                    305:     if ((sd) -> sd_len > SID_DATA_SIZE) \
                    306:        return ssaplose (si, SC_PARAMETER, NULLCP, \
                    307:                "bad format for activity ID"); \
                    308: }
                    309: 
                    310: #define        toomuchP(sb,b,n,m,p) \
                    311: { \
                    312:     if (b == NULL) \
                    313:        n = 0; \
                    314:     else \
                    315:        if (n > (sb -> sb_version < SB_VRSN2 ? m : ENCLOSE_MAX)) { \
                    316:            (void) sigiomask (smask); \
                    317:            return ssaplose (si, SC_PARAMETER, NULLCP, \
                    318:                            "too much %s user data, %d octets", p, n); \
                    319:        } \
                    320: }
                    321: 
                    322: 
                    323: #define        NULLTX  ((struct TSAPdata *) 0)
                    324: #define        NULLSD  ((struct SSAPactid *) 0)
                    325: #define        NULLSR  ((struct SSAPref *) 0)
                    326: 
                    327: 
                    328: #ifndef        lint
                    329: #ifndef        __STDC__
                    330: #define        copySSAPdata(base,len,d) \
                    331: { \
                    332:     register int i = len; \
                    333:     if ((d -> d/* */_cc = min (i, sizeof d -> d/* */_data)) > 0) \
                    334:        bcopy (base, d -> d/* */_data, d -> d/* */_cc); \
                    335: }
                    336: 
                    337: #define        copySPKTdata(s,d) \
                    338: { \
                    339:     d -> d/* */_data = s -> s_udata, d -> d/* */_cc = s -> s_ulen; \
                    340:     s -> s_udata = NULL; \
                    341: }
                    342: #else
                    343: #define        copySSAPdata(base,len,d) \
                    344: { \
                    345:     register int i = len; \
                    346:     if ((d -> d##_cc = min (i, sizeof d -> d##_data)) > 0) \
                    347:        bcopy (base, d -> d##_data, d -> d##_cc); \
                    348: }
                    349: 
                    350: #define        copySPKTdata(s, d) \
                    351: { \
                    352:     d -> d##_data = s -> s_udata, d -> d##_cc = s -> s_ulen; \
                    353:     s -> s_udata = NULL; \
                    354: }
                    355: #endif
                    356: #else
                    357: #define        copySSAPdata(base,len,d)        bcopy (base, (char *) d, len)
                    358: 
                    359: #define        copySPKTdata(s,d)       bcopy (s -> s_udata, (char *) d, s -> s_ulen)
                    360: #endif
                    361: 
                    362: 
                    363: #define        AB_TIM          30      /* drain for 30 seconds on ABORTs */
                    364: #define        RF_TIM          30      /* drain for 30 seconds on REFUSEs */
                    365: 
                    366: 
                    367: #define        SC_REFUSE       (SC_BASE << 1)  /* larger than any sc_reason */
                    368: 
                    369: 
                    370: int    spktlose (), ssaplose ();
                    371: 
                    372: /*  */
                    373: 
                    374: struct ssapblk {
                    375:     struct ssapblk *sb_forw;   /* doubly-linked list */
                    376:     struct ssapblk *sb_back;   /*   .. */
                    377: 
                    378:     int     sb_fd;             /* transport descriptor */
                    379: 
                    380:     int            sb_version;         /* version number of protocol */
                    381: #define        SB_VRSN1        0       /*   1 */
                    382: #define        SB_VRSN2        1       /*   2 */
                    383: #define        SB_ALLVRSNS     ((1 << SB_VRSN1) | (1 << SB_VRSN2))
                    384:     int            sb_vrsnmask;        /* for initiating SPM... */
                    385: 
                    386:     long    sb_flags;          /* our state */
                    387: #define        SB_NULL         0x000000
                    388: #define        SB_CONN         0x000001/* connected */
                    389: #define        SB_FINN         0x000002/* other side wants to finish */
                    390: #define        SB_INIT         0x000004/* this side initiated the session */
                    391: #define        SB_ASYN         0x000008/* asynchronous */
                    392: #define        SB_EXPD         0x000010/* expedited service available on transport */
                    393: #define        SB_CD           0x000020/* CD request in progress */
                    394: #define        SB_CDA          0x000040/* awaiting CD response from user */
                    395: #define        SB_GTC          0x000080/* GTC request in progress */
                    396: #define        SB_MAP          0x000100/* MAP request in progress */
                    397: #define        SB_MAA          0x000200/* awaiting MAP response from user */
                    398: #define        SB_AE           0x000400/* MAP is really AE */
                    399: #define        SB_RS           0x000800/* RS request in progress */
                    400: #define        SB_RA           0x001000/* awaiting RS response from user */
                    401: #define        SB_AI           0x002000/* AI request in progress */
                    402: #define        SB_AIA          0x004000/* awaiting AI response from user */
                    403: #define        SB_ED           0x008000/* user exception in progress */
                    404: #define        SB_EDACK        0x010000/* awaiting user exception to be cleared */
                    405: #define        SB_ERACK        0x020000/* awaiting provider exception to be cleared */
                    406: #define        SB_Vact         0x040000/* activity in progress */
                    407: #define        SB_Vsc          0x080000/* okay to reply to minorsync */
                    408: #define        SB_Vnextact     0x100000/* activity MAP sent/received */
                    409: #define        SB_RELEASE      0x200000/* release in progress */
                    410: 
                    411:     struct ssapkt *sb_retry;   /* initial/final spkt */
                    412: 
                    413:     long    sb_V_A;            /* lowest unconfirmed ssn */
                    414:     long    sb_V_M;            /* next ssn */
                    415:     long    sb_V_R;            /* lowest ssn for resynchronization */
                    416:     int            sb_rs;              /* resynchronization type
                    417:                                     (an SYNC_xxx code, plus...) */
                    418: #define        SYNC_INTR       3       /* Activity Interrupt */
                    419: #define        SYNC_DISC       4       /* Activity Discard */
                    420:     long    sb_rsn;            /* resync serial number */
                    421:     u_char  sb_rsettings;      /* proposed token settings */
                    422: 
                    423:     int            sb_pr;              /* SPDU to prepare for (an SPDU code) */
                    424:     struct ssapkt *sb_xspdu;   /* saved expedited SPDU
                    425:                                   (really should be a linked list!) */
                    426: 
                    427:     struct ssapkt *sb_spdu;    /* for concatenated SPDUs */
                    428: 
                    429:     struct qbuf sb_qbuf;       /* for segmented (T)SSDUs */
                    430:     int            sb_len;             /*   .. */
                    431:     int            sb_code;            /*   .. */
                    432: 
                    433:     u_char  sb_options;                /* connect options */
                    434:     u_char  sb_settings;       /* tokens settings on connect */
                    435: 
                    436:     u_short sb_tsdu_us;                /* our max TSDU size */
                    437:     u_short sb_tsdu_them;      /* their max TSDU size */
                    438: #define        BAD_TSDU_SIZE(s)        ((s) ? (s) < DT_MINSIZE : 0)
                    439: #define        GET_TSDU_SIZE(s)        ((s) < DT_MINSIZE ? 0 : (s))
                    440: 
                    441:     u_char  sb_owned;          /* tokens we own */
                    442:     u_short sb_requirements;   /* functional units selected */
                    443: 
                    444:     struct SSAPaddr sb_initiating;     /* initiator */
                    445:     struct SSAPaddr sb_responding;     /* responder */
                    446: 
                    447:     int            sb_maxtime;         /* for SPM response during S-CONNECT */
                    448: 
                    449:     IFP            sb_DataIndication;          /* INDICATION handlers */
                    450:     IFP            sb_TokenIndication;         /*   .. */
                    451:     IFP            sb_SyncIndication;          /*   .. */
                    452:     IFP            sb_ActivityIndication;      /*   .. */
                    453:     IFP            sb_ReportIndication;        /*   .. */
                    454:     IFP            sb_ReleaseIndication;       /*   .. */
                    455:     IFP            sb_AbortIndication;         /*   .. */
                    456: };
                    457: #define        NULLBP          ((struct ssapblk *) 0)
                    458: 
                    459: int    freesblk ();
                    460: struct ssapblk *newsblk (), *findsblk ();
                    461: 
                    462: 
                    463: int    ts2sslose ();
                    464: 
                    465: int    spkt2sd ();
                    466: struct ssapkt *sb2spkt ();
                    467: 
                    468: /*    SPKT datastructure */
                    469: 
                    470: struct ssapkt {
                    471:     int            s_errno;
                    472: 
                    473:     int            s_mask;
                    474: 
                    475:     u_char    s_code;
                    476: #define        SPDU_CN         0x0d    /* CONNECT */
                    477: #define        SPDU_AC         0x0e    /* ACCEPT */
                    478: #define        SPDU_RF         0x0c    /* REFUSE */
                    479: #define        SPDU_FN         0x09    /* FINISH */
                    480: #define        SPDU_DN         0x0a    /* DISCONNECT */
                    481: #define        SPDU_NF         0x08    /* NOT FINISHED */
                    482: #define        SPDU_AB         0x19    /* ABORT */
                    483: #define        SPDU_AA         0x1a    /* ABORT ACCEPT */
                    484: #define        SPDU_DT         SPDU_GT /* DATA TRANSFER */
                    485: #define        SPDU_EX         0x05    /* EXPEDITED */
                    486: #define        SPDU_TD         0x21    /* TYPED DATA */
                    487: #define        SPDU_CD         0x3d    /* CAPABILITY DATA */
                    488: #define        SPDU_CDA        0x3e    /* CAPABILITY DATA ACK */
                    489: #define        SPDU_GT         0x01    /* GIVE TOKENS */
                    490: #define        SPDU_PT         0x02    /* PLEASE TOKENS */
                    491: #define        SPDU_GTC        0x15    /* GIVE TOKENS CONFIRM */
                    492: #define        SPDU_GTA        0x16    /* GIVE TOKENS ACK */
                    493: #define        SPDU_MIP        0x31    /* MINOR SYNCHRONIZATION POINT */
                    494: #define        SPDU_MIA        0x32    /* MINOR SYNC ACK */
                    495: #define        SPDU_MAP        0x29    /* MAJOR SYNCHRONIZATION POINT */
                    496: #define        SPDU_MAA        0x2a    /* MAJOR SYNC ACK */
                    497: #define        SPDU_RS         0x35    /* RESYNCHRONIZE */
                    498: #define        SPDU_RA         0x22    /* RESYNCHRONIZE ACK */
                    499: #define        SPDU_PR         0x07    /* PREPARE */
                    500: #define        SPDU_ER         0x00    /* EXCEPTION REPORT */
                    501: #define        SPDU_ED         0x30    /* EXCEPTION DATA */
                    502: #define        SPDU_AS         0x2d    /* ACTIVITY START */
                    503: #define        SPDU_AR         0x1d    /* ACTIVITY RESUME */
                    504: #define        SPDU_AI         SPDU_AB /* ACTIVITY INTERRUPT */
                    505: #define        SPDU_AIA        SPDU_AA /* ACTIVITY INTERRUPT ACK */
                    506: #define        SPDU_AD         0x39    /* ACTIVITY DISCARD */
                    507: #define        SPDU_ADA        0x3a    /* ACTIVITY DISCARD ACK */
                    508: #define        SPDU_AE         SPDU_MAP/* ACTIVITY END */
                    509: #define        SPDU_AEA        SPDU_MAA/* ACTIVITY END ACK */
                    510: 
                    511:     u_long    s_li;
                    512: #define        SPDU_MAXLEN     65535   /* segment if SSDU larger */
                    513: 
                    514: /* A nice magic number:
                    515:        for the GT SPDU, 2 octets
                    516:        for the DT SPDU, 2 octets + 3 octets for the enclosure option
                    517: 
                    518:     2 + 2 + 3 = 7
                    519:  */
                    520: #define        SSDU_MAGIC      7
                    521: 
                    522:     union {
                    523:        struct {                /* CONNECT/ACCEPT SPDU */
                    524: #define        SMASK_CN_REF    0x0001
                    525:            struct SSAPref un_cn_reference;
                    526: 
                    527:            struct {
                    528: #define        SMASK_CN_OPT    0x0002
                    529:                u_char  un_cn_options;
                    530: #define        CR_OPT_NULL     0x00
                    531: #define        CR_OPT_EXTD     0x01    /* will receive extended concatenated SPDUs,
                    532:                                   this implementation DOESN'T; segmenting is
                    533:                                   enough... */
                    534: #define        CR_OPT_MASK     CR_OPT_EXTD
                    535: 
                    536: #define        SMASK_CN_TSDU   0x0004
                    537:                u_short un_cn_tsdu_init;
                    538:                u_short un_cn_tsdu_resp;
                    539: 
                    540: #define        SMASK_CN_VRSN   0x0008
                    541:                u_char  un_cn_version;
                    542: 
                    543: #define        SMASK_CN_ISN    0x0010
                    544: #define        SIZE_CN_ISN     6
                    545:                u_long  un_cn_isn;
                    546: 
                    547: #define        SMASK_CN_SET    0x0020
                    548:                u_char  un_settings;
                    549:            }   un_cn_item;
                    550: 
                    551: #define        SMASK_AC_TOKEN  0x0040
                    552:            u_char      un_ac_token;/* ACCEPT SPDU only */
                    553: 
                    554: #define        SMASK_CN_REQ    0x0080
                    555:            u_short     un_cn_requirements;
                    556: 
                    557: #define        SMASK_CN_CALLING 0x0100
                    558:            char        un_cn_calling[SSSIZE];
                    559:            int         un_cn_callinglen;
                    560: 
                    561: #define        SMASK_CN_CALLED 0x0200
                    562:            char        un_cn_called[SSSIZE];
                    563:            int         un_cn_calledlen;
                    564:        }       un_cn;
                    565: #define        CN_SIZE         512
                    566: #define        CONNECT_MAX     10240   /* someday support CDO/OA SPDUs and Data
                    567:                                   Overflow PI... */
                    568: #define CN_BASE_SIZE   56
                    569: #define        AC_SIZE         512
                    570: #define AC_BASE_SIZE   62
                    571: 
                    572:        struct {                /* REFUSE SPDU */
                    573: #define        SMASK_RF_REF    0x0001
                    574:            struct SSAPref un_rf_reference;
                    575: 
                    576: #define        SMASK_RF_DISC   0x0002
                    577:            u_char      un_rf_disconnect;
                    578: #define        RF_DISC_RELEASE 0x01    /* release transport connection */
                    579: #define        RF_DISC_MASK    RF_DISC_RELEASE
                    580: 
                    581: #define        SMASK_RF_REQ    0x0004
                    582:            u_short     un_rf_requirements;
                    583: 
                    584: #define        SMASK_RF_VRSN   0x0008
                    585:            u_char      un_rf_version;
                    586: 
                    587:            char       *un_rf_rdata;
                    588:            int         un_rf_rlen;
                    589:        }       un_rf;
                    590: #define        RF_SIZE         513
                    591: #define RF_BASE_SIZE   13
                    592:        
                    593:        struct {                /* FINISH SPDU */
                    594: #define        SMASK_FN_DISC   0x0001
                    595:            u_char      un_fn_disconnect;
                    596: #define        FN_DISC_RELEASE 0x01    /* release transport connection */
                    597: #define        FN_DISC_MASK    FN_DISC_RELEASE
                    598:        }       un_fn;
                    599: #define        FN_SIZE         512
                    600: #define FN_BASE_SIZE   6
                    601:            
                    602:                                /* DISCONNECT SPDU */
                    603: #define        DN_SIZE         512
                    604: #define DN_BASE_SIZE   3
                    605: 
                    606:                                /* NOT FINISHED SPDU */
                    607: #define        NF_SIZE         512
                    608: #define NF_BASE_SIZE   3
                    609: 
                    610:        struct {                /* ABORT SPDU */
                    611: #define        SMASK_AB_DISC   0x0001
                    612:            u_char      un_ab_disconnect;
                    613: #define        AB_DISC_RELEASE 0x01    /* release transport connection */
                    614: #define        AB_DISC_USER    0x02    /* user abort */
                    615: #define        AB_DISC_PROTO   0x04    /* protocol error */
                    616: #define        AB_DISC_UNKNOWN 0x08    /* no reason */
                    617: #define        AB_DISC_MASK    (AB_DISC_RELEASE | AB_DISC_USER | AB_DISC_PROTO \
                    618:                            | AB_DISC_UNKNOWN)
                    619: 
                    620: #define        SMASK_AB_REFL   0x0002
                    621: #define        AB_REFL_SIZE    9
                    622:            u_char      un_ab_reflect[AB_REFL_SIZE];
                    623:        }       un_ab;
                    624: #define        AB_SIZE         9
                    625: #define AB_BASE_SIZE   17
                    626: #define        SMASK_SPDU_AB   0x0004
                    627:                                /* to distinguish between AB and AI SPDUs */
                    628: 
                    629:        
                    630:                                /* ABORT ACCEPT SPDU */
                    631: #define        AA_SIZE         0
                    632: #define AA_BASE_SIZE   0
                    633: #define        SMASK_SPDU_AA   0x0001  /* to distinguish between AA and AIA SPDUs */
                    634: 
                    635: 
                    636:                                /* DATA TRANSFER SPDU */
                    637: #define        DT_SIZE         65535
                    638: #define        DT_MINSIZE      64      /* don't segment if MSS < this */
                    639: #define DT_BASE_SIZE   3
                    640:        
                    641:                                /* EXPEDITED DATA SPDU */
                    642: #define        EX_SIZE         SX_EXSIZE
                    643: #define EX_BASE_SIZE   0
                    644: 
                    645:                                /* TYPED DATA SPDU */
                    646: #define        TD_SIGHS        65535   /* should be TD_SIZE, but <tsap.h>
                    647:                                   got there first */
                    648: #define        TD_MINSIZE      64      /* don't segment if MSS < this */
                    649: #define TD_BASE_SIZE   3
                    650: 
                    651:                                /* CAPABILITY DATA SPDU */
                    652: #define        CD_SIZE         SX_CDSIZE
                    653: #define CD_BASE_SIZE   3
                    654: 
                    655:                                /* CAPABILITY DATA ACK SPDU */
                    656: #define        CDA_SIZE        SX_CDASIZE
                    657: #define CDA_BASE_SIZE  3
                    658: 
                    659:        struct {                /* GIVE TOKENS SPDU */
                    660: #define        SMASK_GT_TOKEN  0x0001
                    661:            u_char      un_gt_token;
                    662:        }       un_gt;
                    663: #define        GT_SIZE         0
                    664: #define GT_BASE_SIZE   3
                    665: #define        SMASK_SPDU_GT   0x0002  /* to distinguish between DT and GT SPDUs */
                    666:        
                    667:        struct {                /* PLEASE TOKENS SPDU */
                    668: #define        SMASK_PT_TOKEN  0x0001
                    669:            u_char      un_pt_token;
                    670:        }       un_pt;
                    671: #define        PT_SIZE         512
                    672: #define PT_BASE_SIZE   6
                    673: 
                    674:                                /* GIVE TOKENS CONFIRM SPDU */
                    675: #define        GTC_SIZE        0
                    676: #define GTC_BASE_SIZE  0
                    677: 
                    678:                                /* GIVE TOKENS ACK SPDU */
                    679: #define        GTA_SIZE        0
                    680: #define GTA_BASE_SIZE  0
                    681: 
                    682:        struct {                /* MINOR SYNC POINT SPDU */
                    683: #define        SMASK_MIP_SYNC  0x0001
                    684:            u_char      un_mip_sync;
                    685: #define        MIP_SYNC_NOEXPL 0x01    /* NO EXPLICIT ACK REQUIRED */
                    686: #define        MIP_SYNC_MASK   MIP_SYNC_NOEXPL
                    687: 
                    688: #define        SMASK_MIP_SERIAL 0x0002
                    689:            u_long      un_mip_serial;
                    690:        }       un_mip;
                    691: #define        MIP_SIZE        512
                    692: #define MIP_BASE_SIZE  14
                    693: 
                    694:        struct {                /* MINOR SYNC ACK SPDU */
                    695: #define        SMASK_MIA_SERIAL 0x0001
                    696:            u_long      un_mia_serial;
                    697:        }       un_mia;
                    698: #define        MIA_SIZE        512
                    699: #define MIA_BASE_SIZE  11
                    700: 
                    701:        struct {                /* MAJOR SYNC POINT SPDU */
                    702: #define        SMASK_MAP_SYNC  0x0001
                    703:            u_char      un_map_sync;
                    704: #define        MAP_SYNC_NOEND  0x01    /* ACTIVITY NOT ENDED (i.e., MAP not AE) */
                    705: #define        MAP_SYNC_MASK   MAP_SYNC_NOEND
                    706: 
                    707: #define        SMASK_MAP_SERIAL 0x0002
                    708:            u_long      un_map_serial;
                    709:        }       un_map;
                    710: #define        MAP_SIZE        512
                    711: #define MAP_BASE_SIZE  14
                    712: 
                    713:        struct {                /* MAJOR SYNC ACK SPDU */
                    714: #define        SMASK_MAA_SERIAL 0x0001
                    715:            u_long      un_maa_serial;
                    716:        }       un_maa;
                    717: #define        MAA_SIZE        512
                    718: #define MAA_BASE_SIZE  11
                    719: 
                    720:        struct {                /* RESYNCHRONIZE SPDU */
                    721: #define        SMASK_RS_SET    0x0001
                    722:            u_char      un_rs_settings;
                    723: 
                    724: #define        SMASK_RS_TYPE   0x0002
                    725:            u_char      un_rs_type;
                    726: #define        SYNC_OK(r)      (((unsigned) (r)) <= SYNC_SET)
                    727: 
                    728: #define        SMASK_RS_SSN    0x0004
                    729:            u_long      un_rs_serial;
                    730:     }      un_rs;
                    731: #define        RS_SIZE         512
                    732: #define RS_BASE_SIZE   17
                    733: 
                    734:        struct {                /* RESYNCHRONIZE ACK SPDU */
                    735: #define        SMASK_RA_SET    0x0001
                    736:            u_char      un_ra_settings;
                    737: 
                    738: #define        SMASK_RA_SSN    0x0002
                    739:            u_long      un_ra_serial;
                    740:        }    un_ra;
                    741: #define        RA_SIZE         512
                    742: #define RA_BASE_SIZE   14
                    743: 
                    744:        struct {                /* PREPARE SPDU */
                    745: #define        SMASK_PR_TYPE   0x0001
                    746:            u_char          un_pr_type;
                    747: #define        PR_MAA          1       /* expect SPDU_MAA */
                    748: #define        PR_RS           2       /* expect SPDU_RS */
                    749: #define        PR_RA           3       /* expect SPDU_RA */
                    750: #define        PR_AB           4       /* expect SPDU_AB */
                    751: #define        PR_MAX          PR_AB
                    752:        }    un_pr;
                    753: #define        PR_SIZE         0
                    754: #define PR_BASE_SIZE   3
                    755: 
                    756:                                /* EXCEPTION REPORT SPDU */
                    757: #define        ER_SIZE         0
                    758: #define ER_BASE_SIZE   0
                    759: 
                    760:        struct {                /* EXCEPTION DATA SPDU */
                    761: #define        SMASK_ED_REASON 0x0001
                    762:            u_char      un_ed_reason;
                    763: #define        SP_OK(r)        (((r) < SP_PROCEDURAL \
                    764:                                && (r) != SP_RSVD1 \
                    765:                                && (r) != SP_RSVD2) \
                    766:                            || (r) == SP_DEMAND)
                    767:        }    un_ed;
                    768: #define        ED_SIZE         512
                    769: #define ED_BASE_SIZE   6
                    770: 
                    771:        struct {                /* ACTIVITY START SPDU */
                    772: #define        SMASK_AS_ID     0x0001
                    773:            struct SSAPactid un_as_id;
                    774:        }    un_as;     
                    775: #define        AS_SIZE         512
                    776: #define AS_BASE_SIZE   11
                    777: 
                    778:        struct {                /* ACTIVITY RESUME SPDU */
                    779:            struct {
                    780: #define        SMASK_AR_REF    0x0001
                    781:                struct SSAPref un_ar_reference;
                    782: 
                    783: #define        SMASK_AR_OID    0x0002
                    784:                struct SSAPactid un_ar_oid;
                    785: 
                    786: #define        SMASK_AR_SSN    0x0004
                    787:                u_long  un_ar_serial;
                    788:            }   un_ar_link;
                    789: 
                    790: #define        SMASK_AR_ID     0x0008
                    791:            struct SSAPactid un_ar_id;
                    792:        }    un_ar;
                    793: #define        AR_SIZE         512
                    794: #define AR_BASE_SIZE   29
                    795: 
                    796:        struct {                /* ACTIVITY INTERRUPT (ABORT) SPDU */
                    797: #define        SMASK_AI_REASON 0x0001  /* don't collide with SMASK_AB_DISC */
                    798:            u_char      un_ai_reason;
                    799:        }    un_ai;
                    800: #define        AI_SIZE         0
                    801: #define AI_BASE_SIZE   3
                    802: 
                    803:                                /* ACTIVITY INTERRUPT (ABORT) ACK SPDU */
                    804: #define        AIA_SIZE        0
                    805: #define AIA_BASE_SIZE  0
                    806: 
                    807: 
                    808:        struct {                /* ACTIVITY DISCARD SPDU */
                    809: #define        SMASK_AD_REASON 0x0001
                    810:            u_char      un_ad_reason;
                    811:        }    un_ad;
                    812: #define        AD_SIZE         0
                    813: #define AD_BASE_SIZE   3
                    814: 
                    815:                                /* ACTIVITY DISCARD ACK SPDU */
                    816: #define        ADA_SIZE        0
                    817: #define ADA_BASE_SIZE  0
                    818: 
                    819:                                /* ACTIVITY END (MAJOR SYNC) SPDU */
                    820: #define        AE_SIZE         512
                    821: #define AE_BASE_SIZE   8
                    822: 
                    823:                                /* ACTIVITY END (MAJOR SYNC) ACK SPDU */
                    824: #define        AEA_SIZE        MAA_SIZE
                    825: #define AEA_BASE_SIZE  MAA_BASE_SIZE
                    826:     }  s_un;
                    827: #define        s_cn_reference  s_un.un_cn.un_cn_reference
                    828: #define        s_options       s_un.un_cn.un_cn_item.un_cn_options
                    829: #define s_tsdu_init    s_un.un_cn.un_cn_item.un_cn_tsdu_init
                    830: #define s_tsdu_resp    s_un.un_cn.un_cn_item.un_cn_tsdu_resp
                    831: #define s_cn_version   s_un.un_cn.un_cn_item.un_cn_version
                    832: #define s_isn          s_un.un_cn.un_cn_item.un_cn_isn
                    833: #define s_settings     s_un.un_cn.un_cn_item.un_settings
                    834: #define        s_ac_token      s_un.un_cn.un_ac_token
                    835: #define        s_cn_require    s_un.un_cn.un_cn_requirements
                    836: #define        s_calling       s_un.un_cn.un_cn_calling
                    837: #define        s_callinglen    s_un.un_cn.un_cn_callinglen
                    838: #define        s_called        s_un.un_cn.un_cn_called
                    839: #define        s_calledlen     s_un.un_cn.un_cn_calledlen
                    840: 
                    841: #define        s_rf_reference  s_un.un_rf.un_rf_reference
                    842: #define        s_rf_disconnect s_un.un_rf.un_rf_disconnect
                    843: #define        s_rf_require    s_un.un_rf.un_rf_requirements
                    844: #define        s_rf_version    s_un.un_rf.un_rf_version
                    845: #define        s_rdata         s_un.un_rf.un_rf_rdata
                    846: #define        s_rlen          s_un.un_rf.un_rf_rlen
                    847: 
                    848: #define        s_fn_disconnect s_un.un_fn.un_fn_disconnect
                    849: 
                    850: #define        s_ab_disconnect s_un.un_ab.un_ab_disconnect
                    851: #define        s_reflect       s_un.un_ab.un_ab_reflect
                    852: 
                    853: #define        s_gt_token      s_un.un_gt.un_gt_token
                    854: 
                    855: #define        s_pt_token      s_un.un_pt.un_pt_token
                    856: 
                    857: #define        s_mip_sync      s_un.un_mip.un_mip_sync
                    858: #define        s_mip_serial    s_un.un_mip.un_mip_serial
                    859: 
                    860: #define        s_mia_serial    s_un.un_mia.un_mia_serial
                    861: 
                    862: #define        s_map_sync      s_un.un_map.un_map_sync
                    863: #define        s_map_serial    s_un.un_map.un_map_serial
                    864: 
                    865: #define        s_maa_serial    s_un.un_maa.un_maa_serial
                    866: 
                    867: #define        s_rs_settings   s_un.un_rs.un_rs_settings
                    868: #define        s_rs_type       s_un.un_rs.un_rs_type
                    869: #define        s_rs_serial     s_un.un_rs.un_rs_serial
                    870: 
                    871: #define        s_ra_settings   s_un.un_ra.un_ra_settings
                    872: #define        s_ra_serial     s_un.un_ra.un_ra_serial
                    873: 
                    874: #define        s_pr_type       s_un.un_pr.un_pr_type
                    875: 
                    876: #define        s_ed_reason     s_un.un_ed.un_ed_reason
                    877: 
                    878: #define        s_as_id         s_un.un_as.un_as_id
                    879: 
                    880: #define        s_ar_reference  s_un.un_ar.un_ar_link.un_ar_reference
                    881: #define        s_ar_oid        s_un.un_ar.un_ar_link.un_ar_oid
                    882: #define        s_ar_serial     s_un.un_ar.un_ar_link.un_ar_serial
                    883: #define        s_ar_id         s_un.un_ar.un_ar_id
                    884: 
                    885: #define        s_ai_reason     s_un.un_ai.un_ai_reason
                    886: 
                    887: #define        s_ad_reason     s_un.un_ad.un_ad_reason
                    888: 
                    889: 
                    890: #define        SMASK_ENCLOSE   0x2000
                    891:     u_char    s_enclose;
                    892: #define        ENCL_BEGIN      0x01    /* beginning of SSDU */
                    893: #define        ENCL_END        0x02    /* end of SSDU */
                    894: #define        ENCL_MASK       (ENCL_BEGIN | ENCL_END)
                    895: #define        ENCLOSE_MAX     65400   /* maximum size of enclosure per segment
                    896:                                   less slop; slop varies based on SPDU, but
                    897:                                   we'll always assume the worst case */
                    898: #define        SEGMENT_MAX     65528   /* for things other than S-DATA and
                    899:                                   S-TYPED-DATA under version 2 we allow only
                    900:                                   ONE enclosure */
                    901: 
                    902: #define        SMASK_UDATA_PGI 0x4000
                    903:     char   *s_udata;           /* user data PGI */
                    904:     int            s_ulen;             /*   .. */
                    905: 
                    906: #define        SMASK_SPDU_EXPD 0x8000  /* SPDU arrived on the expedited connection */
                    907: 
                    908:     struct qbuf s_qbuf;                /* user info */
                    909:     int            s_qlen;             /*   .. */
                    910: };
                    911: #define        NULLSPKT        ((struct ssapkt *) 0)
                    912: 
                    913: 
                    914: int    freespkt ();
                    915: struct ssapkt *newspkt ();
                    916: 
                    917: void   text2spkt (), spkt2text ();
                    918: 
                    919: int    spkt2tsdu ();
                    920: struct ssapkt *tsdu2spkt ();
                    921: 
                    922: char   *spkt2str ();
                    923: struct ssapkt *str2spkt ();

unix.superglobalmegacorp.com

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