X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/de355530ae67247cbd0da700edb3a2a1dae884c2..0c530ab8987f0ae6a1a3d9284f40182b88852816:/bsd/netat/adsp.c diff --git a/bsd/netat/adsp.c b/bsd/netat/adsp.c index 02d01c963..1b88d6750 100644 --- a/bsd/netat/adsp.c +++ b/bsd/netat/adsp.c @@ -50,7 +50,6 @@ struct adsp_debug adsp_dtable[1025]; int ad_entry = 0; #endif -extern atlock_t adspgen_lock; adspAllocateCCB(gref) register gref_t *gref; /* READ queue */ @@ -69,9 +68,6 @@ adspAllocateCCB(gref) sp->pid = gref->pid; /* save the caller process pointer */ sp->gref = gref; /* save a back pointer to the WRITE queue */ sp->sp_mp = ccb_mp; /* and its message block */ - ATLOCKINIT(sp->lock); - ATLOCKINIT(sp->lockClose); - ATLOCKINIT(sp->lockRemove); return 1; } @@ -79,19 +75,14 @@ adspRelease(gref) register gref_t *gref; /* READ queue */ { register CCBPtr sp; - int s, l; - ATDISABLE(l, adspgen_lock); if (gref->info) { sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info)); - ATDISABLE(s, sp->lock); - ATENABLE(s, adspgen_lock); /* Tells completion routine of close */ /* packet to remove us. */ if (sp->state == sPassive || sp->state == sClosed || sp->state == sOpening || sp->state == sListening) { - ATENABLE(l, sp->lock); if (sp->state == sListening) CompleteQueue(&sp->opb, errAborted); sp->removing = 1; /* Prevent allowing another dspClose. */ @@ -100,7 +91,6 @@ adspRelease(gref) } else { /* sClosing & sOpen */ sp->state = sClosing; } - ATENABLE(l, sp->lock); if (CheckOkToClose(sp)) { /* going to close */ sp->sendCtl = B_CTL_CLOSE; /* Send close advice */ @@ -110,13 +100,10 @@ adspRelease(gref) sp->sendCtl = B_CTL_CLOSE; /* Setup to send close advice */ } CheckSend(sp); /* and force out the close */ - ATDISABLE(s, sp->lock); sp->removing = 1; /* Prevent allowing another dspClose. */ sp->state = sClosed; - ATENABLE(s, sp->lock); DoClose(sp, errAborted, 0); /* to closed and remove CCB */ - } else - ATENABLE(l, adspgen_lock); + } } @@ -133,150 +120,151 @@ adspWriteHandler(gref, mp) void *sp; switch(gbuf_type(mp)) { - case MSG_DATA: - if (gref->info == 0) { - gbuf_freem(mp); - return(STR_IGNORE); - } - /* - * Fill in the global stuff - */ - ap = (struct adspcmd *)gbuf_rptr(mp); - ap->gref = gref; - ap->ioc = 0; - ap->mp = mp; - sp = (void *)gbuf_rptr(((gbuf_t *)gref->info)); - switch(ap->csCode) { - case dspWrite: - if ((error = adspWrite(sp, ap))) - gbuf_freem(mp); - return(STR_IGNORE); - case dspAttention: - if ((error = adspAttention(sp, ap))) - gbuf_freem(mp); - return(STR_IGNORE); - } - case MSG_IOCTL: - if (gref->info == 0) { - adspioc_ack(EPROTO, mp, gref); - return(STR_IGNORE); - } - iocbp = (ioc_t *) gbuf_rptr(mp); - if (ADSP_IOCTL(iocbp->ioc_cmd)) { - iocbp->ioc_count = sizeof(*ap) - 1; - if (gbuf_cont(mp) == 0) { - adspioc_ack(EINVAL, mp, gref); - return(STR_IGNORE); - } - ap = (struct adspcmd *) gbuf_rptr(gbuf_cont(mp)); - ap->gref = gref; - ap->ioc = (caddr_t) mp; - ap->mp = gbuf_cont(mp); /* request head */ - ap->ioResult = 0; - - if ((gref->info == 0) && ((iocbp->ioc_cmd != ADSPOPEN) && - (iocbp->ioc_cmd != ADSPCLLISTEN))) { - ap->ioResult = errState; - - adspioc_ack(EINVAL, mp, gref); - return(STR_IGNORE); - } - } - sp = (void *)gbuf_rptr(((gbuf_t *)gref->info)); - switch(iocbp->ioc_cmd) { - case ADSPOPEN: - case ADSPCLLISTEN: - ap->socket = ((CCBPtr)sp)->localSocket; - flag = (adspMode(ap) == ocAccept) ? 1 : 0; - if (flag && ap->socket) { - if (adspDeassignSocket((CCBPtr)sp) >= 0) - ap->socket = 0; - } - if ((ap->socket == 0) && - ((ap->socket = - (at_socket)adspAssignSocket(gref, flag)) == 0)) { - adspioc_ack(EADDRNOTAVAIL, mp, gref); - return(STR_IGNORE); - } - ap->csCode = iocbp->ioc_cmd == ADSPOPEN ? dspInit : dspCLInit; - if ((error = adspInit(sp, ap)) == 0) { + case MSG_DATA: + if (gref->info == 0) { + gbuf_freem(mp); + return(STR_IGNORE); + } + /* + * Fill in the global stuff + */ + ap = (struct adspcmd *)gbuf_rptr(mp); + ap->gref = gref; + ap->ioc = 0; + ap->mp = mp; + sp = (void *)gbuf_rptr(((gbuf_t *)gref->info)); switch(ap->csCode) { - case dspInit: - /* and open the connection */ - ap->csCode = dspOpen; - error = adspOpen(sp, ap); - break; - case dspCLInit: - /* ADSPCLLISTEN */ - ap->csCode = dspCLListen; - error = adspCLListen(sp, ap); - break; + case dspWrite: + if ((error = adspWrite(sp, ap))) + gbuf_freem(mp); + return(STR_IGNORE); + case dspAttention: + if ((error = adspAttention(sp, ap))) + gbuf_freem(mp); + return(STR_IGNORE); } - } - if (error) - adspioc_ack(error, mp, gref); /* if this failed req complete */ - return(STR_IGNORE); - case ADSPCLOSE: - ap->csCode = dspClose; - if ((error = adspClose(sp, ap))) { - adspioc_ack(error, mp, gref); - break; - } - break; - case ADSPCLREMOVE: - ap->csCode = dspCLRemove; - error = adspClose(sp, ap); - adspioc_ack(error, mp, gref); - return(STR_IGNORE); - case ADSPCLDENY: - ap->csCode = dspCLDeny; - if ((error = adspCLDeny(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - case ADSPSTATUS: - ap->csCode = dspStatus; - if ((error = adspStatus(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - case ADSPREAD: - ap->csCode = dspRead; - if ((error = adspRead(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - case ADSPATTENTION: - ap->csCode = dspAttention; - if ((error = adspReadAttention(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - case ADSPOPTIONS: - ap->csCode = dspOptions; - if ((error = adspOptions(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - case ADSPRESET: - ap->csCode = dspReset; - if ((error = adspReset(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - case ADSPNEWCID: - ap->csCode = dspNewCID; - if ((error = adspNewCID(sp, ap))) { - adspioc_ack(error, mp, gref); - } - return(STR_IGNORE); - default: - return(STR_PUTNEXT); /* pass it on down */ - } - return(STR_IGNORE); - case MSG_PROTO: - default: - gbuf_freem(mp); + case MSG_IOCTL: + if (gref->info == 0) { + adspioc_ack(EPROTOTYPE, mp, gref); + return(STR_IGNORE); + } + iocbp = (ioc_t *) gbuf_rptr(mp); + if (ADSP_IOCTL(iocbp->ioc_cmd)) { + iocbp->ioc_count = sizeof(*ap) - 1; + if (gbuf_cont(mp) == 0) { + adspioc_ack(EINVAL, mp, gref); + return(STR_IGNORE); + } + ap = (struct adspcmd *) gbuf_rptr(gbuf_cont(mp)); + ap->gref = gref; + ap->ioc = (caddr_t) mp; + ap->mp = gbuf_cont(mp); /* request head */ + ap->ioResult = 0; + + if ((gref->info == 0) && ((iocbp->ioc_cmd != ADSPOPEN) && + (iocbp->ioc_cmd != ADSPCLLISTEN))) { + ap->ioResult = errState; + + adspioc_ack(EINVAL, mp, gref); + return(STR_IGNORE); + } + } else + return(STR_PUTNEXT); /* pass it on down */ + sp = (void *)gbuf_rptr(((gbuf_t *)gref->info)); + switch(iocbp->ioc_cmd) { + case ADSPOPEN: + case ADSPCLLISTEN: + ap->socket = ((CCBPtr)sp)->localSocket; + flag = (adspMode(ap) == ocAccept) ? 1 : 0; + if (flag && ap->socket) { + if (adspDeassignSocket((CCBPtr)sp) >= 0) + ap->socket = 0; + } + if ((ap->socket == 0) && + ((ap->socket = + (at_socket)adspAssignSocket(gref, flag)) == 0)) { + adspioc_ack(EADDRNOTAVAIL, mp, gref); + return(STR_IGNORE); + } + ap->csCode = iocbp->ioc_cmd == ADSPOPEN ? dspInit : dspCLInit; + if ((error = adspInit(sp, ap)) == 0) { + switch(ap->csCode) { + case dspInit: + /* and open the connection */ + ap->csCode = dspOpen; + error = adspOpen(sp, ap); + break; + case dspCLInit: + /* ADSPCLLISTEN */ + ap->csCode = dspCLListen; + error = adspCLListen(sp, ap); + break; + } + } + if (error) + adspioc_ack(error, mp, gref); /* if this failed req complete */ + return(STR_IGNORE); + case ADSPCLOSE: + ap->csCode = dspClose; + if ((error = adspClose(sp, ap))) { + adspioc_ack(error, mp, gref); + break; + } + break; + case ADSPCLREMOVE: + ap->csCode = dspCLRemove; + error = adspClose(sp, ap); + adspioc_ack(error, mp, gref); + return(STR_IGNORE); + case ADSPCLDENY: + ap->csCode = dspCLDeny; + if ((error = adspCLDeny(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + case ADSPSTATUS: + ap->csCode = dspStatus; + if ((error = adspStatus(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + case ADSPREAD: + ap->csCode = dspRead; + if ((error = adspRead(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + case ADSPATTENTION: + ap->csCode = dspAttention; + if ((error = adspReadAttention(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + case ADSPOPTIONS: + ap->csCode = dspOptions; + if ((error = adspOptions(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + case ADSPRESET: + ap->csCode = dspReset; + if ((error = adspReset(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + case ADSPNEWCID: + ap->csCode = dspNewCID; + if ((error = adspNewCID(sp, ap))) { + adspioc_ack(error, mp, gref); + } + return(STR_IGNORE); + default: + return(STR_PUTNEXT); /* pass it on down */ + } + return(STR_IGNORE); + case MSG_PROTO: + default: + gbuf_freem(mp); } } @@ -358,11 +346,11 @@ adsp_sendddp(sp, mp, length, dstnetaddr, ddptype) /* Set up the DDP header */ ddp = (DDPX_FRAME *) gbuf_rptr(mp); - UAS_ASSIGN(ddp->ddpx_length, (length + DDPL_FRAME_LEN)); + UAS_ASSIGN_HTON(ddp->ddpx_length, (length + DDPL_FRAME_LEN)); UAS_ASSIGN(ddp->ddpx_cksm, 0); if (sp) { if (sp->useCheckSum) - UAS_ASSIGN(ddp->ddpx_cksm, 1); + UAS_ASSIGN_HTON(ddp->ddpx_cksm, 1); } NET_ASSIGN(ddp->ddpx_dnet, dstnetaddr->a.net);