]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netat/atp_write.c
xnu-1456.1.26.tar.gz
[apple/xnu.git] / bsd / netat / atp_write.c
index d84ecb6ff7c291e666e7728af8789220c3d605ab..a46fa471f268d7212e4b0708441acb6a5f40b2d0 100644 (file)
@@ -1,27 +1,29 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1996-2007 Apple Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
- */
-/*
- *     Copyright (c) 1996-1998 Apple Computer, Inc.
- *     All Rights Reserved.
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 
 /*    Modified for MP, 1996 by Tuyen Nguyen
@@ -44,6 +46,7 @@
 #include <sys/malloc.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
+#include <sys/file.h>
 
 #include <net/if.h>
 
 #include <netat/at_pat.h>
 #include <netat/debug.h>
 
-static int loop_cnt; /* for debugging loops */
-#define CHK_LOOP(str) { \
-  if (loop_cnt++ > 100) { \
-     kprintf("%s", str); \
-     break; \
-  } \
-}
+
+int asp_pack_bdsp(struct atp_trans *, gbuf_t **);
 
 static int atp_pack_bdsp(struct atp_trans *, struct atpBDS *);
 static int atp_unpack_bdsp(struct atp_state *, gbuf_t *, struct atp_rcb *, 
                           int, int);
-void atp_trp_clock(), asp_clock(), asp_clock_locked(), atp_trp_clock_locked();;
+void atp_trp_clock(void *arg), atp_trp_clock_locked(void *arg);
 
 extern struct atp_rcb_qhead atp_need_rel;
 extern int atp_inited;
 extern struct atp_state *atp_used_list;
 extern asp_scb_t *scb_free_list;
-extern atlock_t atpgen_lock;
-extern atlock_t atpall_lock;
-extern atlock_t atptmo_lock;
 
 extern gbuf_t *scb_resource_m;
 extern gbuf_t *atp_resource_m;
@@ -95,7 +90,7 @@ struct atp_trans *trp_tmo_rcb;
 
 #define atpBDSsize (sizeof(struct atpBDS)*ATP_TRESP_MAX)
 
