Remove dead code from rxi_FindIfnet()
[openafs.git] / src / rx / rx_kcommon.c
index b469bac..64d95e9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
  */
 
 #include <afsconfig.h>
-#include "afs/param.h"
+#include <afs/param.h>
 
-RCSID
-    ("$Header$");
 
 #include "rx/rx_kcommon.h"
+#include "rx_atomic.h"
+#include "rx_stats.h"
 
 #ifdef AFS_HPUX110_ENV
 #include "h/tihdr.h"
@@ -26,8 +26,8 @@ RCSID
 #include "afsint.h"
 
 #ifndef RXK_LISTENER_ENV
-int (*rxk_PacketArrivalProc) (register struct rx_packet * ahandle, register struct sockaddr_in * afrom, char *arock, afs_int32 asize); /* set to packet allocation procedure */
-int (*rxk_GetPacketProc) (char **ahandle, int asize);
+int (*rxk_PacketArrivalProc) (struct rx_packet * ahandle, struct sockaddr_in * afrom, struct socket *arock, afs_int32 asize);  /* set to packet allocation procedure */
+int (*rxk_GetPacketProc) (struct rx_packet **ahandle, int asize);
 #endif
 
 osi_socket *rxk_NewSocketHost(afs_uint32 ahost, short aport);
@@ -45,6 +45,11 @@ static int myNetMTUs[ADDRSPERSITE];
 static int numMyNetAddrs = 0;
 #endif
 
+#if defined(AFS_DARWIN80_ENV)
+#define sobind sock_bind
+#define soclose sock_close
+#endif
+
 /* add a port to the monitored list, port # is in network order */
 static int
 rxk_AddPort(u_short aport, char *arock)
