Annotation of 43BSDReno/contrib/isode-beta/ssap/ssaprespond.c, revision 1.1

1.1     ! root        1: /* ssaprespond.c - SPM: responder */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/ssap/RCS/ssaprespond.c,v 7.1 89/11/27 10:30:46 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/ssap/RCS/ssaprespond.c,v 7.1 89/11/27 10:30:46 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       ssaprespond.c,v $
        !            12:  * Revision 7.1  89/11/27  10:30:46  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.0  89/11/23  22:25:38  mrose
        !            16:  * Release 6.0
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  *                               NOTICE
        !            22:  *
        !            23:  *    Acquisition, use, and distribution of this module and related
        !            24:  *    materials are subject to the restrictions of a license agreement.
        !            25:  *    Consult the Preface in the User's Manual for the full terms of
        !            26:  *    this agreement.
        !            27:  *
        !            28:  */
        !            29: 
        !            30: 
        !            31: /* LINTLIBRARY */
        !            32: 
        !            33: #include <stdio.h>
        !            34: #include "spkt.h"
        !            35: #include "tailor.h"
        !            36: 
        !            37: /*    S-CONNECT.INDICATION */
        !            38: 
        !            39: int    SInit (vecp, vec, ss, si)
        !            40: int    vecp;
        !            41: char  **vec;
        !            42: struct SSAPstart *ss;
        !            43: struct SSAPindication *si;
        !            44: {
        !            45:     int            len;
        !            46:     register struct ssapblk *sb;
        !            47:     register struct ssapkt *s;
        !            48:     struct TSAPstart tss;
        !            49:     register struct TSAPstart *ts = &tss;
        !            50:     struct TSAPdisconnect tds;
        !            51:     register struct TSAPdisconnect *td = &tds;
        !            52: 
        !            53:     isodetailor (NULLCP, 0);
        !            54: 
        !            55:     if (vecp < 2)
        !            56:        return ssaplose (si, SC_PARAMETER, NULLCP,
        !            57:                    "bad initialization vector");
        !            58:     missingP (vec);
        !            59:     missingP (ss);
        !            60:     missingP (si);
        !            61: 
        !            62:     if ((sb = newsblk ()) == NULL)
        !            63:        return ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !            64: 
        !            65:     if (vecp == 2 || TInit (vecp, vec, ts, td) != NOTOK) {
        !            66:        int     sd;
        !            67:        struct TSAPdata txs;
        !            68:        register struct TSAPdata *tx = &txs;
        !            69: 
        !            70:        if (vecp == 2) {
        !            71:            if (TRestoreState (vec[1], ts, td) == NOTOK) {
        !            72:                (void) ts2sslose (si, "TRestoreState", td);
        !            73:                (void) ssaplose (si, SC_PARAMETER, NULLCP,
        !            74:                                 "bad initialization vector");
        !            75:                goto out1;
        !            76:            }
        !            77:            bzero (vec[0], strlen (vec[0]));
        !            78:            bzero (vec[1], strlen (vec[1]));
        !            79:            *vec = NULL;
        !            80:        }
        !            81:        else {
        !            82:            if (TConnResponse (ts -> ts_sd, &ts -> ts_called,
        !            83:                    ts -> ts_expedited,  NULLCP, 0, NULLQOS, td) == NOTOK) {
        !            84:                (void) ts2sslose (si, "TConnResponse", td);
        !            85:                (void) TDiscRequest (ts -> ts_sd, NULLCP, 0, td);
        !            86:                goto out1;
        !            87:            }
        !            88:        }
        !            89:        sd = ts -> ts_sd;
        !            90: 
        !            91:        if (TReadRequest (sb -> sb_fd = sd, tx, NOTOK, td) == NOTOK) {
        !            92:            (void) ts2sslose (si, "TReadRequest", td);
        !            93:            goto out1;
        !            94:        }
        !            95: 
        !            96:        s = tsdu2spkt (&tx -> tx_qbuf, tx -> tx_cc, NULLIP);
        !            97:        TXFREE (tx);
        !            98: 
        !            99:        if (s == NULL || s -> s_errno != SC_ACCEPT) {
        !           100:            (void) spktlose (sd, si, (s ? s -> s_errno : SC_CONGEST)
        !           101:                                | SC_REFUSE, NULLCP, NULLCP);
        !           102:            goto out2;
        !           103:        }
        !           104: 
        !           105:        if (s -> s_code != SPDU_CN) {
        !           106:            (void) spktlose (sd, si, (s ? s -> s_errno : SC_CONGEST)
        !           107:                                | SC_REFUSE, NULLCP,
        !           108:                        "session protocol mangled: expected 0x%x, got 0x%x",
        !           109:                        SPDU_CN, s -> s_code);
        !           110:            goto out2;
        !           111:        }
        !           112: 
        !           113:        if (s -> s_mask & SMASK_CN_VRSN
        !           114:                && !(s -> s_cn_version & SB_ALLVRSNS)) {
        !           115:            (void) spktlose (sd, si, SC_VERSION | SC_REFUSE, NULLCP,
        !           116:                             "version mismatch: expecting something in 0x%x, got 0x%x",
        !           117:                             SB_ALLVRSNS, s -> s_cn_version);
        !           118:            goto out2;
        !           119:        }
        !           120:     }
        !           121:     else {
        !           122:        int     reason;
        !           123: 
        !           124:        vec += vecp - 2;
        !           125:        s = NULL;
        !           126:        if ((reason = td -> td_reason) != DR_PARAMETER
        !           127:                || TRestoreState (vec[0], ts, td) == NOTOK
        !           128:                || (s = str2spkt (vec[1])) == NULL
        !           129:                || s -> s_errno != SC_ACCEPT) {
        !           130:            if (s)
        !           131:                freespkt (s);
        !           132:            else
        !           133:                (void) ts2sslose (si, reason != DR_PARAMETER ? "TInit"
        !           134:                                : "TRestoreState", td);
        !           135:            (void) ssaplose (si, SC_PARAMETER, NULLCP,
        !           136:                        "bad initialization vector");
        !           137:            goto out1;
        !           138:        }
        !           139:        bzero (vec[0], strlen (vec[0]));
        !           140:        bzero (vec[1], strlen (vec[1]));
        !           141:        *vec = NULL;
        !           142:     }
        !           143: 
        !           144:     sb -> sb_fd = ts -> ts_sd;
        !           145:     sb -> sb_version =
        !           146:                (s -> s_mask & SMASK_CN_VRSN)
        !           147:                    ? ((s -> s_cn_version & (1 << SB_VRSN2))
        !           148:                            ? SB_VRSN2 : SB_VRSN1)
        !           149:                    : s -> s_ulen > SS_SIZE
        !           150:                            ? SB_VRSN2 : SB_VRSN1;
        !           151:     if (ts -> ts_expedited)
        !           152:        sb -> sb_flags |= SB_EXPD;
        !           153: 
        !           154:     bzero ((char *) ss, sizeof *ss);
        !           155:     ss -> ss_sd = sb -> sb_fd;
        !           156:     if (s -> s_mask & SMASK_CN_REF)
        !           157:        ss -> ss_connect = s -> s_cn_reference; /* struct copy */
        !           158:     if (s -> s_mask & SMASK_CN_OPT)
        !           159:        sb -> sb_options = s -> s_options;
        !           160:     if (s -> s_mask & SMASK_CN_ISN)
        !           161:        ss -> ss_isn = sb -> sb_V_A = sb -> sb_V_M = s -> s_isn;
        !           162:     else
        !           163:        ss -> ss_isn = SERIAL_NONE;
        !           164:     if (!(s -> s_mask & SMASK_CN_TSDU))
        !           165:        s -> s_tsdu_init = s -> s_tsdu_resp = 0;
        !           166:     if (s -> s_tsdu_init
        !           167:                < (sb -> sb_tsdu_them = GET_TSDU_SIZE (ts -> ts_tsdusize)))
        !           168:        sb -> sb_tsdu_them = s -> s_tsdu_init;
        !           169:     if (s -> s_tsdu_resp
        !           170:                < (sb -> sb_tsdu_us = GET_TSDU_SIZE (ts -> ts_tsdusize)))
        !           171:        sb -> sb_tsdu_us = s -> s_tsdu_resp;
        !           172:     if (sb -> sb_version >= SB_VRSN2)          /* XXX */
        !           173:        sb -> sb_tsdu_them = sb -> sb_tsdu_us = 0;
        !           174: 
        !           175:     if (s -> s_mask & SMASK_CN_SET)
        !           176:        sb -> sb_settings = ss -> ss_settings = s -> s_settings;
        !           177:     sb -> sb_requirements = (s -> s_mask & SMASK_CN_REQ ? s -> s_cn_require
        !           178:                : SR_DEFAULT) & SR_MYREQUIRE;
        !           179:     if (!ts -> ts_expedited)
        !           180:        sb -> sb_requirements &= ~SR_EXPEDITED;
        !           181:     if (!(sb -> sb_requirements & SR_HALFDUPLEX))
        !           182:        sb -> sb_requirements &= ~SR_EXCEPTIONS;
        !           183:     ss -> ss_requirements = sb -> sb_requirements;
        !           184:     ss -> ss_calling.sa_addr = ts -> ts_calling;       /* struct copy */
        !           185:     if (s -> s_mask & SMASK_CN_CALLING) {
        !           186:        if ((len = s -> s_callinglen)
        !           187:                > sizeof ss -> ss_calling.sa_selector)
        !           188:            len = sizeof ss -> ss_calling.sa_selector;
        !           189:        bcopy (s -> s_calling, ss -> ss_calling.sa_selector,
        !           190:                ss -> ss_calling.sa_selectlen = len);
        !           191:     }
        !           192:     sb -> sb_initiating = ss -> ss_calling;    /* struct copy */
        !           193:     ss -> ss_called.sa_addr = ts -> ts_called; /* struct copy */
        !           194:     if (s -> s_mask & SMASK_CN_CALLED) {
        !           195:        if ((len = s -> s_calledlen)
        !           196:                > sizeof ss -> ss_called.sa_selector)
        !           197:            len = sizeof ss -> ss_called.sa_selector;
        !           198:        bcopy (s -> s_called, ss -> ss_called.sa_selector,
        !           199:                ss -> ss_called.sa_selectlen = len);
        !           200:     }
        !           201:     sb -> sb_responding = ss -> ss_called;     /* struct copy */
        !           202:     if ((ss -> ss_ssdusize = sb -> sb_tsdu_us - SSDU_MAGIC) < 0)
        !           203:        ss -> ss_ssdusize = ts -> ts_tsdusize - SSDU_MAGIC;
        !           204:     ss -> ss_qos = ts -> ts_qos;       /* struct copy */
        !           205:     ss -> ss_qos.qos_sversion = sb -> sb_version + 1;
        !           206:     ss -> ss_qos.qos_extended = (sb -> sb_flags & SB_EXPD) ? 1 : 0;
        !           207:     copySPKTdata (s, ss);
        !           208: 
        !           209:     freespkt (s);
        !           210: 
        !           211:     return OK;
        !           212: 
        !           213: out2: ;
        !           214:     freespkt(s);
        !           215: 
        !           216: out1: ;
        !           217:     freesblk (sb);
        !           218: 
        !           219:     return NOTOK;
        !           220: }
        !           221: 
        !           222: /*    S-CONNECT.RESPONSE */
        !           223: 
        !           224: #define        dotoken(requires,shift,bit,type) \
        !           225: { \
        !           226:     if (sb -> sb_requirements & requires) \
        !           227:        switch (sb -> sb_settings & (ST_MASK << shift)) { \
        !           228:            case ST_CALL_VALUE << shift: \
        !           229:                switch (settings & (ST_MASK << shift)) { \
        !           230:                    case ST_INIT_VALUE << shift: \
        !           231:                        settings &= ~(ST_MASK << shift); \
        !           232:                        settings |= ST_INIT_VALUE << shift; \
        !           233:                        break; \
        !           234:  \
        !           235:                    case ST_RESP_VALUE << shift: \
        !           236:                        settings &= ~(ST_MASK << shift); \
        !           237:                        settings |= ST_RESP_VALUE << shift; \
        !           238:                        sb -> sb_owned |= bit; \
        !           239:                        break; \
        !           240:  \
        !           241:                    default: \
        !           242:                        return ssaplose (si, SC_PARAMETER, NULLCP, \
        !           243:                                "improper choice of %s token setting", type); \
        !           244:                } \
        !           245:                break; \
        !           246:  \
        !           247:            case ST_INIT_VALUE << shift: \
        !           248:                if ((settings & (ST_MASK << shift)) == (ST_RSVD_VALUE << shift)) \
        !           249:                    please |= bit; \
        !           250:                settings &= ~(ST_MASK << shift); \
        !           251:                settings |= ST_INIT_VALUE << shift; \
        !           252:                break; \
        !           253:  \
        !           254:            case ST_RESP_VALUE << shift: \
        !           255:                settings &= ~(ST_MASK << shift); \
        !           256:                settings |= ST_RESP_VALUE << shift; \
        !           257:                sb -> sb_owned |= bit; \
        !           258:                break; \
        !           259:        } \
        !           260: }
        !           261:                
        !           262: /*  */
        !           263: 
        !           264: int    SConnResponse (sd, ref, responding, status, requirements, settings,
        !           265:        isn, data, cc, si)
        !           266: int    sd;
        !           267: struct SSAPref *ref;
        !           268: struct SSAPaddr *responding;
        !           269: int    status,
        !           270:        requirements,
        !           271:        settings,
        !           272:        cc;
        !           273: long   isn;
        !           274: char   *data;
        !           275: struct SSAPindication *si;
        !           276: {
        !           277:     int     result,
        !           278:            please;
        !           279:     register struct ssapkt *s;
        !           280:     register struct ssapblk *sb;
        !           281: 
        !           282:     if ((sb = findsblk (sd)) == NULL || (sb -> sb_flags & SB_CONN))
        !           283:        return ssaplose (si, SC_PARAMETER, NULLCP, "invalid session descriptor");
        !           284:     missingP (ref);
        !           285:     refmuchP (ref);
        !           286:     if (ref -> sr_vlen)
        !           287:        return ssaplose (si, SC_PARAMETER, NULLCP, "bad format for reference");
        !           288: #ifdef notdef
        !           289:     missingP (responding);
        !           290: #endif
        !           291:     if (responding)
        !           292:        sb -> sb_responding = *responding;      /* struct copy */
        !           293:     switch (status) {
        !           294:        case SC_ACCEPT: 
        !           295:            if (requirements & ~SR_MYREQUIRE)
        !           296:                return ssaplose (si, SC_PARAMETER, NULLCP,
        !           297:                            "requirements settings not supported");
        !           298: #ifdef notdef          /* screwy session protocol... */
        !           299:            if (requirements & ~sb -> sb_requirements)
        !           300:                return ssaplose (si, SC_PARAMETER, NULLCP,
        !           301:                            "requirements settings not available");
        !           302: #endif
        !           303:            if ((requirements & SR_HALFDUPLEX) && (requirements & SR_DUPLEX))
        !           304:                return ssaplose (si, SC_PARAMETER, NULLCP,
        !           305:                            "half-duplex and duplex services are incompatible");
        !           306:            if ((requirements & SR_EXCEPTIONS)
        !           307:                    && !(requirements & SR_HALFDUPLEX))
        !           308:                return ssaplose (si, SC_PARAMETER, NULLCP,
        !           309:                            "exception service requires half-duplex service");
        !           310:            sb -> sb_requirements &= requirements;
        !           311:            sb -> sb_owned = 0, please = 0;
        !           312:            dotokens ();
        !           313:            if (sb -> sb_requirements
        !           314:                        & (SR_MINORSYNC | SR_MAJORSYNC | SR_RESYNC)) {
        !           315:                if (!(sb -> sb_requirements & SR_ACTIVITY)
        !           316:                        || isn != SERIAL_NONE)
        !           317:                    if (SERIAL_MIN > isn || isn > SERIAL_MAX + 1)
        !           318:                        return ssaplose (si, SC_PARAMETER, NULLCP,
        !           319:                                "bad choice for initial serial number");
        !           320:            }
        !           321:            else
        !           322:                if (isn != SERIAL_NONE)
        !           323:                    return ssaplose (si, SC_PARAMETER, NULLCP,
        !           324:                           "initial serial number invalid given requirements");
        !           325:            break;
        !           326: 
        !           327:        case SC_NOTSPECIFIED: 
        !           328:        case SC_CONGESTION: 
        !           329:        case SC_REJECTED: 
        !           330:            break;
        !           331: 
        !           332:        default: 
        !           333:            return ssaplose (si, SC_PARAMETER, NULLCP, "invalid result");
        !           334:     }
        !           335:     if (data == NULL)
        !           336:        cc = 0;
        !           337:     else
        !           338:        if (cc > (sb -> sb_version < SB_VRSN2 ? SC_SIZE : ENCLOSE_MAX))
        !           339:            return ssaplose (si, SC_PARAMETER, NULLCP,
        !           340:                             "too much initial user data, %d octets", cc);
        !           341:     missingP (si);
        !           342: 
        !           343:     if (status != SC_ACCEPT) {
        !           344:        if ((s = newspkt (SPDU_RF)) == NULL) {
        !           345:            (void) ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !           346:            goto out1;
        !           347:        }
        !           348: 
        !           349:        s -> s_mask |= SMASK_RF_REF;
        !           350:        s -> s_rf_reference = *ref;     /* struct copy */
        !           351:        if (status == SC_REJECTED) {
        !           352:            s -> s_mask |= SMASK_RF_REQ;
        !           353:            s -> s_rf_require = requirements;
        !           354:        }
        !           355:        if ((s -> s_rdata = malloc ((unsigned) (s -> s_rlen = 1 + cc)))
        !           356:                == NULL) {
        !           357:            (void) ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !           358:            goto out2;
        !           359:        }
        !           360:        *s -> s_rdata = status & 0xff;
        !           361:        if (cc > 0)
        !           362:            bcopy (data, s -> s_rdata + 1, cc);
        !           363:        result = refuse (sb, s, si);
        !           364:        freesblk (sb);
        !           365: 
        !           366:        return (result != NOTOK && status != SC_ACCEPT ? OK : NOTOK);
        !           367:     }
        !           368: 
        !           369:     if ((s = newspkt (SPDU_AC)) == NULL) {
        !           370:        (void) ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !           371:        goto out1;
        !           372:     }
        !           373: 
        !           374:     s -> s_mask |= SMASK_CN_REF | SMASK_CN_OPT | SMASK_CN_VRSN;
        !           375:     s -> s_cn_reference = *ref;        /* struct copy */
        !           376:     s -> s_options = CR_OPT_NULL;
        !           377:     s -> s_cn_version = 1 << sb -> sb_version;
        !           378: 
        !           379:     if (isn != SERIAL_NONE) {
        !           380:        s -> s_mask |= SMASK_CN_ISN;
        !           381:        s -> s_isn = isn;
        !           382:     }
        !           383: 
        !           384:     if (sb -> sb_tsdu_us || sb -> sb_tsdu_them) {
        !           385:        s -> s_mask |= SMASK_CN_TSDU;
        !           386:        s -> s_tsdu_resp = GET_TSDU_SIZE (sb -> sb_tsdu_us);
        !           387:        s -> s_tsdu_init = GET_TSDU_SIZE (sb -> sb_tsdu_them);
        !           388:     }
        !           389: 
        !           390:     s -> s_mask |= SMASK_CN_REQ;
        !           391:     if ((s -> s_cn_require = sb -> sb_requirements) & SR_TOKENS) {
        !           392:        s -> s_mask |= SMASK_CN_SET;
        !           393:        s -> s_settings = settings;
        !           394:     }
        !           395:     if (please) {
        !           396:        s -> s_mask |= SMASK_AC_TOKEN;
        !           397:        s -> s_ac_token = please;
        !           398:     }
        !           399:     if (responding) {
        !           400:        s -> s_mask |= SMASK_CN_CALLED;
        !           401:        bcopy (sb -> sb_responding.sa_selector, s -> s_called,
        !           402:                s -> s_calledlen = sb -> sb_responding.sa_selectlen);
        !           403:     }
        !           404: 
        !           405:     if (cc > 0) {
        !           406:        s -> s_mask |= SMASK_UDATA_PGI;
        !           407:        s -> s_udata = data, s -> s_ulen = cc;
        !           408:     }
        !           409:     else
        !           410:        s -> s_udata = NULL, s -> s_ulen = 0;
        !           411:     if ((result = spkt2sd (s, sb -> sb_fd, 0, si)) == NOTOK)
        !           412:        freesblk (sb);
        !           413:     else
        !           414:        sb -> sb_flags |= SB_CONN;
        !           415:     s -> s_mask &= ~SMASK_UDATA_PGI;
        !           416:     s -> s_udata = NULL, s -> s_ulen = 0;
        !           417: 
        !           418:     freespkt(s);
        !           419:     
        !           420:     return result;
        !           421:     
        !           422: out2: ;
        !           423:     freespkt (s);
        !           424: out1: ;
        !           425:     freesblk (sb);
        !           426: 
        !           427:     return NOTOK;
        !           428: }
        !           429: 
        !           430: #undef dotoken
        !           431: 
        !           432: /*  */
        !           433: 
        !           434: static int  refuse (sb, s, si)
        !           435: register struct ssapblk *sb;
        !           436: register struct ssapkt *s;
        !           437: register struct SSAPindication *si;
        !           438: {
        !           439:     int     result;
        !           440:     struct TSAPdata txs;
        !           441:     register struct TSAPdata   *tx = &txs;
        !           442:     struct TSAPdisconnect   tds;
        !           443:     register struct TSAPdisconnect *td = &tds;
        !           444: 
        !           445:     s -> s_mask |= SMASK_RF_DISC;
        !           446:     s -> s_rf_disconnect |= RF_DISC_RELEASE;
        !           447: 
        !           448:     result = spkt2sd (s, sb -> sb_fd, sb -> sb_flags & SB_EXPD ? 1 : 0, si);
        !           449: 
        !           450:     freespkt (s);
        !           451:     if (result == NOTOK)
        !           452:        return NOTOK;
        !           453: 
        !           454:     switch (TReadRequest (sb -> sb_fd, tx, RF_TIM, td)) {
        !           455:        case OK: 
        !           456:        default:                /* what could this be? */
        !           457:            TXFREE (tx);
        !           458:            break;
        !           459: 
        !           460:        case NOTOK: 
        !           461:            sb -> sb_fd = NOTOK;
        !           462:            break;
        !           463:     }
        !           464: 
        !           465:     return OK;
        !           466: }

unix.superglobalmegacorp.com

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