Annotation of kernel/bsd/netat/adsp_RxAttn.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: 
        !            25: 
        !            26: #include <adsp_local.h>
        !            27: 
        !            28: /*
        !            29:  * Used to search down queue of sessions for a session that matches
        !            30:  * sender and source connection ID
        !            31: */
        !            32: typedef struct
        !            33: {
        !            34:        AddrUnion   addr;
        !            35:        word        srcCID;
        !            36: } MATCH_SENDER, *MATCH_SENDERPtr;
        !            37: 
        !            38: /*
        !            39:  * MatchSender
        !            40:  *
        !            41:  */
        !            42: 
        !            43: static boolean MatchSender(sp, m) /* (CCBPtr sp, MATCH_SENDERPtr m) */
        !            44:     CCBPtr sp;
        !            45:     MATCH_SENDERPtr m;
        !            46: {
        !            47: 
        !            48:     if (sp->state != sOpen && sp->state != sClosing)
        !            49:        return 0;
        !            50: 
        !            51:     if (sp->remCID != m->srcCID)
        !            52:        return 0;
        !            53: 
        !            54:     if (sp->remoteAddress.a.node != m->addr.a.node)
        !            55:        return 0;
        !            56:     if (sp->remoteAddress.a.socket != m->addr.a.socket)
        !            57:        return 0;
        !            58:     if ((NET_VALUE(sp->remoteAddress.a.net) && NET_VALUE(m->addr.a.net)) &&
        !            59:        (NET_VALUE(sp->remoteAddress.a.net) != NET_VALUE(m->addr.a.net)))
        !            60:        return 0;
        !            61: 
        !            62:     return 1;
        !            63: }
        !            64: 
        !            65: 
        !            66: /*
        !            67:  * FindSender
        !            68:  *
        !            69:  * Given an ADSP Packet, find the stream it is associated with.
        !            70:  *
        !            71:  * This should only be used for ADSP Packets that could be received
        !            72:  * by an OPEN connection.
        !            73:  *
        !            74:  * INPUTS:
        !            75:  *    Pointer to ADSP header & address of sender
        !            76:  * OUTPUTS:
        !            77:  *    Pointer to stream if found, else 0
        !            78:  */
        !            79: CCBPtr FindSender(f, a)                /* (ADSP_FRAMEPtr f, AddrUnion a) */
        !            80:     ADSP_FRAMEPtr f;
        !            81:     AddrUnion a;
        !            82: {
        !            83:     MATCH_SENDER m;
        !            84: 
        !            85:     m.addr = a;
        !            86:     m.srcCID = UAS_VALUE(f->CID);
        !            87:     return (CCBPtr)qfind_m(AT_ADSP_STREAMS, &m, (ProcPtr)MatchSender);
        !            88: }
        !            89: 
        !            90: /*
        !            91:  * RXAttention
        !            92:  *
        !            93:  * We just got an Attention Packet.
        !            94:  * See if it came from anybody we know.
        !            95:  * Then check to see if it is an attention data packet or acknowledgement
        !            96:  *
        !            97:  * Interrupts are masked OFF at this point.
        !            98:  *
        !            99:  * INPUTS:
        !           100:  *    stream pointer
        !           101:  *    Pointer to ADSP header,
        !           102:  *    Length of header plus data
        !           103:  * OUTPUTS:
        !           104:  *    Returns 1 if packet was ignored
        !           105:  */
        !           106: int RXAttention(sp, mp, f, len)        /* (CCBPtr sp, ADSP_FRAMEPtr f, word len) */
        !           107:     CCBPtr sp;
        !           108:     gbuf_t *mp;
        !           109:     ADSP_FRAMEPtr f;
        !           110:     int len;
        !           111: {
        !           112:     int offset;
        !           113:     struct adspcmd *pb;
        !           114:     long diff;
        !           115: 
        !           116:     if (UAS_VALUE(f->pktRecvWdw))              /* This field must be 0 in attn pkts */
        !           117:        return 1;
        !           118: 
        !           119:     if ((f->descriptor == 
        !           120:         (char)(ADSP_ATTENTION_BIT | ADSP_ACK_REQ_BIT)) && /* Attention Data */
        !           121:        ((sp->userFlags & eAttention) == 0)) /* & he read the previous */
        !           122:     {
        !           123:        diff = netdw(UAL_VALUE(f->pktFirstByteSeq)) - sp->attnRecvSeq;
        !           124:        if (diff > 0)           /* Hey, he missed one */
        !           125:            return 1;
        !           126: 
        !           127:        if (diff == 0)          /* This is the one we expected */
        !           128:        {
        !           129:            len -= ADSP_FRAME_LEN; /* remove adsp header */
        !           130:            if (len < 2)        /* Poorly formed attn packet */
        !           131:                return 1;
        !           132:            sp->attnCode = (f->data[0] << 8) + f->data[1]; /* Save attn code */
        !           133:            sp->attn_mb = mp;
        !           134:            offset = ((unsigned char *)&f->data[2]) - (unsigned char *)gbuf_rptr(mp);
        !           135:            gbuf_rinc(mp,offset);
        !           136:            sp->attnPtr = (unsigned char *)gbuf_rptr(mp);
        !           137:            mp = 0;             /* mp has been queued don't free it */
        !           138: 
        !           139:            /* Interrupts are off here, or otherwise we have to do 
        !           140:             * these three operations automically.
        !           141:             */
        !           142:            sp->attnSize = len - 2; /* Tell user how many bytes */
        !           143:            ++sp->attnRecvSeq;
        !           144:            /* Set flag saying we got attn message */
        !           145:            sp->userFlags |= eAttention;
        !           146:            UrgentUser(sp);     /* Notify user */
        !           147:                                /* BEFORE sending acknowledge */
        !           148:        }                       /* in sequence */
        !           149: 
        !           150:        sp->sendAttnAck = 1;    /* send attention ack for dupl. & 
        !           151:                                 * expected data */
        !           152:        sp->callSend = 1;
        !           153:     }                          /* Attn Data */
        !           154: 
        !           155:     /*
        !           156:      * Interrupts are OFF here, otherwise we have to do this atomically
        !           157:      */
        !           158:     /* Check to see if this acknowledges anything */
        !           159:     if ((sp->attnSendSeq + 1) == netdw(UAL_VALUE(f->pktNextRecvSeq))) {
        !           160:        sp->attnSendSeq++;
        !           161:        if ((pb = sp->sapb) == 0) { /* We never sent data ? !!! */
        !           162:            if (mp)
        !           163:                gbuf_freem(mp);
        !           164:            return 0;
        !           165:        }
        !           166:                
        !           167:        sp->sapb = (struct adspcmd *)pb->qLink; /* Unlink from queue */
        !           168:                
        !           169:        /* Remove timer */
        !           170:        RemoveTimerElem(&adspGlobal.fastTimers, &sp->AttnTimer); 
        !           171:        
        !           172:        pb->ioResult = 0;
        !           173:        if (gbuf_cont(pb->mp)) {
        !           174:            gbuf_freem(gbuf_cont(pb->mp)); /* free the data */
        !           175:            gbuf_cont(pb->mp) = 0;
        !           176:        }
        !           177:        completepb(sp, pb);     /* Done with the send attention */
        !           178:                
        !           179:        if (sp->sapb) {         /* Another send attention pending? */
        !           180:            sp->sendAttnData = 1;
        !           181:            sp->callSend = 1;
        !           182:        } else {
        !           183:            if (sp->state == sClosing) /* this ack may allow us to close... */
        !           184:                CheckOkToClose(sp);
        !           185:        }
        !           186:     }
        !           187:     if (mp)
        !           188:        gbuf_freem(mp);
        !           189:     return 0;
        !           190: }

unix.superglobalmegacorp.com

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