Annotation of XNU/bsd/netat/adsp_Open.c, revision 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: /* adspOpen.c v01.20
        !            23:  *
        !            24:  * From v01.20 08/23/90 Mike Shoemaker for MacOS
        !            25:  *    Modified for MP, 1996 by Tuyen Nguyen
        !            26:  *   Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
        !            27:  */
        !            28: 
        !            29: #include <sys/errno.h>
        !            30: #include <sys/types.h>
        !            31: #include <sys/param.h>
        !            32: #include <machine/spl.h>
        !            33: #include <sys/systm.h>
        !            34: #include <sys/kernel.h>
        !            35: #include <sys/proc.h>
        !            36: #include <sys/filedesc.h>
        !            37: #include <sys/fcntl.h>
        !            38: #include <sys/mbuf.h>
        !            39: #include <sys/socket.h>
        !            40: #include <sys/socketvar.h>
        !            41: #include <sys/time.h>
        !            42: 
        !            43: #include <netat/sysglue.h>
        !            44: #include <netat/appletalk.h>
        !            45: #include <netat/at_pcb.h>
        !            46: #include <netat/debug.h>
        !            47: #include <netat/adsp.h>
        !            48: #include <netat/adsp_internal.h>
        !            49: 
        !            50: extern atlock_t adspgen_lock;
        !            51: 
        !            52: /*
        !            53:  * NextCID
        !            54:  * 
        !            55:  * Create a unique connection ID.
        !            56:  *
        !            57:  * INPUTS:
        !            58:  *             none
        !            59:  * OUTPUTS:
        !            60:  *             unique connection ID
        !            61:  */
        !            62: unsigned short NextCID()
        !            63: {
        !            64:        int s;
        !            65:        unsigned short num;
        !            66:        register CCB *queue;
        !            67: 
        !            68:        while (1) {
        !            69:            ATDISABLE(s, adspgen_lock);         /* Disable interrupts */
        !            70:            num = ++adspGlobal.lastCID;
        !            71:            /* qfind_w below is in 68K assembly */
        !            72:            /* point to the first element */
        !            73:            queue = (CCB *)AT_ADSP_STREAMS;
        !            74:            while (queue) {
        !            75:                    /* and scan .. */
        !            76:                    if (queue->locCID == num)
        !            77:                        break;
        !            78:                    queue = queue->ccbLink;
        !            79:            }
        !            80:            ATENABLE(s, adspgen_lock);
        !            81:            if (queue == (CCBPtr)NULL)
        !            82:                break;  
        !            83:        }
        !            84:        return num;
        !            85: }
        !            86: 
        !            87: static byte xlateStateTbl[4] = /* The value to be given to the CCB's state. */
        !            88: {                              /* indexed by ocMode */
        !            89:        sOpening,               /* ocRequest */
        !            90:        sPassive,               /* ocPassive */
        !            91:        sOpening,               /* ocAccept */
        !            92:        sOpen                   /* ocEstablish */
        !            93: };
        !            94: static byte xlateOpenTbl[4] =  /* Value to use for open state. */
        !            95: {                              /* indexed by ocMode */
        !            96:        O_STATE_OPENWAIT,       /* ocRequest */
        !            97:        O_STATE_LISTEN,         /* ocPassive */
        !            98:        O_STATE_ESTABLISHED,    /* ocAccept */
        !            99:        O_STATE_OPEN            /* ocEstablish */
        !           100: };
        !           101: 
        !           102: /*
        !           103:  * adspOpen
        !           104:  * 
        !           105:  * INPUTS:
        !           106:  *     -->     ccbRefNum       refnum of connection end
        !           107:  *     -->     remoteCID       connection id of remote connection end
        !           108:  *     -->     remoteAddress   internet address of remote connection end
        !           109:  *     -->     filterAddress   filter for incoming open connection requests
        !           110:  *     -->     sendSeq         initial send sequence number to use
        !           111:  *     -->     sendWindow      initial size of remote end's receive buffer
        !           112:  *     -->     recvSeq         initial receive sequence number to use
        !           113:  *     -->     attnSendSeq     initial attention send sequence number
        !           114:  *     -->     attnRecvSeq     initial receive sequence number
        !           115:  *     -->     ocMode          connection opening mode
        !           116:  *     -->     ocMaximum       maximum retries of open connection request
        !           117:  *
        !           118:  * OUTPUTS:
        !           119:  *     <--     localCID        connection identifier of this connection end
        !           120:  *     <--     remoteCID       connection id of remote connection end
        !           121:  *     <--     remoteAddress
        !           122:  *     <--     sendSeq
        !           123:  *     <--     sendWindow
        !           124:  *     <--     attnSendSeq
        !           125:  *
        !           126:  * ERRORS:
        !           127:  *             errRefNum       bad connection refnum
        !           128:  *             errState        connection end must be closed
        !           129:  *             errOpening      open connection attempt failed
        !           130:  *             errAborted      request aborted by a remove or close call
        !           131:  */
        !           132: int adspOpen(sp, pb)           /* (DSPPBPtr pb) */
        !           133:     register CCBPtr sp;
        !           134:     register struct adspcmd *pb;
        !           135: {
        !           136:     extern int adsp_pidM[];
        !           137: 
        !           138:     int ocMode;
        !           139:     register gbuf_t *mp;
        !           140: 
        !           141:     if (sp == 0) {
        !           142:        pb->ioResult = errRefNum; /* Unknown refnum */
        !           143:        return EINVAL;
        !           144:     }
        !           145:        
        !           146:     if ((sp->state != sClosed) || 
        !           147:        (sp->removing)) { /* The CCB must be closed */
        !           148:        pb->ioResult = errState;
        !           149:        return EALREADY;
        !           150:     }
        !           151: 
        !           152:     ocMode = pb->u.openParams.ocMode; /* get a local copy of open mode */
        !           153:        if (ocMode == ocRequest)
        !           154:                adsp_pidM[pb->socket] = 0;
        !           155:        
        !           156:     /*
        !           157:      * Save parameters.  Fill in defaults if zero
        !           158:      */
        !           159:     if (pb->u.openParams.ocInterval)
        !           160:        sp->openInterval = pb->u.openParams.ocInterval;
        !           161:     else
        !           162:        sp->openInterval = ocIntervalDefault;
        !           163:     
        !           164:     if (pb->u.openParams.ocMaximum)
        !           165:        sp->openRetrys = pb->u.openParams.ocMaximum;
        !           166:     else
        !           167:        sp->openRetrys = ocMaximumDefault;
        !           168:     
        !           169:     sp->remoteAddress = *((AddrUnionPtr)&pb->u.openParams.remoteAddress);
        !           170:     /* Not used for passive */
        !           171:     /*
        !           172:      * Clear out send/receive buffers.
        !           173:      */
        !           174:     if (sp->sbuf_mb) { /* clear the send queue */
        !           175:        gbuf_freel(sp->sbuf_mb);
        !           176:        sp->sbuf_mb = 0;
        !           177:     }
        !           178:     if (sp->csbuf_mb) {
        !           179:        gbuf_freem(sp->csbuf_mb);
        !           180:        sp->csbuf_mb = 0;
        !           181:     }
        !           182:     if (sp->rbuf_mb) { /* clear the receive queue */
        !           183:        gbuf_freel(sp->rbuf_mb);
        !           184:        sp->rbuf_mb = 0;
        !           185:     }
        !           186:     if (sp->crbuf_mb) {
        !           187:        gbuf_freem(sp->crbuf_mb);
        !           188:        sp->crbuf_mb = 0;
        !           189:     }
        !           190: 
        !           191:     sp->rData = 0;             /* Flag both buffers as empty */
        !           192:     sp->sData = 0;
        !           193:     sp->recvQPending = 0;      /* No bytes in receive queue */
        !           194:     
        !           195:     /*
        !           196:      * Clear all of those pesky flags
        !           197:      */
        !           198:     sp->userFlags = 0;
        !           199:     sp->sendDataAck = 0;
        !           200:     sp->sendAttnAck = 0;
        !           201:     sp->sendAttnData = 0;
        !           202:     sp->callSend = 0;
        !           203:     sp->removing = 0;
        !           204:     sp->writeFlush = 0;
        !           205:        
        !           206:     /*
        !           207:      * Reset round-trip timers
        !           208:      */
        !           209:     sp->roundTrip = sp->rtmtInterval;
        !           210:     sp->deviation = 0;
        !           211:     
        !           212:     /*
        !           213:      * Reset stuff for retransmit advice packet
        !           214:      */
        !           215:     sp->badSeqCnt = 0;
        !           216:     /*
        !           217:      * Reset flow control variables
        !           218:      */
        !           219:     sp->pktSendMax = 1;        /* Slow start says we should set this to 1 */
        !           220:     sp->pktSendCnt = 0;
        !           221:     sp->rbufFull = 0;
        !           222:     sp->resentData = 0;
        !           223:     sp->noXmitFlow = 0;
        !           224:     sp->waitingAck = 0;
        !           225:     
        !           226:     /*
        !           227:      * Copy required information out of parameter block
        !           228:      */
        !           229:     if (ocMode == ocAccept || ocMode == ocEstablish) {
        !           230:        sp->remCID = pb->u.openParams.remoteCID;
        !           231:        sp->sendSeq = sp->firstRtmtSeq = pb->u.openParams.sendSeq;
        !           232:        sp->sendWdwSeq = sp->sendSeq + pb->u.openParams.sendWindow;
        !           233:        sp->attnSendSeq = pb->u.openParams.attnSendSeq;
        !           234:     } else {                   /* accept or establish */
        !           235:        sp->remCID = 0;
        !           236:        sp->sendSeq = 0;
        !           237:        sp->sendWdwSeq = 0;
        !           238:        sp->attnSendSeq = 0;
        !           239:     }
        !           240:        
        !           241:     if (ocMode == ocEstablish) { /* Only set these if establish mode */
        !           242:        sp->recvSeq = pb->u.openParams.recvSeq;
        !           243:        sp->attnRecvSeq = pb->u.openParams.attnRecvSeq;
        !           244:        UAS_ASSIGN(sp->f.CID, sp->locCID); /* Preset the CID in the ADSP header */
        !           245:        /* This is done elsewhere for all other modes */
        !           246:        InsertTimerElem(&adspGlobal.slowTimers, &sp->ProbeTimer, 
        !           247:                        sp->probeInterval);
        !           248:     } else {                   /* establish */
        !           249:        /* All other modes need a CID assigned */
        !           250:        sp->locCID = NextCID();
        !           251:        sp->recvSeq = 0;
        !           252:        sp->attnRecvSeq = 0;
        !           253:     }
        !           254: 
        !           255:     /*
        !           256:      * Now set the state variables for this CCB.  
        !           257:      */
        !           258: 
        !           259:     sp->openState = xlateOpenTbl[ocMode-ocRequest];
        !           260:     sp->state = xlateStateTbl[ocMode-ocRequest];
        !           261:        
        !           262:     if (ocMode == ocEstablish) { /* For establish call, we're done */
        !           263:        pb->ioResult = 0;
        !           264:        adspioc_ack(0, pb->ioc, pb->gref);
        !           265:        return 0;
        !           266:     }
        !           267:     
        !           268:     pb->qLink = 0;             /* Clear link field before putting on queue */
        !           269:     mp = gbuf_copym(pb->mp);   /* Save parameter block to match later */
        !           270:     
        !           271:     if (mp == 0) {
        !           272:            pb->ioResult = errDSPQueueSize;
        !           273:            return ENOBUFS;
        !           274:     }
        !           275:     pb->ioResult = 1;  /* not open -> not done */
        !           276:     adspioc_ack(0, pb->ioc, pb->gref); /* release user */
        !           277:     sp->opb = (struct adspcmd *)gbuf_rptr(mp);
        !           278:     sp->opb->ioc = 0;          /* unlink saved pb from ioctl block */
        !           279:     sp->opb->mp = mp;
        !           280: 
        !           281:     /*
        !           282:      * For request & accept, need to send a packet
        !           283:      */
        !           284:     if ((ocMode == ocRequest) || (ocMode == ocAccept)) {
        !           285:        sp->sendCtl |= (1 << (ocMode == ocRequest ? 
        !           286:                              ADSP_CTL_OREQ : ADSP_CTL_OREQACK));
        !           287:        CheckSend(sp);
        !           288:     }
        !           289:     return 0;
        !           290: }
        !           291: 
        !           292: int adspMode(pb)
        !           293:     register struct adspcmd *pb;
        !           294: {
        !           295:     return pb->u.openParams.ocMode;
        !           296: }

unix.superglobalmegacorp.com

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