-void atp_link()
+void atp_link(void)
 {
        trp_tmo_list = 0;
        trp_tmo_rcb = atp_trans_alloc(0);
@@ -139,7 +134,7 @@ atp_wput(gref, m)
        register gbuf_t *m;
 {
        register ioc_t    *iocbp;
-       int i, xcnt, s;
+       int i, xcnt;
        struct atp_state *atp;
        struct atp_trans *trp;
        struct atp_rcb   *rcbp;
@@ -200,7 +195,6 @@ atp_wput(gref, m)
                case AT_ATP_ISSUE_REQUEST_DEF:
                case AT_ATP_ISSUE_REQUEST_DEF_NOTE: {
                        gbuf_t *bds, *tmp, *m2;
-                       struct atp_rcb *rcbp;
                        at_ddp_t *ddp;
                        at_atp_t *athp;
 
@@ -237,18 +231,16 @@ atp_wput(gref, m)
                                atp->atp_msgq = 0;
                        }
 
-                       ATDISABLE(s, atp->atp_lock);
                        /*
                         *      search for the corresponding rcb
                         */
                        for (rcbp = atp->atp_rcb.head; rcbp; rcbp = rcbp->rc_list.next) {
-                           if (rcbp->rc_tid == UAS_VALUE(athp->tid) &&
+                           if (rcbp->rc_tid == UAS_VALUE_NTOH(athp->tid) &&
                                rcbp->rc_socket.node == ddp->dst_node &&
                                rcbp->rc_socket.net == NET_VALUE(ddp->dst_net) &&
                                rcbp->rc_socket.socket == ddp->dst_socket)
                                break;
                        }
-                       ATENABLE(s, atp->atp_lock);
 
                        /*
                         *      If it has already been sent then return an error
@@ -269,13 +261,11 @@ atp_wput(gref, m)
                            rcbp->rc_socket.socket = ddp->dst_socket;
                            rcbp->rc_socket.node = ddp->dst_node;
                            rcbp->rc_socket.net = NET_VALUE(ddp->dst_net);
-                           rcbp->rc_tid = UAS_VALUE(athp->tid);
+                           rcbp->rc_tid = UAS_VALUE_NTOH(athp->tid);
                            rcbp->rc_bitmap = 0xff;
                            rcbp->rc_xo = 0;
-                           ATDISABLE(s, atp->atp_lock);
                            rcbp->rc_state = RCB_SENDING;
                            ATP_Q_APPEND(atp->atp_rcb, rcbp, rc_list);
-                           ATENABLE(s, atp->atp_lock);
                        }
                        xcnt = get_bds_entries(m2);
                        if ((i = atp_unpack_bdsp(atp, m2, rcbp, xcnt, FALSE))) {
@@ -303,7 +293,6 @@ atp_wput(gref, m)
                        /*
                         *      search for a waiting request
                         */
-                       ATDISABLE(s, atp->atp_lock);
                        if ((rcbp = atp->atp_attached.head)) {
                            /*
                             *  Got one, move it to the active response Q
@@ -320,13 +309,11 @@ atp_wput(gref, m)
                                 */
                                atp_rcb_free(rcbp);
                            }
-                           ATENABLE(s, atp->atp_lock);
                            atp_iocack(atp, m);
                        } else {
                                /*
                                 *      None available - can out
                                 */
-                               ATENABLE(s, atp->atp_lock);
                                atp_iocnak(atp, m, EAGAIN);
                        }
                        break;
@@ -343,16 +330,13 @@ atp_wput(gref, m)
                        i = *(int *)gbuf_rptr(gbuf_cont(m));
                        gbuf_freem(gbuf_cont(m));
                        gbuf_cont(m) = NULL;
-                       ATDISABLE(s, atp->atp_lock);
                        for (trp = atp->atp_trans_wait.head; trp; trp = trp->tr_list.next) {
                          if (trp->tr_tid == i)
                                break;
                        }
-                       if (trp == NULL) {
-                               ATENABLE(s, atp->atp_lock);
+                       if (trp == NULL)
                                atp_iocnak(atp, m, ENOENT);
-                       } else {
-                               ATENABLE(s, atp->atp_lock);
+                       else {
                                atp_free(trp);
                                atp_iocack(atp, m);
                        }
@@ -430,7 +414,7 @@ register struct atp_trans *trp;
                gbuf_wset(m,TOTAL_ATP_HDR_SIZE);
                ddp = AT_DDP_HDR(m);
                ddp->type = DDP_ATP;
-               UAS_ASSIGN(ddp->checksum, 0);
+               UAS_ASSIGN_HTON(ddp->checksum, 0);
                ddp->dst_socket = trp->tr_socket.socket;
                ddp->dst_node = trp->tr_socket.node;
                NET_ASSIGN(ddp->dst_net, trp->tr_socket.net);
@@ -443,7 +427,7 @@ register struct atp_trans *trp;
                athp = AT_ATP_HDR(m);
                ATP_CLEAR_CONTROL(athp);
                athp->cmd = ATP_CMD_TREL;
-               UAS_ASSIGN(athp->tid, trp->tr_tid);
+               UAS_ASSIGN_HTON(athp->tid, trp->tr_tid);
        }
 
        return (m);
@@ -454,13 +438,14 @@ void atp_send_replies(atp, rcbp)
      register struct atp_rcb   *rcbp;
 {       register gbuf_t *m;
        register int     i, len;
-       int              s_gen, s, cnt, err, offset, space;
-       unsigned char *m0_rptr = NULL, *m0_wptr = NULL;
+       int              cnt, offset, space;
        register at_atp_t *athp;
        register struct atpBDS *bdsp;
-       register gbuf_t *m2, *m1, *m0, *mhdr;
-       caddr_t lastPage;
-       gbuf_t *mprev, *mlist = 0;
+       register gbuf_t *m1, *m0, *mhdr;
+#if DEBUG
+       gbuf_t *m2 = NULL;
+#endif /* DEBUG */
+       gbuf_t *mprev = 0, *mlist = 0;
        at_socket src_socket = (at_socket)atp->atp_socket_no;
        gbuf_t *rc_xmt[ATP_TRESP_MAX];
        struct   ddp_atp {
@@ -468,11 +453,8 @@ void atp_send_replies(atp, rcbp)
        };
        struct timeval timenow;
 
-       ATDISABLE(s, atp->atp_lock);
-       if (rcbp->rc_queue != atp) {
-               ATENABLE(s, atp->atp_lock);
+       if (rcbp->rc_queue != atp)
                return;
-       }
        if (rcbp->rc_not_sent_bitmap == 0)
                goto nothing_to_send;
 
@@ -560,21 +542,17 @@ void atp_send_replies(atp, rcbp)
                 */
                bdsp++;
        }
-       if (mlist) {
-               ATENABLE(s, atp->atp_lock);
+       if (mlist)
                DDP_OUTPUT(mlist);
-               ATDISABLE(s, atp->atp_lock);
-       }
+       
 
 nothing_to_send:
        /*
         *      If all replies from this reply block have been sent then 
         *              remove it from the queue and mark it so
         */
-       if (rcbp->rc_queue != atp) {
-               ATENABLE(s, atp->atp_lock);
+       if (rcbp->rc_queue != atp)
                return;
-       }
        rcbp->rc_rep_waiting = 0;
 
        /*
@@ -589,7 +567,6 @@ nothing_to_send:
         */
        if (rcbp->rc_xo && rcbp->rc_state != RCB_RELEASED) {
                getmicrouptime(&timenow);
-               ATDISABLE(s_gen, atpgen_lock);
                if (rcbp->rc_timestamp == 0) {
                        rcbp->rc_timestamp = timenow.tv_sec;
                        if (rcbp->rc_timestamp == 0)
@@ -597,10 +574,8 @@ nothing_to_send:
                        ATP_Q_APPEND(atp_need_rel, rcbp, rc_tlist);
                }
                rcbp->rc_state = RCB_RESPONSE_FULL;
-               ATENABLE(s_gen, atpgen_lock);
        } else
                atp_rcb_free(rcbp);
-       ATENABLE(s, atp->atp_lock);
 } /* atp_send_replies */
 
 
@@ -686,18 +661,16 @@ atp_unpack_bdsp(atp, m, rcbp, cnt, wait)
 {
        register struct atpBDS *bdsp;
        register         gbuf_t        *m2, *m1, *m0, *mhdr;
-       caddr_t         lastPage;
     at_atp_t    *athp;
-       int             i, len, s_gen;
+       int             i, len;
        at_socket       src_socket;
        
        struct ddp_atp {
                 char    ddp_atp_hdr[TOTAL_ATP_HDR_SIZE];
        };
-       gbuf_t                  *mprev, *mlist = 0;
+       gbuf_t                  *mprev = 0, *mlist = 0;
        gbuf_t                  *rc_xmt[ATP_TRESP_MAX];
-       unsigned char   *m0_rptr, *m0_wptr;
-       int                             err, offset, space;
+       int                             offset, space = 0;
        struct timeval timenow;
 
        /*
@@ -834,13 +807,11 @@ atp_unpack_bdsp(atp, m, rcbp, cnt, wait)
 l_send:
        if (rcbp->rc_xo) {
                getmicrouptime(&timenow);
-               ATDISABLE(s_gen, atpgen_lock);
                if (rcbp->rc_timestamp == 0) {
                        if ((rcbp->rc_timestamp = timenow.tv_sec) == 0)
                                rcbp->rc_timestamp = 1;
                        ATP_Q_APPEND(atp_need_rel, rcbp, rc_tlist);
                }
-               ATENABLE(s_gen, atpgen_lock);
        }
 
        DDP_OUTPUT(mlist);
@@ -851,18 +822,17 @@ l_send:
 #define ATP_SOCKET_LAST  (DDP_SOCKET_LAST-6)
 #define ATP_SOCKET_FIRST (DDP_SOCKET_1st_DYNAMIC)
 static unsigned int sNext = 0;
+extern unsigned char asp_inpC[];
+extern asp_scb_t *asp_scbQ[];
 
 int atp_bind(gref, sVal, flag)
        gref_t *gref;
        unsigned int sVal;
        unsigned char *flag;
 {
-       extern unsigned char asp_inpC[];
-       extern asp_scb_t *asp_scbQ[];
        unsigned char inpC, sNextUsed = 0;
-       unsigned int sMin, sMax, sSav;
+       unsigned int sMin, sMax, sSav = 0;
        struct atp_state *atp;
-       int s;
 
        atp = (struct atp_state *)gref->info;
        if (atp->dflag)
@@ -870,7 +840,6 @@ int atp_bind(gref, sVal, flag)
 
        sMax = ATP_SOCKET_LAST;
        sMin = ATP_SOCKET_FIRST;
-       ATDISABLE(s, atpgen_lock);
        if (flag && (*flag == 3)) {
                sMin += 40;
                if (sMin < sNext) {
@@ -883,7 +852,6 @@ int atp_bind(gref, sVal, flag)
             ((sVal > sMax) || (sVal < 2) || (sVal == 6) || 
              (ddp_socket_inuse(sVal, DDP_ATP) &&
               (atp_inputQ[sVal] != (gref_t *)1)))) {
-               ATENABLE(s, atpgen_lock);
                return 0;
        }
 
@@ -913,7 +881,6 @@ again:
                                sNext = 0;
                                *flag = (unsigned char)sSav;
                        }
-                       ATENABLE(s, atpgen_lock);
                        return 0;
                }
        }
@@ -927,7 +894,6 @@ again:
                        sNext = 0;
        }
 
-       ATENABLE(s, atpgen_lock);
        return (int)sVal;
 }
 
@@ -936,19 +902,16 @@ void atp_req_ind(atp, mioc)
        register gbuf_t *mioc;
 {
        register struct atp_rcb *rcbp;
-       int s;
 
        if ((rcbp = atp->atp_attached.head) != 0) {
                gbuf_cont(mioc) = rcbp->rc_ioctl;
                rcbp->rc_ioctl = NULL;
-               ATDISABLE(s, atp->atp_lock);
                if (rcbp->rc_xo) {
                        ATP_Q_REMOVE(atp->atp_attached, rcbp, rc_list);
                        rcbp->rc_state = RCB_NOTIFIED;
                        ATP_Q_APPEND(atp->atp_rcb, rcbp, rc_list);
                } else
                        atp_rcb_free(rcbp);
-               ATENABLE(s, atp->atp_lock);
                if (gbuf_cont(mioc))
                  ((ioc_t *)gbuf_rptr(mioc))->ioc_count = gbuf_msgsize(gbuf_cont(mioc));
                else
@@ -1001,7 +964,6 @@ void atp_cancel_req(gref, tid)
        gref_t *gref;
        unsigned short tid;
 {
-       int s;
        struct atp_state *atp;
        struct atp_trans *trp;
 
@@ -1009,12 +971,10 @@ void atp_cancel_req(gref, tid)
        if (atp->dflag)
                atp = (struct atp_state *)atp->atp_msgq;
 
-       ATDISABLE(s, atp->atp_lock);
        for (trp = atp->atp_trans_wait.head; trp; trp = trp->tr_list.next) {
            if (trp->tr_tid == tid)
                        break;
        }
-       ATENABLE(s, atp->atp_lock);
        if (trp != NULL)
                atp_free(trp);
 }
@@ -1026,9 +986,7 @@ void
 atp_dequeue_atp(atp)
        struct atp_state *atp;
 {
-       int s;
 
-       ATDISABLE(s, atpall_lock);
        if (atp == atp_used_list) {
                if ((atp_used_list = atp->atp_trans_waiting) != 0)
                        atp->atp_trans_waiting->atp_rcb_waiting = 0;
@@ -1040,24 +998,19 @@ atp_dequeue_atp(atp)
 
        atp->atp_trans_waiting = 0;
        atp->atp_rcb_waiting = 0;
-       ATENABLE(s, atpall_lock);
 }
 
 void
 atp_timout(func, trp, ticks)
-       void (*func)();
+       atp_tmo_func func;
        struct atp_trans *trp;
        int ticks;
 {
-       int s;
        unsigned int sum;
        struct atp_trans *curr_trp, *prev_trp;
 
-       ATDISABLE(s, atptmo_lock);
-       if (trp->tr_tmo_func) {
-               ATENABLE(s, atptmo_lock);
+       if (trp->tr_tmo_func)
                return;
-       }
 
        trp->tr_tmo_func = func;
        trp->tr_tmo_delta = 1+(ticks>>5);
@@ -1065,7 +1018,6 @@ atp_timout(func, trp, ticks)
        if (trp_tmo_list == 0) {
                trp->tr_tmo_next = trp->tr_tmo_prev = 0;
                trp_tmo_list = trp;
-               ATENABLE(s, atptmo_lock);
                return;
        }
 
@@ -1099,21 +1051,16 @@ atp_timout(func, trp, ticks)
                trp_tmo_list->tr_tmo_prev = trp;
                trp_tmo_list = trp;
        }
-       ATENABLE(s, atptmo_lock);
 }
 
 void
-atp_untimout(func, trp)
-       void (*func)();
-       struct atp_trans *trp;
+atp_untimout(
+       __unused atp_tmo_func func,
+       struct atp_trans *trp)
 {
-       int s;
 
-       ATDISABLE(s, atptmo_lock);
-       if (trp->tr_tmo_func == 0) {
-               ATENABLE(s, atptmo_lock);
+       if (trp->tr_tmo_func == 0)
                return;
-       }
 
        if (trp_tmo_list == trp) {
                if ((trp_tmo_list = trp->tr_tmo_next) != 0) {
@@ -1127,7 +1074,6 @@ atp_untimout(func, trp)
                }
        }
        trp->tr_tmo_func = 0;
-       ATENABLE(s, atptmo_lock);
 }
 
 void
@@ -1143,11 +1089,9 @@ void
 atp_trp_clock(arg)
        void *arg;
 {
-       int s;
        struct atp_trans *trp;
-       void (*tr_tmo_func)();
+       atp_tmo_func tr_tmo_func;
 
-       ATDISABLE(s, atptmo_lock);
        if (trp_tmo_list)
                trp_tmo_list->tr_tmo_delta--;
        while (((trp = trp_tmo_list) != 0) && (trp_tmo_list->tr_tmo_delta == 0)) {
@@ -1155,12 +1099,9 @@ atp_trp_clock(arg)
                        trp_tmo_list->tr_tmo_prev = 0;
                if ((tr_tmo_func = trp->tr_tmo_func) != 0) {
                        trp->tr_tmo_func = 0;
-                       ATENABLE(s, atptmo_lock);
                        (*tr_tmo_func)(trp);
-                       ATDISABLE(s, atptmo_lock);
                }
        }
-       ATENABLE(s, atptmo_lock);
 
        timeout(atp_trp_clock_locked, (void *)arg, (1<<5));
 }
@@ -1177,8 +1118,9 @@ atp_send_req(gref, mioc)
        register at_ddp_t *ddp;
        gbuf_t *m, *m2, *bds;
        struct atp_set_default *sdb;
-       int s, old;
+       int old;
        unsigned int timer;
+       u_short         temp_net;
 
        atp = (struct atp_state *)((struct atp_state *)gref->info)->atp_msgq;
        iocbp = (ioc_t *)gbuf_rptr(mioc);
@@ -1226,7 +1168,7 @@ l_retry:
         */
        athp = AT_ATP_HDR(m2);
        athp->cmd = ATP_CMD_TREQ;
-       UAS_ASSIGN(athp->tid, trp->tr_tid);
+       UAS_ASSIGN_HTON(athp->tid, trp->tr_tid);
        athp->eom = 0;
        athp->sts = 0;
        trp->tr_xo = athp->xo;
@@ -1239,7 +1181,8 @@ l_retry:
        trp->tr_socket.net = NET_VALUE(ddp->dst_net);
        trp->tr_local_socket = atp->atp_socket_no;
        trp->tr_local_node = ddp->src_node;
-       NET_NET(trp->tr_local_net, ddp->src_net);
+       temp_net = NET_VALUE(ddp->src_net);
+       NET_ASSIGN_NOSWAP(trp->tr_local_net, temp_net);
 
 #ifdef NOT_YET
        /* save the local information in the gref */
@@ -1252,9 +1195,7 @@ l_retry:
        /*
         *      Put us in the transaction waiting queue
         */
-       ATDISABLE(s, atp->atp_lock);
        ATP_Q_APPEND(atp->atp_trans_wait, trp, tr_list);
-       ATENABLE(s, atp->atp_lock);
 
        /*
         * Send the message and set the timer   
@@ -1296,6 +1237,7 @@ void atp_send_rsp(gref, m, wait)
        register at_atp_t *athp;
        register at_ddp_t *ddp;
        int s, xcnt;
+       u_short temp_net;
 
        atp = (struct atp_state *)gref->info;
        if (atp->dflag)
@@ -1306,9 +1248,8 @@ void atp_send_rsp(gref, m, wait)
        /*
         *      search for the corresponding rcb
         */
-       ATDISABLE(s, atp->atp_lock);
        for (rcbp = atp->atp_rcb.head; rcbp; rcbp = rcbp->rc_list.next) {
-           if ( (rcbp->rc_tid == UAS_VALUE(athp->tid)) &&
+           if ( (rcbp->rc_tid == UAS_VALUE_NTOH(athp->tid)) &&
                        (rcbp->rc_socket.node == ddp->dst_node) &&
                        (rcbp->rc_socket.net == NET_VALUE(ddp->dst_net)) &&
                        (rcbp->rc_socket.socket == ddp->dst_socket) )
@@ -1320,11 +1261,9 @@ void atp_send_rsp(gref, m, wait)
         */
        if ((rcbp && (rcbp->rc_state != RCB_NOTIFIED)) ||
                        (rcbp == NULL && athp->xo) ) {
-               ATENABLE(s, atp->atp_lock);
                gbuf_freem(m);
                return;
        }
-       ATENABLE(s, atp->atp_lock);
 
        if (rcbp == NULL) { /* a response is being sent for an ALO transaction */
            if ((rcbp = atp_rcb_alloc(atp)) == NULL) {
@@ -1335,16 +1274,15 @@ void atp_send_rsp(gref, m, wait)
            rcbp->rc_socket.socket = ddp->dst_socket;
            rcbp->rc_socket.node = ddp->dst_node;
            rcbp->rc_socket.net = NET_VALUE(ddp->dst_net);
-           rcbp->rc_tid = UAS_VALUE(athp->tid);
+           rcbp->rc_tid = UAS_VALUE_NTOH(athp->tid);
            rcbp->rc_bitmap = 0xff;
            rcbp->rc_xo = 0;
            rcbp->rc_state = RCB_RESPONSE_FULL;
-           ATDISABLE(s, atp->atp_lock);
            ATP_Q_APPEND(atp->atp_rcb, rcbp, rc_list);
-               ATENABLE(s, atp->atp_lock);
        }
        else if (ddp->src_node == 0) {
-               NET_NET(ddp->src_net, rcbp->rc_local_net);
+               temp_net = NET_VALUE_NOSWAP(rcbp->rc_local_net);
+               NET_ASSIGN(ddp->src_net, temp_net);
                ddp->src_node = rcbp->rc_local_node;
        }
 
@@ -1361,7 +1299,7 @@ int asp_pack_bdsp(trp, xm)
        register struct atpBDS *bdsp;
        register gbuf_t        *m, *m2;
        register int           i;
-       gbuf_t        *m_prev, *m_head = 0;
+       gbuf_t        *m_prev = 0, *m_head = 0;
 
        dPrintf(D_M_ATP, D_L_INFO, ("asp_pack_bdsp: socket=%d\n",
                trp->tr_queue->atp_socket_no));
@@ -1442,7 +1380,7 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
        void *proc;
 {
        gref_t *gref;
-       int s, rc;
+       int rc;
        unsigned short tid;
        unsigned int timer;
        register struct atp_state *atp;
@@ -1466,6 +1404,13 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
                return -1;
        }
 
+       if (len < atpBDSsize + sizeof(struct atp_set_default) + TOTAL_ATP_HDR_SIZE ||
+               len > atpBDSsize + sizeof(struct atp_set_default) + TOTAL_ATP_HDR_SIZE + 
+               ATP_DATA_SIZE) {
+               file_drop(fd);
+               *err = EINVAL;
+               return -1;
+       }
 
        while ((mioc = gbuf_alloc(sizeof(ioc_t), PRI_MED)) == 0) {
                struct timespec ts;
@@ -1473,9 +1418,7 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
                ts.tv_sec = 0;
                ts.tv_nsec = 100 *1000 * NSEC_PER_USEC;
 
-               ATDISABLE(s, atp->atp_delay_lock);
                rc = msleep(&atp->atp_delay_event, atalk_mutex, PSOCK | PCATCH, "atpmioc", &ts);
-               ATENABLE(s, atp->atp_delay_lock);
                if (rc != 0) {
                        *err = rc;
                        file_drop(fd);
@@ -1491,9 +1434,7 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
         ts.tv_sec = 0;
         ts.tv_nsec = 100 *1000 * NSEC_PER_USEC;
 
-               ATDISABLE(s, atp->atp_delay_lock);
                rc = msleep(&atp->atp_delay_event, atalk_mutex, PSOCK | PCATCH, "atpm2", &ts);
-               ATENABLE(s, atp->atp_delay_lock);
                if (rc != 0) {
                        gbuf_freeb(mioc);
                        file_drop(fd);
@@ -1534,9 +1475,7 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
         ts.tv_sec = 0;
         ts.tv_nsec = 100 *1000 * NSEC_PER_USEC;
 
-               ATDISABLE(s, atp->atp_delay_lock);
                rc = msleep(&atp->atp_delay_event, atalk_mutex, PSOCK | PCATCH, "atptrp", &ts);
-               ATENABLE(s, atp->atp_delay_lock);
                if (rc != 0) {
                        gbuf_freem(mioc);
                        file_drop(fd);
@@ -1562,7 +1501,7 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
         */
        athp = AT_ATP_HDR(m2);
        athp->cmd = ATP_CMD_TREQ;
-       UAS_ASSIGN(athp->tid, trp->tr_tid);
+       UAS_ASSIGN_HTON(athp->tid, trp->tr_tid);
        athp->eom = 0;
        athp->sts = 0;
        trp->tr_xo = athp->xo;
@@ -1587,9 +1526,7 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
        /*
         *      Put us in the transaction waiting queue
         */
-       ATDISABLE(s, atp->atp_lock);
        ATP_Q_APPEND(atp->atp_trans_wait, trp, tr_list);
-       ATENABLE(s, atp->atp_lock);
 
        /*
         * Send the message and set the timer   
@@ -1610,21 +1547,18 @@ _ATPsndreq(fd, buf, len, nowait, err, proc)
        /*
         * wait for the transaction to complete
         */
-       ATDISABLE(s, trp->tr_lock);
        while ((trp->tr_state != TRANS_DONE) && (trp->tr_state != TRANS_FAILED) &&
                                (trp->tr_state != TRANS_ABORTING)) {
                trp->tr_rsp_wait = 1;
                rc = msleep(&trp->tr_event, atalk_mutex, PSOCK | PCATCH, "atpsndreq", 0);
                if (rc != 0) {
                        trp->tr_rsp_wait = 0;
-                       ATENABLE(s, trp->tr_lock);
                        file_drop(fd);
                        *err = rc;
                        return -1;
                }
        }
        trp->tr_rsp_wait = 0;
-       ATENABLE(s, trp->tr_lock);
 
 
        if (trp->tr_state == TRANS_FAILED || trp->tr_state == TRANS_ABORTING) {
@@ -1679,15 +1613,12 @@ _ATPsndrsp(fd, respbuff, resplen, datalen, err, proc)
        void *proc;
 {
        gref_t          *gref;
-       int             s, rc;
        long            bufaddr;
        gbuf_t          *m, *mdata;
        short           space;
        int             size;
        struct atp_state *atp;
        struct atpBDS *bdsp;
-       u_int16_t       *bufsz;
-       char            *buf;
        int                     bds_cnt, count, len;
        caddr_t         dataptr;
 
@@ -1707,6 +1638,11 @@ _ATPsndrsp(fd, respbuff, resplen, datalen, err, proc)
        /*
         * allocate buffer and copy in the response info
         */
+       if (resplen < 0 || resplen > TOTAL_ATP_HDR_SIZE + sizeof(struct atpBDS)*ATP_TRESP_MAX) {
+               file_drop(fd);
+               *err = EINVAL;
+               return -1;
+       }
        if ((m = gbuf_alloc_wait(resplen, TRUE)) == 0) {
                *err = ENOMEM;
                file_drop(fd);
@@ -1736,6 +1672,12 @@ _ATPsndrsp(fd, respbuff, resplen, datalen, err, proc)
        }
        
        for (size = 0, count = 0; count < bds_cnt; count++) {
+               if (UAS_VALUE(bdsp[count].bdsBuffSz) > ATP_DATA_SIZE) {
+                       gbuf_freem(m);
+                       *err = EINVAL;
+                       file_drop(fd);
+                       return -1;
+               }
                size += UAS_VALUE(bdsp[count].bdsBuffSz);
        }
        if (size > datalen) {                           
@@ -1771,7 +1713,7 @@ _ATPsndrsp(fd, respbuff, resplen, datalen, err, proc)
                                if (!(mdata->m_flags & M_EXT)) {
                                        m_freem(m);
                                        file_drop(fd);
-                                       return(NULL);
+                                       return(0);
                                }
                                dataptr = mtod(mdata, caddr_t);
                                space = MCLBYTES;
@@ -1806,7 +1748,7 @@ _ATPgetreq(fd, buf, buflen, err, proc)
        register struct atp_state *atp;
        register struct atp_rcb *rcbp;
        register gbuf_t *m, *m_head;
-       int s, size, len;
+       int size, len;
 
        if ((*err = atalk_getref(0, fd, &gref, proc, 1)) != 0)
                return -1;
@@ -1820,7 +1762,12 @@ _ATPgetreq(fd, buf, buflen, err, proc)
                return -1;
        }
 
-       ATDISABLE(s, atp->atp_lock);
+       if (buflen < DDP_X_HDR_SIZE + ATP_HDR_SIZE) {
+               file_drop(fd);
+               *err = EINVAL;
+               return -1;
+       }
+
        if ((rcbp = atp->atp_attached.head) != NULL) {
            /*
             * Got one, move it to the active response Q
@@ -1838,7 +1785,6 @@ _ATPgetreq(fd, buf, buflen, err, proc)
                         */
                        atp_rcb_free(rcbp);
                }
-               ATENABLE(s, atp->atp_lock);
 
                /*
                 * copyout the request data, including the protocol header
@@ -1856,7 +1802,6 @@ _ATPgetreq(fd, buf, buflen, err, proc)
                file_drop(fd);
                return size;
        }
-       ATENABLE(s, atp->atp_lock);
 
        file_drop(fd);
        return -1;
@@ -1872,7 +1817,7 @@ _ATPgetrsp(fd, bdsp, err, proc)
        gref_t *gref;
        register struct atp_state *atp;
        register struct atp_trans *trp;
-       int s, tid;
+       int tid;
        char bds[atpBDSsize];
 
        if ((*err = atalk_getref(0, fd, &gref, proc, 1)) != 0)
@@ -1887,7 +1832,6 @@ _ATPgetrsp(fd, bdsp, err, proc)
                return -1;
        }
 
-       ATDISABLE(s, atp->atp_lock);
        for (trp = atp->atp_trans_wait.head; trp; trp = trp->tr_list.next) {
                dPrintf(D_M_ATP, D_L_INFO,
                        ("ATPgetrsp: atp:0x%x, trp:0x%x, state:%d\n",
@@ -1895,7 +1839,6 @@ _ATPgetrsp(fd, bdsp, err, proc)
 
                switch (trp->tr_state) {
                case TRANS_DONE:
-               ATENABLE(s, atp->atp_lock);
                        if ((*err = copyin(CAST_USER_ADDR_T(bdsp),
                                        (caddr_t)bds, sizeof(bds))) != 0) {
                                atp_free(trp);
@@ -1920,7 +1863,6 @@ _ATPgetrsp(fd, bdsp, err, proc)
                        /*
                         * transaction timed out, return error
                         */
-               ATENABLE(s, atp->atp_lock);
                        atp_free(trp);
                        file_drop(fd);
                        *err = ETIMEDOUT;
@@ -1930,7 +1872,6 @@ _ATPgetrsp(fd, bdsp, err, proc)
                        continue;
            }
        }
-       ATENABLE(s, atp->atp_lock);
 
        file_drop(fd);
        *err = EINVAL;
@@ -1942,7 +1883,6 @@ atp_drop_req(gref, m)
        gref_t *gref;
        gbuf_t *m;
 {
-       int s;
        struct atp_state *atp;
        struct atp_rcb *rcbp;
        at_atp_t *athp;
@@ -1957,9 +1897,8 @@ atp_drop_req(gref, m)
        /*
         *      search for the corresponding rcb
         */
-       ATDISABLE(s, atp->atp_lock);
        for (rcbp = atp->atp_rcb.head; rcbp; rcbp = rcbp->rc_list.next) {
-           if ( (rcbp->rc_tid == UAS_VALUE(athp->tid)) &&
+           if ( (rcbp->rc_tid == UAS_VALUE_NTOH(athp->tid)) &&
                        (rcbp->rc_socket.node == ddp->src_node) &&
                        (rcbp->rc_socket.net == NET_VALUE(ddp->src_net)) &&
                        (rcbp->rc_socket.socket == ddp->src_socket) )
@@ -1971,7 +1910,6 @@ atp_drop_req(gref, m)
         */
        if (rcbp)
                atp_rcb_free(rcbp);
-       ATENABLE(s, atp->atp_lock);
 
        gbuf_freem(m);
 }