@@ -73,8 +78,8 @@ rxk_AddPort(u_short aport, char *arock)
 int
 rxk_DelPort(u_short aport)
 {
-    register int i;
-    register unsigned short *tsp;
+    int i;
+    unsigned short *tsp;
 
     for (i = 0, tsp = rxk_ports; i < MAXRXPORTS; i++, tsp++) {
        if (*tsp == aport) {
@@ -119,21 +124,6 @@ rxi_GetUDPSocket(u_short port)
     return rxi_GetHostUDPSocket(htonl(INADDR_ANY), port);
 }
 
-void
-osi_Panic(msg, a1, a2, a3)
-     char *msg;
-{
-    if (!msg)
-       msg = "Unknown AFS panic";
-
-    printf(msg, a1, a2, a3);
-#ifdef AFS_LINUX24_ENV
-    BUG();
-#else
-    panic(msg);
-#endif
-}
-
 /*
  * osi_utoa() - write the NUL-terminated ASCII decimal form of the given
  * unsigned long value into the given buffer.  Returns 0 on success,
@@ -204,6 +194,7 @@ osi_utoa(char *buf, size_t len, unsigned long val)
     return 0;
 }
 
+#ifndef AFS_LINUX26_ENV
 /*
  * osi_AssertFailK() -- used by the osi_Assert() macro.
  *
@@ -254,22 +245,25 @@ osi_AssertFailK(const char *expr, const char *file, int line)
 
 #undef ADDBUF
 
-    osi_Panic(buf);
+    osi_Panic("%s", buf);
 }
+#endif
 
 #ifndef UKERNEL
 /* This is the server process request loop. Kernel server
  * processes never become listener threads */
-void
-rx_ServerProc(void)
+void *
+rx_ServerProc(void *unused)
 {
     int threadID;
 
     rxi_MorePackets(rx_maxReceiveWindow + 2);  /* alloc more packets */
+    MUTEX_ENTER(&rx_quota_mutex);
     rxi_dataQuota += rx_initSendWindow;        /* Reserve some pkts for hard times */
     /* threadID is used for making decisions in GetCall.  Get it by bumping
      * number of threads handling incoming calls */
     threadID = rxi_availProcs++;
+    MUTEX_EXIT(&rx_quota_mutex);
 
 #ifdef RX_ENABLE_LOCKS
     AFS_GUNLOCK();
@@ -278,15 +272,17 @@ rx_ServerProc(void)
 #ifdef RX_ENABLE_LOCKS
     AFS_GLOCK();
 #endif /* RX_ENABLE_LOCKS */
+
+    return NULL;
 }
 #endif /* !UKERNEL */
 
 #ifndef RXK_LISTENER_ENV
 /* asize includes the Rx header */
 static int
-MyPacketProc(char **ahandle, int asize)
+MyPacketProc(struct rx_packet **ahandle, int asize)
 {
-    register struct rx_packet *tp;
+    struct rx_packet *tp;
 
     /* If this is larger than we expected, increase rx_maxReceiveDataSize */
     /* If we can't scrounge enough cbufs, then we have to drop the packet,
@@ -301,9 +297,9 @@ MyPacketProc(char **ahandle, int asize)
                                 RX_PACKET_CLASS_RECV_CBUF)) {
                rxi_FreePacket(tp);
                tp = NULL;
-               MUTEX_ENTER(&rx_stats_mutex);
-               rx_stats.noPacketBuffersOnRead++;
-               MUTEX_EXIT(&rx_stats_mutex);
+                if (rx_stats_active) {
+                   rx_atomic_inc(&rx_stats.noPacketBuffersOnRead);
+                }
            }
        }
     } else {
@@ -312,31 +308,32 @@ MyPacketProc(char **ahandle, int asize)
         * should do this at a higher layer and let other
         * end know we're losing.
         */
-       MUTEX_ENTER(&rx_stats_mutex);
-       rx_stats.bogusPacketOnRead++;
-       MUTEX_EXIT(&rx_stats_mutex);
+        if (rx_stats_active) {
+           rx_atomic_inc(&rx_stats.bogusPacketOnRead);
+        }
        /* I DON"T LIKE THIS PRINTF -- PRINTFS MAKE THINGS VERY VERY SLOOWWW */
-       printf("rx: packet dropped: bad ulen=%d\n", asize);
+       dpf(("rx: packet dropped: bad ulen=%d\n", asize));
        tp = NULL;
     }
 
     if (!tp)
        return -1;
     /* otherwise we have a packet, set appropriate values */
-    *ahandle = (char *)tp;
+    *ahandle = tp;
     return 0;
 }
 
 static int
-MyArrivalProc(register struct rx_packet *ahandle,
-             register struct sockaddr_in *afrom, char *arock,
+MyArrivalProc(struct rx_packet *ahandle,
+             struct sockaddr_in *afrom,
+             struct socket *arock,
              afs_int32 asize)
 {
     /* handle basic rx packet */
     ahandle->length = asize - RX_HEADER_SIZE;
     rxi_DecodePacketHeader(ahandle);
     ahandle =
-       rxi_ReceivePacket(ahandle, (struct socket *)arock,
+       rxi_ReceivePacket(ahandle, arock,
                          afrom->sin_addr.s_addr, afrom->sin_port, NULL,
                          NULL);
 
@@ -350,8 +347,8 @@ MyArrivalProc(register struct rx_packet *ahandle,
 void
 rxi_StartListener(void)
 {
+#if !defined(RXK_LISTENER_ENV) && !defined(RXK_UPCALL_ENV)
     /* if kernel, give name of appropriate procedures */
-#ifndef RXK_LISTENER_ENV
     rxk_GetPacketProc = MyPacketProc;
     rxk_PacketArrivalProc = MyArrivalProc;
     rxk_init();
@@ -361,25 +358,23 @@ rxi_StartListener(void)
 /* Called from rxi_FindPeer, when initializing a clear rx_peer structure,
   to get interesting information. */
 void
-rxi_InitPeerParams(register struct rx_peer *pp)
+rxi_InitPeerParams(struct rx_peer *pp)
 {
     u_short rxmtu;
-    afs_int32 i, mtu;
 
 #ifdef ADAPT_MTU
-#ifndef AFS_SUN5_ENV
-#ifdef AFS_USERSPACE_IP_ADDR
+# ifndef AFS_SUN5_ENV
+#  ifdef AFS_USERSPACE_IP_ADDR
+    afs_int32 i;
+    afs_int32 mtu;
+
     i = rxi_Findcbi(pp->host);
     if (i == -1) {
-       pp->timeout.sec = 3;
-       /* pp->timeout.usec = 0; */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+       rx_rto_setPeerTimeoutSecs(pp, 3);
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     } else {
-       pp->timeout.sec = 2;
-       /* pp->timeout.usec = 0; */
+       rx_rto_setPeerTimeoutSecs(pp, 2);
        pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
-    }
-    if (i != -1) {
        mtu = ntohl(afs_cb_interface.mtu[i]);
        /* Diminish the packet size to one based on the MTU given by
         * the interface. */
@@ -388,56 +383,50 @@ rxi_InitPeerParams(register struct rx_peer *pp)
            if (rxmtu < pp->ifMTU)
                pp->ifMTU = rxmtu;
        }
-    } else {                   /* couldn't find the interface, so assume the worst */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
     }
-#else /* AFS_USERSPACE_IP_ADDR */
-    struct ifnet *ifn;
+#  else /* AFS_USERSPACE_IP_ADDR */
+    rx_ifnet_t ifn;
 
-#if !defined(AFS_SGI62_ENV)
+#   if !defined(AFS_SGI62_ENV)
     if (numMyNetAddrs == 0)
        (void)rxi_GetIFInfo();
-#endif
+#   endif
 
     ifn = rxi_FindIfnet(pp->host, NULL);
     if (ifn) {
-       pp->timeout.sec = 2;
-       /* pp->timeout.usec = 0; */
+       rx_rto_setPeerTimeoutSecs(pp, 2);
        pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
-#ifdef IFF_POINTOPOINT
-       if (ifn->if_flags & IFF_POINTOPOINT) {
+#   ifdef IFF_POINTOPOINT
+       if (rx_ifnet_flags(ifn) & IFF_POINTOPOINT) {
            /* wish we knew the bit rate and the chunk size, sigh. */
-           pp->timeout.sec = 4;
+           rx_rto_setPeerTimeoutSecs(pp, 4);
            pp->ifMTU = RX_PP_PACKET_SIZE;
        }
-#endif /* IFF_POINTOPOINT */
+#   endif /* IFF_POINTOPOINT */
        /* Diminish the packet size to one based on the MTU given by
         * the interface. */
-       if (ifn->if_mtu > (RX_IPUDP_SIZE + RX_HEADER_SIZE)) {
-           rxmtu = ifn->if_mtu - RX_IPUDP_SIZE;
+       if (rx_ifnet_mtu(ifn) > (RX_IPUDP_SIZE + RX_HEADER_SIZE)) {
+           rxmtu = rx_ifnet_mtu(ifn) - RX_IPUDP_SIZE;
            if (rxmtu < pp->ifMTU)
                pp->ifMTU = rxmtu;
        }
     } else {                   /* couldn't find the interface, so assume the worst */
-       pp->timeout.sec = 3;
-       /* pp->timeout.usec = 0; */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+       rx_rto_setPeerTimeoutSecs(pp, 3);
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     }
-#endif /* else AFS_USERSPACE_IP_ADDR */
-#else /* AFS_SUN5_ENV */
+#  endif /* else AFS_USERSPACE_IP_ADDR */
+# else /* AFS_SUN5_ENV */
+    afs_int32 mtu;
+
     mtu = rxi_FindIfMTU(pp->host);
 
     if (mtu <= 0) {
-       pp->timeout.sec = 3;
-       /* pp->timeout.usec = 0; */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+       rx_rto_setPeerTimeoutSecs(pp, 3);
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     } else {
-       pp->timeout.sec = 2;
-       /* pp->timeout.usec = 0; */
+       rx_rto_setPeerTimeoutSecs(pp, 2);
        pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
-    }
 
-    if (mtu > 0) {
        /* Diminish the packet size to one based on the MTU given by
         * the interface. */
        if (mtu > (RX_IPUDP_SIZE + RX_HEADER_SIZE)) {
@@ -445,13 +434,10 @@ rxi_InitPeerParams(register struct rx_peer *pp)
            if (rxmtu < pp->ifMTU)
                pp->ifMTU = rxmtu;
        }
-    } else {                   /* couldn't find the interface, so assume the worst */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
     }
-#endif /* AFS_SUN5_ENV */
+# endif /* AFS_SUN5_ENV */
 #else /* ADAPT_MTU */
-    pp->rateFlag = 2;          /* start timing after two full packets */
-    pp->timeout.sec = 2;
+    rx_rto_setPeerTimeoutSecs(pp, 2);
     pp->ifMTU = OLD_MAX_PACKET_SIZE;
 #endif /* else ADAPT_MTU */
     pp->ifMTU = rxi_AdjustIfMTU(pp->ifMTU);
@@ -459,7 +445,7 @@ rxi_InitPeerParams(register struct rx_peer *pp)
     pp->natMTU = MIN(pp->ifMTU, OLD_MAX_PACKET_SIZE);
     pp->ifDgramPackets =
        MIN(rxi_nDgramPackets,
-           rxi_AdjustDgramPackets(RX_MAX_FRAGS, pp->ifMTU));
+           rxi_AdjustDgramPackets(rxi_nSendFrags, pp->ifMTU));
     pp->maxDgramPackets = 1;
 
     /* Initialize slow start parameters */
@@ -484,7 +470,7 @@ static struct protosw parent_proto; /* udp proto switch */
 void
 shutdown_rxkernel(void)
 {
-    register struct protosw *tpro, *last;
+    struct protosw *tpro, *last;
     last = inetdomain.dom_protoswNPROTOSW;
     for (tpro = inetdomain.dom_protosw; tpro < last; tpro++)
        if (tpro->pr_protocol == IPPROTO_UDP) {
@@ -495,7 +481,7 @@ shutdown_rxkernel(void)
            rxk_shutdownPorts();
            return;
        }
-    printf("shutdown_rxkernel: no udp proto");
+    dpf(("shutdown_rxkernel: no udp proto\n"));
 }
 #endif /* !AIX && !SUN && !NCR  && !UKERNEL */
 
@@ -506,7 +492,7 @@ shutdown_rxkernel(void)
 int
 rxi_GetcbiInfo(void)
 {
-    int i, j, different = 0;
+    int i, j, different = 0, num = ADDRSPERSITE;
     int rxmtu, maxmtu;
     afs_uint32 ifinaddr;
     afs_uint32 addrs[ADDRSPERSITE];
@@ -515,7 +501,9 @@ rxi_GetcbiInfo(void)
     memset((void *)addrs, 0, sizeof(addrs));
     memset((void *)mtus, 0, sizeof(mtus));
 
-    for (i = 0; i < afs_cb_interface.numberOfInterfaces; i++) {
+    if (afs_cb_interface.numberOfInterfaces < num)
+       num = afs_cb_interface.numberOfInterfaces;
+    for (i = 0; i < num; i++) {
        if (!afs_cb_interface.mtu[i])
            afs_cb_interface.mtu[i] = htonl(1500);
        rxmtu = (ntohl(afs_cb_interface.mtu[i]) - RX_IPUDP_SIZE);
@@ -529,7 +517,7 @@ rxi_GetcbiInfo(void)
            rxmtu * rxi_nRecvFrags + ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
        maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
        addrs[i++] = ifinaddr;
-       if ((ifinaddr != 0x7f000001) && (maxmtu > rx_maxReceiveSize)) {
+       if (!rx_IsLoopbackAddr(ifinaddr) && (maxmtu > rx_maxReceiveSize)) {
            rx_maxReceiveSize = MIN(RX_MAX_PACKET_SIZE, maxmtu);
            rx_maxReceiveSize = MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
        }
@@ -615,21 +603,71 @@ rxi_GetIFInfo(void)
     int i = 0;
     int different = 0;
 
-    register struct ifnet *ifn;
-    register int rxmtu, maxmtu;
+    int rxmtu, maxmtu;
     afs_uint32 addrs[ADDRSPERSITE];
     int mtus[ADDRSPERSITE];
-    struct ifaddr *ifad;       /* ifnet points to a if_addrlist of ifaddrs */
     afs_uint32 ifinaddr;
+#if defined(AFS_DARWIN80_ENV)
+    errno_t t;
+    unsigned int count;
+    int cnt=0, m, j;
+    rx_ifaddr_t *ifads;
+    rx_ifnet_t *ifns;
+    struct sockaddr sout;
+    struct sockaddr_in *sin;
+    struct in_addr pin;
+#else
+    rx_ifaddr_t ifad;  /* ifnet points to a if_addrlist of ifaddrs */
+    rx_ifnet_t ifn;
+#endif
 
     memset(addrs, 0, sizeof(addrs));
     memset(mtus, 0, sizeof(mtus));
 
+#if defined(AFS_DARWIN80_ENV)
+    if (!ifnet_list_get(AF_INET, &ifns, &count)) {
+       for (m = 0; m < count; m++) {
+           if (!ifnet_get_address_list(ifns[m], &ifads)) {
+               for (j = 0; ifads[j] != NULL && cnt < ADDRSPERSITE; j++) {
+                   if ((t = ifaddr_address(ifads[j], &sout, sizeof(struct sockaddr))) == 0) {
+                       sin = (struct sockaddr_in *)&sout;
+                       rxmtu = rx_ifnet_mtu(rx_ifaddr_ifnet(ifads[j])) - RX_IPUDP_SIZE;
+                       ifinaddr = ntohl(sin->sin_addr.s_addr);
+                       if (myNetAddrs[i] != ifinaddr) {
+                           different++;
+                       }
+                       mtus[i] = rxmtu;
+                       rxmtu = rxi_AdjustIfMTU(rxmtu);
+                       maxmtu =
+                           rxmtu * rxi_nRecvFrags +
+                           ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
+                       maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
+                       addrs[i++] = ifinaddr;
+                       if (!rx_IsLoopbackAddr(ifinaddr) &&
+                           (maxmtu > rx_maxReceiveSize)) {
+                           rx_maxReceiveSize =
+                               MIN(RX_MAX_PACKET_SIZE, maxmtu);
+                           rx_maxReceiveSize =
+                               MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
+                       }
+                       cnt++;
+                   }
+               }
+               ifnet_free_address_list(ifads);
+           }
+       }
+       ifnet_list_free(ifns);
+    }
+#else
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+#if defined(AFS_FBSD80_ENV)
+    TAILQ_FOREACH(ifn, &V_ifnet, if_link) {
+#else
     TAILQ_FOREACH(ifn, &ifnet, if_link) {
+#endif
        if (i >= ADDRSPERSITE)
            break;
-#elif defined(AFS_OBSD_ENV)
+#elif defined(AFS_OBSD_ENV) || defined(AFS_NBSD_ENV)
     for (ifn = ifnet.tqh_first; i < ADDRSPERSITE && ifn != NULL;
         ifn = ifn->if_list.tqe_next) {
 #else
@@ -640,7 +678,7 @@ rxi_GetIFInfo(void)
        TAILQ_FOREACH(ifad, &ifn->if_addrhead, ifa_link) {
            if (i >= ADDRSPERSITE)
                break;
-#elif defined(AFS_OBSD_ENV)
+#elif defined(AFS_OBSD_ENV) || defined(AFS_NBSD_ENV)
        for (ifad = ifn->if_addrlist.tqh_first;
             ifad != NULL && i < ADDRSPERSITE;
             ifad = ifad->ifa_list.tqe_next) {
@@ -662,7 +700,7 @@ rxi_GetIFInfo(void)
                    ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
                maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
                addrs[i++] = ifinaddr;
-               if ((ifinaddr != 0x7f000001) && (maxmtu > rx_maxReceiveSize)) {
+               if (!rx_IsLoopbackAddr(ifinaddr) && (maxmtu > rx_maxReceiveSize)) {
                    rx_maxReceiveSize = MIN(RX_MAX_PACKET_SIZE, maxmtu);
                    rx_maxReceiveSize =
                        MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
@@ -670,6 +708,7 @@ rxi_GetIFInfo(void)
            }
        }
     }
+#endif
 
     rx_maxJumboRecvSize =
        RX_HEADER_SIZE + rxi_nDgramPackets * RX_JUMBOBUFFERSIZE +
@@ -677,36 +716,38 @@ rxi_GetIFInfo(void)
     rx_maxJumboRecvSize = MAX(rx_maxJumboRecvSize, rx_maxReceiveSize);
 
     if (different) {
-       int j;
-       for (j = 0; j < i; j++) {
-           myNetMTUs[j] = mtus[j];
-           myNetAddrs[j] = addrs[j];
+       int l;
+       for (l = 0; l < i; l++) {
+           myNetMTUs[l] = mtus[l];
+           myNetAddrs[l] = addrs[l];
        }
     }
     return different;
 }
 
-#if defined(AFS_DARWIN60_ENV) || defined(AFS_XBSD_ENV)
+#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
 /* Returns ifnet which best matches address */
-struct ifnet *
+rx_ifnet_t
 rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
 {
-    struct sockaddr_in s;
-    struct ifaddr *ifad;
+    struct sockaddr_in s, sr;
+    rx_ifaddr_t ifad;
 
     s.sin_family = AF_INET;
     s.sin_addr.s_addr = addr;
-    ifad = ifa_ifwithnet((struct sockaddr *)&s);
+    ifad = rx_ifaddr_withnet((struct sockaddr *)&s);
 
-    if (ifad && maskp)
-       *maskp = ((struct sockaddr_in *)ifad->ifa_netmask)->sin_addr.s_addr;
-    return (ifad ? ifad->ifa_ifp : NULL);
+    if (ifad && maskp) {
+       rx_ifaddr_netmask(ifad, (struct sockaddr *)&sr, sizeof(sr));
+       *maskp = sr.sin_addr.s_addr;
+    }
+    return (ifad ? rx_ifaddr_ifnet(ifad) : NULL);
 }
 
-#else /* DARWIN60 || XBSD */
+#else /* DARWIN || XBSD */
 
 /* Returns ifnet which best matches address */
-struct ifnet *
+rx_ifnet_t
 rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
 {
     int match_value = 0;
@@ -715,12 +756,7 @@ rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
 
     addr = ntohl(addr);
 
-#if defined(AFS_DARWIN_ENV)
-    for (ifa = TAILQ_FIRST(&in_ifaddrhead); ifa;
-        ifa = TAILQ_NEXT(ifa, ia_link)) {
-#else
     for (ifa = in_ifaddr; ifa; ifa = ifa->ia_next) {
-#endif
        if ((addr & ifa->ia_netmask) == ifa->ia_net) {
            if ((addr & ifa->ia_subnetmask) == ifa->ia_subnet) {
                if (IA_SIN(ifa)->sin_addr.s_addr == addr) {     /* ie, ME!!!  */
@@ -746,7 +782,7 @@ rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
        *maskp = ifad->ia_subnetmask;
     return (ifad ? ifad->ia_ifp : NULL);
 }
-#endif /* else DARWIN60 || XBSD */
+#endif /* else DARWIN || XBSD */
 #endif /* else AFS_USERSPACE_IP_ADDR */
 #endif /* !SUN5 && !SGI62 */
 
@@ -764,9 +800,13 @@ rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
 osi_socket *
 rxk_NewSocketHost(afs_uint32 ahost, short aport)
 {
-    register afs_int32 code;
+    afs_int32 code;
+#ifdef AFS_DARWIN80_ENV
+    socket_t newSocket;
+#else
     struct socket *newSocket;
-#if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD50_ENV))
+#endif
+#if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD_ENV))
     struct mbuf *nam;
 #endif
     struct sockaddr_in myaddr;
@@ -790,7 +830,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     AFS_GUNLOCK();
 #if    defined(AFS_HPUX102_ENV)
 #if     defined(AFS_HPUX110_ENV)
-    /* we need a file associated with the socket so sosend in NetSend 
+    /* we need a file associated with the socket so sosend in NetSend
      * will not fail */
     /* blocking socket */
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, 0);
@@ -809,11 +849,19 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
 #endif /* else AFS_HPUX110_ENV */
 #elif defined(AFS_SGI65_ENV) || defined(AFS_OBSD_ENV)
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP);
-#elif defined(AFS_FBSD50_ENV)
+#elif defined(AFS_FBSD_ENV)
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP,
                    afs_osi_credp, curthread);
-#elif defined(AFS_FBSD40_ENV)
-    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP, curproc);
+#elif defined(AFS_DARWIN80_ENV)
+#ifdef RXK_LISTENER_ENV
+    code = sock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, NULL, &newSocket);
+#else
+    code = sock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, rx_upcall, NULL, &newSocket);
+#endif
+#elif defined(AFS_NBSD50_ENV)
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, osi_curproc(), NULL);
+#elif defined(AFS_NBSD40_ENV)
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, osi_curproc());
 #else
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0);
 #endif /* AFS_HPUX102_ENV */
@@ -837,8 +885,11 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     memcpy((caddr_t) bindnam->b_rptr + SO_MSGOFFSET, (caddr_t) & myaddr,
           addrsize);
     bindnam->b_wptr = bindnam->b_rptr + (addrsize + SO_MSGOFFSET + 1);
-
+#if defined(AFS_NBSD40_ENV)
+    code = sobind(newSocket, bindnam, addrsize, osi_curproc());
+#else
     code = sobind(newSocket, bindnam, addrsize);
+#endif
     if (code) {
        soclose(newSocket);
 #if !defined(AFS_HPUX1122_ENV)
@@ -849,24 +900,45 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
 
     freeb(bindnam);
 #else /* AFS_HPUX110_ENV */
+#if defined(AFS_DARWIN80_ENV)
+    {
+       int buflen = 50000;
+       int i,code2;
+       for (i=0;i<2;i++) {
+           code = sock_setsockopt(newSocket, SOL_SOCKET, SO_SNDBUF,
+                                  &buflen, sizeof(buflen));
+           code2 = sock_setsockopt(newSocket, SOL_SOCKET, SO_RCVBUF,
+                                  &buflen, sizeof(buflen));
+           if (!code && !code2)
+               break;
+           if (i == 2)
+             osi_Panic("osi_NewSocket: last attempt to reserve 32K failed!\n");
+           buflen = 32766;
+       }
+    }
+#else
+#if defined(AFS_NBSD_ENV)
+    solock(newSocket);
+#endif
     code = soreserve(newSocket, 50000, 50000);
     if (code) {
        code = soreserve(newSocket, 32766, 32766);
        if (code)
            osi_Panic("osi_NewSocket: last attempt to reserve 32K failed!\n");
     }
+#if defined(AFS_NBSD_ENV)
+    sounlock(newSocket);
+#endif
+#endif
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
-#if defined(AFS_FBSD50_ENV)
+#if defined(AFS_FBSD_ENV)
     code = sobind(newSocket, (struct sockaddr *)&myaddr, curthread);
-#elif defined(AFS_FBSD40_ENV)
-    code = sobind(newSocket, (struct sockaddr *)&myaddr, curproc);
 #else
     code = sobind(newSocket, (struct sockaddr *)&myaddr);
 #endif
     if (code) {
-       printf("sobind fails (%d)\n", (int)code);
+       dpf(("sobind fails (%d)\n", (int)code));
        soclose(newSocket);
-       AFS_GLOCK();
        goto bad;
     }
 #else /* defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV) */
@@ -883,15 +955,17 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     }
     nam->m_len = sizeof(myaddr);
     memcpy(mtod(nam, caddr_t), &myaddr, sizeof(myaddr));
-#ifdef AFS_SGI65_ENV
+#if defined(AFS_SGI65_ENV)
     BHV_PDATA(&bhv) = (void *)newSocket;
     code = sobind(&bhv, nam);
     m_freem(nam);
+#elif defined(AFS_OBSD44_ENV) || defined(AFS_NBSD40_ENV)
+    code = sobind(newSocket, nam, osi_curproc());
 #else
     code = sobind(newSocket, nam);
 #endif
     if (code) {
-       printf("sobind fails (%d)\n", (int)code);
+       dpf(("sobind fails (%d)\n", (int)code));
        soclose(newSocket);
 #ifndef AFS_SGI65_ENV
        m_freem(nam);
@@ -923,7 +997,7 @@ rxk_NewSocket(short aport)
 
 /* free socket allocated by rxk_NewSocket */
 int
-rxk_FreeSocket(register struct socket *asocket)
+rxk_FreeSocket(struct socket *asocket)
 {
     AFS_STATCNT(osi_FreeSocket);
 #if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
@@ -933,8 +1007,8 @@ rxk_FreeSocket(register struct socket *asocket)
     if (asocket->so_fp) {
        struct file *fp = asocket->so_fp;
 #if !defined(AFS_HPUX1123_ENV)
-       /* 11.23 still has falloc, but not FPENTRYFREE ! 
-        * so for now if we shutdown, we will waist a file 
+       /* 11.23 still has falloc, but not FPENTRYFREE !
+        * so for now if we shutdown, we will waist a file
         * structure */
        FPENTRYFREE(fp);
        asocket->so_fp = NULL;
@@ -949,7 +1023,21 @@ rxk_FreeSocket(register struct socket *asocket)
 }
 #endif /* !SUN5 && !LINUX20 */
 
-#if defined(RXK_LISTENER_ENV) || defined(AFS_SUN5_ENV)
+#if defined(RXK_LISTENER_ENV) || defined(AFS_SUN5_ENV) || defined(RXK_UPCALL_ENV)
+#ifdef RXK_TIMEDSLEEP_ENV
+/* Shutting down should wake us up, as should an earlier event. */
+void
+rxi_ReScheduleEvents(void)
+{
+    /* needed to allow startup */
+    int glock = ISAFS_GLOCK();
+    if (!glock)
+       AFS_GLOCK();
+    osi_rxWakeup(&afs_termState);
+    if (!glock)
+        AFS_GUNLOCK();
+}
+#endif
 /*
  * Run RX event daemon every second (5 times faster than rest of systems)
  */
@@ -973,7 +1061,12 @@ afs_rxevent_daemon(void)
        afs_Trace1(afs_iclSetp, CM_TRACE_TIMESTAMP, ICL_TYPE_STRING,
                   "before afs_osi_Wait()");
 #endif
+#ifdef RXK_TIMEDSLEEP_ENV
+       afs_osi_TimedSleep(&afs_termState, MAX(500, ((temp.sec * 1000) +
+                                                    (temp.usec / 1000))), 0);
+#else
        afs_osi_Wait(500, NULL, 0);
+#endif
 #ifdef RX_KERNEL_TRACE
        afs_Trace1(afs_iclSetp, CM_TRACE_TIMESTAMP, ICL_TYPE_STRING,
                   "after afs_osi_Wait()");
@@ -981,6 +1074,8 @@ afs_rxevent_daemon(void)
        if (afs_termState == AFSOP_STOP_RXEVENT) {
 #ifdef RXK_LISTENER_ENV
            afs_termState = AFSOP_STOP_RXK_LISTENER;
+#elif defined(AFS_SUN510_ENV) || defined(RXK_UPCALL_ENV)
+           afs_termState = AFSOP_STOP_NETIF;
 #else
            afs_termState = AFSOP_STOP_COMPLETE;
 #endif
@@ -1001,7 +1096,7 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
     struct sockaddr_in from;
     int nbytes;
     afs_int32 rlen;
-    register afs_int32 tlen;
+    afs_int32 tlen;
     afs_int32 savelen;         /* was using rlen but had aliasing problems */
     rx_computelen(p, tlen);
     rx_SetDataSize(p, tlen);   /* this is the size of the user data area */
@@ -1019,7 +1114,7 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
     } else
        tlen = rlen;
 
-    /* add some padding to the last iovec, it's just to make sure that the 
+    /* add some padding to the last iovec, it's just to make sure that the
      * read doesn't return more data than we expect, and is done to get around
      * our problems caused by the lack of a length field in the rx header. */
     savelen = p->wirevec[p->niovecs - 1].iov_len;
@@ -1050,14 +1145,14 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
     if (!code) {
        p->length = nbytes - RX_HEADER_SIZE;;
        if ((nbytes > tlen) || (p->length & 0x8000)) {  /* Bogus packet */
-           if (nbytes > 0)
-               rxi_MorePackets(rx_initSendWindow);
-           else {
-               MUTEX_ENTER(&rx_stats_mutex);
-               rx_stats.bogusPacketOnRead++;
-               rx_stats.bogusHost = from.sin_addr.s_addr;
-               MUTEX_EXIT(&rx_stats_mutex);
-               dpf(("B: bogus packet from [%x,%d] nb=%d",
+           if (nbytes <= 0) {
+                if (rx_stats_active) {
+                    MUTEX_ENTER(&rx_stats_mutex);
+                    rx_atomic_inc(&rx_stats.bogusPacketOnRead);
+                    rx_stats.bogusHost = from.sin_addr.s_addr;
+                    MUTEX_EXIT(&rx_stats_mutex);
+                }
+               dpf(("B: bogus packet from [%x,%d] nb=%d\n",
                     from.sin_addr.s_addr, from.sin_port, nbytes));
            }
            return -1;
@@ -1068,21 +1163,22 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
            *host = from.sin_addr.s_addr;
            *port = from.sin_port;
            if (p->header.type > 0 && p->header.type < RX_N_PACKET_TYPES) {
-               MUTEX_ENTER(&rx_stats_mutex);
-               rx_stats.packetsRead[p->header.type - 1]++;
-               MUTEX_EXIT(&rx_stats_mutex);
+                if (rx_stats_active) {
+                    rx_atomic_inc(&rx_stats.packetsRead[p->header.type - 1]);
+                }
            }
 
+#ifdef RX_TRIMDATABUFS
            /* Free any empty packet buffers at the end of this packet */
            rxi_TrimDataBufs(p, 1);
-
+#endif
            return 0;
        }
     } else
        return code;
 }
 
-/* rxk_Listener() 
+/* rxk_Listener()
  *
  * Listen for packets on socket. This thread is typically started after
  * rx_Init has called rxi_StartListener(), but nevertheless, ensures that
@@ -1097,28 +1193,12 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
  * OS's socket receive routine returns as a result of a signal.
  */
 int rxk_ListenerPid;           /* Used to signal process to wakeup at shutdown */
-
-#ifdef AFS_SUN5_ENV
-/*
- * Run the listener as a kernel thread.
- */
-void
-rxk_Listener(void)
-{
-    extern id_t syscid;
-    void rxk_ListenerProc(void);
-    if (thread_create
-       (NULL, DEFAULTSTKSZ, rxk_ListenerProc, 0, 0, &p0, TS_RUN,
-        minclsyspri) == NULL)
-       osi_Panic("rxk_Listener: failed to start listener thread!\n");
-}
+#ifdef AFS_LINUX20_ENV
+struct task_struct *rxk_ListenerTask;
+#endif
 
 void
-rxk_ListenerProc(void)
-#else /* AFS_SUN5_ENV */
-void
 rxk_Listener(void)
-#endif                         /* AFS_SUN5_ENV */
 {
     struct rx_packet *rxp = NULL;
     int code;
@@ -1126,6 +1206,7 @@ rxk_Listener(void)
 
 #ifdef AFS_LINUX20_ENV
     rxk_ListenerPid = current->pid;
+    rxk_ListenerTask = current;
 #endif
 #ifdef AFS_SUN5_ENV
     rxk_ListenerPid = 1;       /* No PID, just a flag that we're alive */
@@ -1133,14 +1214,18 @@ rxk_Listener(void)
 #ifdef AFS_XBSD_ENV
     rxk_ListenerPid = curproc->p_pid;
 #endif /* AFS_FBSD_ENV */
-#if defined(AFS_DARWIN_ENV)
+#ifdef AFS_DARWIN80_ENV
+    rxk_ListenerPid = proc_selfpid();
+#elif defined(AFS_DARWIN_ENV)
     rxk_ListenerPid = current_proc()->p_pid;
 #endif
-#if defined(RX_ENABLE_LOCKS) && !defined(AFS_SUN5_ENV)
+#ifdef RX_ENABLE_LOCKS
     AFS_GUNLOCK();
-#endif /* RX_ENABLE_LOCKS && !AFS_SUN5_ENV */
-
+#endif /* RX_ENABLE_LOCKS */
     while (afs_termState != AFSOP_STOP_RXK_LISTENER) {
+        /* See if a check for additional packets was issued */
+        rx_CheckPackets();
+
        if (rxp) {
            rxi_RestoreDataBufs(rxp);
        } else {
@@ -1157,16 +1242,21 @@ rxk_Listener(void)
     AFS_GLOCK();
 #endif /* RX_ENABLE_LOCKS */
     if (afs_termState == AFSOP_STOP_RXK_LISTENER) {
+#ifdef AFS_SUN510_ENV
+       afs_termState = AFSOP_STOP_NETIF;
+#else
        afs_termState = AFSOP_STOP_COMPLETE;
+#endif
        osi_rxWakeup(&afs_termState);
     }
     rxk_ListenerPid = 0;
-#if defined(AFS_LINUX22_ENV) || defined(AFS_SUN5_ENV)
+#ifdef AFS_LINUX20_ENV
+    rxk_ListenerTask = 0;
+    osi_rxWakeup(&rxk_ListenerTask);
+#endif
+#if defined(AFS_SUN5_ENV) || defined(AFS_FBSD_ENV)
     osi_rxWakeup(&rxk_ListenerPid);
 #endif
-#ifdef AFS_SUN5_ENV
-    AFS_GUNLOCK();
-#endif /* AFS_SUN5_ENV */
 }
 
 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_SUN5_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
@@ -1180,5 +1270,61 @@ osi_StopListener(void)
 }
 #endif
 #endif /* RXK_LISTENER_ENV */
-
 #endif /* !NCR && !UKERNEL */
+
+#if !defined(AFS_LINUX26_ENV)
+void
+#if defined(AFS_AIX_ENV)
+osi_Panic(char *msg, void *a1, void *a2, void *a3)
+#else
+osi_Panic(char *msg, ...)
+#endif
+{
+#ifdef AFS_AIX_ENV
+    if (!msg)
+       msg = "Unknown AFS panic";
+    /*
+     * we should probably use the errsave facility here. it is not
+     * varargs-aware
+     */
+
+    printf(msg, a1, a2, a3);
+    panic(msg);
+#elif defined(AFS_SGI_ENV)
+    va_list ap;
+
+    /* Solaris has vcmn_err, Sol10 01/06 may have issues. Beware. */
+    if (!msg) {
+       cmn_err(CE_PANIC, "Unknown AFS panic");
+    } else {
+       va_start(ap, msg);
+       icmn_err(CE_PANIC, msg, ap);
+       va_end(ap);
+    }
+#elif defined(AFS_DARWIN80_ENV) || (defined(AFS_LINUX22_ENV) && !defined(AFS_LINUX_26_ENV))
+    char buf[256];
+    va_list ap;
+    if (!msg)
+       msg = "Unknown AFS panic";
+
+    va_start(ap, msg);
+    vsnprintf(buf, sizeof(buf), msg, ap);
+    va_end(ap);
+    printf("%s", buf);
+    panic(buf);
+#else
+    va_list ap;
+    if (!msg)
+       msg = "Unknown AFS panic";
+
+    va_start(ap, msg);
+    vprintf(msg, ap);
+    va_end(ap);
+# ifdef AFS_LINUX20_ENV
+    * ((char *) 0) = 0;
+# else
+    panic(msg);
+# endif
+#endif
+}
+#endif