obsd44-pass1-20090123
[openafs.git] / src / rx / rx_kcommon.c
index aa0e87a..8d174be 100644 (file)
@@ -30,7 +30,7 @@ int (*rxk_PacketArrivalProc) (struct rx_packet * ahandle, struct sockaddr_in * a
 int (*rxk_GetPacketProc) (struct rx_packet **ahandle, int asize);
 #endif
 
-osi_socket *rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen);
+osi_socket *rxk_NewSocketHost(afs_uint32 ahost, short aport);
 extern struct interfaceAddr afs_cb_interface;
 
 rxk_ports_t rxk_ports;
@@ -108,43 +108,59 @@ rxk_shutdownPorts(void)
 }
 
 osi_socket
-rxi_GetHostUDPSocket(struct sockaddr_storage *saddr, int salen)
+rxi_GetHostUDPSocket(u_int host, u_short port)
 {
     osi_socket *sockp;
-    sockp = (osi_socket *)rxk_NewSocketHost(saddr, salen);
+    sockp = (osi_socket *)rxk_NewSocketHost(host, port);
     if (sockp == (osi_socket *)0)
        return OSI_NULLSOCKET;
-    rxk_AddPort(rx_ss2pn(saddr), (char *)sockp);
+    rxk_AddPort(port, (char *)sockp);
     return (osi_socket) sockp;
 }
 
 osi_socket
 rxi_GetUDPSocket(u_short port)
 {
-    struct sockaddr_storage saddr;
-    struct sockaddr_in *sin = (struct sockaddr_in *) &saddr;
-
-    memset((void *) &saddr, 0, sizeof(saddr));
-
-    sin->sin_family = AF_INET;
-    sin->sin_addr.s_addr = htonl(INADDR_ANY);
-    sin->sin_port = port;
-
-    return rxi_GetHostUDPSocket(&saddr, sizeof(struct sockaddr_in));
+    return rxi_GetHostUDPSocket(htonl(INADDR_ANY), port);
 }
 
+#if !defined(AFS_LINUX26_ENV)
 void
-osi_Panic(msg, a1, a2, a3)
-     char *msg;
+#ifdef 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";
+    printf(msg, a1, a2, a3);
+    panic(msg);
+#elif defined(AFS_DARWIN80_ENV) && !defined(AFS_DARWIN90_ENV)
+    char buf[256];
+    va_list ap;
     if (!msg)
        msg = "Unknown AFS panic";
 
-    printf(msg, a1, a2, a3);
-#ifdef AFS_LINUX24_ENV
-    * ((char *) 0) = 0; 
+    va_start(ap, msg);
+    vsnprintf(buf, sizeof(buf), msg, ap);
+    va_end(ap);
+    printf(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
 }
 
@@ -270,15 +286,23 @@ osi_AssertFailK(const char *expr, const char *file, int line)
 
     osi_Panic(buf);
 }
+#else
+void
+osi_AssertFailK(const char *expr, const char *file, int line)
+{
+    printk(KERN_CRIT "assertion failed: %s, file: %s, line: %d\n", expr, file, line);
+}
+#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;
 
+/* jaltman - rxi_dataQuota is protected by a mutex everywhere else */
     rxi_MorePackets(rx_maxReceiveWindow + 2);  /* alloc more packets */
     rxi_dataQuota += rx_initSendWindow;        /* Reserve some pkts for hard times */
     /* threadID is used for making decisions in GetCall.  Get it by bumping
@@ -292,6 +316,8 @@ rx_ServerProc(void)
 #ifdef RX_ENABLE_LOCKS
     AFS_GLOCK();
 #endif /* RX_ENABLE_LOCKS */
+
+    return NULL;
 }
 #endif /* !UKERNEL */
 
@@ -315,9 +341,11 @@ MyPacketProc(struct rx_packet **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) {
+                    MUTEX_ENTER(&rx_stats_mutex);
+                    rx_stats.noPacketBuffersOnRead++;
+                    MUTEX_EXIT(&rx_stats_mutex);
+                }
            }
        }
     } else {
@@ -326,9 +354,11 @@ MyPacketProc(struct rx_packet **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) {
+            MUTEX_ENTER(&rx_stats_mutex);
+            rx_stats.bogusPacketOnRead++;
+            MUTEX_EXIT(&rx_stats_mutex);
+        }
        /* I DON"T LIKE THIS PRINTF -- PRINTFS MAKE THINGS VERY VERY SLOOWWW */
        dpf(("rx: packet dropped: bad ulen=%d\n", asize));
        tp = NULL;
@@ -351,8 +381,9 @@ MyArrivalProc(struct rx_packet *ahandle,
     ahandle->length = asize - RX_HEADER_SIZE;
     rxi_DecodePacketHeader(ahandle);
     ahandle =
-       rxi_ReceivePacket(ahandle, arock, (struct sockaddr_storage *) afrom,
-                         NULL, NULL);
+       rxi_ReceivePacket(ahandle, arock,
+                         afrom->sin_addr.s_addr, afrom->sin_port, NULL,
+                         NULL);
 
     /* free the packet if it has been returned */
     if (ahandle)
@@ -383,7 +414,7 @@ rxi_InitPeerParams(register struct rx_peer *pp)
 #ifdef ADAPT_MTU
 #ifndef AFS_SUN5_ENV
 #ifdef AFS_USERSPACE_IP_ADDR
-    i = rxi_Findcbi(rx_HostOf(pp));
+    i = rxi_Findcbi(pp->host);
     if (i == -1) {
        pp->timeout.sec = 3;
        /* pp->timeout.usec = 0; */
@@ -413,7 +444,7 @@ rxi_InitPeerParams(register struct rx_peer *pp)
        (void)rxi_GetIFInfo();
 #endif
 
-    ifn = rxi_FindIfnet(rx_HostOf(pp), NULL);
+    ifn = rxi_FindIfnet(pp->host, NULL);
     if (ifn) {
        pp->timeout.sec = 2;
        /* pp->timeout.usec = 0; */
@@ -439,7 +470,7 @@ rxi_InitPeerParams(register struct rx_peer *pp)
     }
 #endif /* else AFS_USERSPACE_IP_ADDR */
 #else /* AFS_SUN5_ENV */
-    mtu = rxi_FindIfMTU(rx_HostOf(pp));
+    mtu = rxi_FindIfMTU(pp->host);
 
     if (mtu <= 0) {
        pp->timeout.sec = 3;
@@ -473,7 +504,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 */
@@ -520,7 +551,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];
@@ -529,7 +560,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);
@@ -635,11 +668,13 @@ rxi_GetIFInfo(void)
     afs_uint32 ifinaddr;
 #if defined(AFS_DARWIN80_ENV)
     errno_t t;
-    int cnt=0;
-    ifaddr_t *ifads, ifad;
-    register ifnet_t ifn;
+    unsigned int count;
+    int cnt=0, m, j;
+    ifaddr_t *ifads;
+    ifnet_t *ifn;
     struct sockaddr sout;
     struct sockaddr_in *sin;
+    struct in_addr pin;
 #else
     struct ifaddr *ifad;       /* ifnet points to a if_addrlist of ifaddrs */
     register struct ifnet *ifn;
@@ -649,31 +684,38 @@ rxi_GetIFInfo(void)
     memset(mtus, 0, sizeof(mtus));
 
 #if defined(AFS_DARWIN80_ENV)
-    t = ifnet_get_address_list_family(NULL, &ifads, AF_INET);
-    if (t == 0) {
-       rxmtu = ifnet_mtu(ifn) - RX_IPUDP_SIZE;
-       while((ifads[cnt] != NULL) && cnt < ADDRSPERSITE) {
-           t = ifaddr_address(ifads[cnt], &sout, sizeof(sout));
-           sin = (struct sockaddr_in *)&sout;
-           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 ((ifinaddr != 0x7f000001) && (maxmtu > rx_maxReceiveSize)) {
-               rx_maxReceiveSize = MIN(RX_MAX_PACKET_SIZE, maxmtu);
-               rx_maxReceiveSize =
-                   MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
+    if (!ifnet_list_get(AF_INET, &ifn, &count)) {
+       for (m = 0; m < count; m++) {
+           if (!ifnet_get_address_list(ifn[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 = ifnet_mtu(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 ((ifinaddr != 0x7f000001) && 
+                           (maxmtu > rx_maxReceiveSize)) {
+                           rx_maxReceiveSize = 
+                               MIN(RX_MAX_PACKET_SIZE, maxmtu);
+                           rx_maxReceiveSize =
+                               MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
+                       }
+                       cnt++;
+                   }
+               }
+               ifnet_free_address_list(ifads);
            }
-           cnt++;
        }
-       ifnet_free_address_list(ifads);
+       ifnet_list_free(ifn);
     }
 #else
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
@@ -729,10 +771,10 @@ 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;
@@ -834,7 +876,7 @@ rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
  * in network byte order.
  */
 osi_socket *
-rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
+rxk_NewSocketHost(afs_uint32 ahost, short aport)
 {
     register afs_int32 code;
 #ifdef AFS_DARWIN80_ENV
@@ -845,6 +887,7 @@ rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
 #if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD50_ENV))
     struct mbuf *nam;
 #endif
+    struct sockaddr_in myaddr;
 #ifdef AFS_HPUX110_ENV
     /* prototype copied from kernel source file streams/str_proto.h */
     extern MBLKP allocb_wait(int, int);
@@ -868,7 +911,7 @@ rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
     /* we need a file associated with the socket so sosend in NetSend 
      * will not fail */
     /* blocking socket */
-    code = socreate(rx_ssfamily(saddr), &newSocket, SOCK_DGRAM, 0, 0);
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, 0);
     fp = falloc();
     if (!fp)
        goto bad;
@@ -880,32 +923,38 @@ rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
     newSocket->so_fp = (void *)fp;
 
 #else /* AFS_HPUX110_ENV */
-    code = socreate(rx_ssfamilty(saddr), &newSocket, SOCK_DGRAM, 0, SS_NOWAIT);
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, SS_NOWAIT);
 #endif /* else AFS_HPUX110_ENV */
 #elif defined(AFS_SGI65_ENV) || defined(AFS_OBSD_ENV)
-    code = socreate(rx_ssfamily(saddr), &newSocket, SOCK_DGRAM, IPPROTO_UDP);
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP);
 #elif defined(AFS_FBSD50_ENV)
-    code = socreate(rx_ssfamily(saddr), &newSocket, SOCK_DGRAM, IPPROTO_UDP,
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP,
                    afs_osi_credp, curthread);
 #elif defined(AFS_FBSD40_ENV)
-    code = socreate(rx_ssfamily(saddr), &newSocket, SOCK_DGRAM, IPPROTO_UDP,
-                   curproc);
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP, curproc);
 #elif defined(AFS_DARWIN80_ENV)
-    code = sock_socket(rx_ssfamily(saddr), SOCK_DGRAM, IPPROTO_UDP, NULL, NULL,
-                      &newSocket);
+    code = sock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, NULL, &newSocket);
 #else
-    code = socreate(rx_ssfamily(saddr), &newSocket, SOCK_DGRAM, 0);
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0);
 #endif /* AFS_HPUX102_ENV */
     if (code)
        goto bad;
 
+    memset(&myaddr, 0, sizeof myaddr);
+    myaddr.sin_family = AF_INET;
+    myaddr.sin_port = aport;
+    myaddr.sin_addr.s_addr = ahost;
+#ifdef STRUCT_SOCKADDR_HAS_SA_LEN
+    myaddr.sin_len = sizeof(myaddr);
+#endif
+
 #ifdef AFS_HPUX110_ENV
     bindnam = allocb_wait((addrsize + SO_MSGOFFSET + 1), BPRI_MED);
     if (!bindnam) {
        setuerror(ENOBUFS);
        goto bad;
     }
-    memcpy((caddr_t) bindnam->b_rptr + SO_MSGOFFSET, (caddr_t) addr,
+    memcpy((caddr_t) bindnam->b_rptr + SO_MSGOFFSET, (caddr_t) & myaddr,
           addrsize);
     bindnam->b_wptr = bindnam->b_rptr + (addrsize + SO_MSGOFFSET + 1);
 
@@ -946,11 +995,11 @@ rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
 #endif
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
 #if defined(AFS_FBSD50_ENV)
-    code = sobind(newSocket, (struct sockaddr *) saddr, curthread);
+    code = sobind(newSocket, (struct sockaddr *)&myaddr, curthread);
 #elif defined(AFS_FBSD40_ENV)
-    code = sobind(newSocket, (struct sockaddr *) saddr, curproc);
+    code = sobind(newSocket, (struct sockaddr *)&myaddr, curproc);
 #else
-    code = sobind(newSocket, (struct sockaddr *) saddr);
+    code = sobind(newSocket, (struct sockaddr *)&myaddr);
 #endif
     if (code) {
        dpf(("sobind fails (%d)\n", (int)code));
@@ -970,12 +1019,14 @@ rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
 #endif
        goto bad;
     }
-    nam->m_len = salen;
-    memcpy(mtod(nam, caddr_t), saddr, salen);
-#ifdef AFS_SGI65_ENV
+    nam->m_len = sizeof(myaddr);
+    memcpy(mtod(nam, caddr_t), &myaddr, sizeof(myaddr));
+#if defined(AFS_SGI65_ENV)
     BHV_PDATA(&bhv) = (void *)newSocket;
     code = sobind(&bhv, nam);
     m_freem(nam);
+#elif defined(AFS_OBSD44_ENV)
+    code = sobind(newSocket, nam, osi_curproc());
 #else
     code = sobind(newSocket, nam);
 #endif
@@ -1007,16 +1058,7 @@ rxk_NewSocketHost(struct sockaddr_storage *saddr, int salen)
 osi_socket *
 rxk_NewSocket(short aport)
 {
-    struct sockaddr_storage saddr;
-    struct sockaddr_in *sin = (struct sockaddr_in *) &saddr;
-
-    memset((void *) &saddr, 0, sizeof(saddr));
-
-    sin->sin_family = AF_INET;
-    sin->sin_addr.s_addr = 0;
-    sin->sin_port = aport;
-
-    return rxk_NewSocketHost(&saddr, sizeof(struct sockaddr_in));
+    return rxk_NewSocketHost(0, aport);
 }
 
 /* free socket allocated by rxk_NewSocket */
@@ -1080,8 +1122,12 @@ afs_rxevent_daemon(void)
 #ifdef RXK_LISTENER_ENV
            afs_termState = AFSOP_STOP_RXK_LISTENER;
 #else
+#ifdef AFS_SUN510_ENV
+           afs_termState = AFSOP_STOP_NETIF;
+#else
            afs_termState = AFSOP_STOP_COMPLETE;
 #endif
+#endif
            osi_rxWakeup(&afs_termState);
            return;
        }
@@ -1093,10 +1139,10 @@ afs_rxevent_daemon(void)
 
 /* rxk_ReadPacket returns 1 if valid packet, 0 on error. */
 int
-rxk_ReadPacket(osi_socket so, struct rx_packet *p,
-              struct sockaddr_storage *saddr, int *slen)
+rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
 {
     int code;
+    struct sockaddr_in from;
     int nbytes;
     afs_int32 rlen;
     register afs_int32 tlen;
@@ -1132,8 +1178,7 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p,
        AFS_GUNLOCK();
     }
 #endif
-    code = osi_NetReceive(rx_socket, saddr, slen, p->wirevec, p->niovecs,
-                         &nbytes);
+    code = osi_NetReceive(rx_socket, &from, p->wirevec, p->niovecs, &nbytes);
 
 #ifdef RX_KERNEL_TRACE
     if (ICL_SETACTIVE(afs_iclSetp)) {
@@ -1150,32 +1195,28 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p,
        p->length = nbytes - RX_HEADER_SIZE;;
        if ((nbytes > tlen) || (p->length & 0x8000)) {  /* Bogus packet */
            if (nbytes <= 0) {
-               MUTEX_ENTER(&rx_stats_mutex);
-               rx_stats.bogusPacketOnRead++;
-               switch (rx_ssfamily(saddr)) {
-               case AF_INET:
-                   rx_stats.bogusHost = rx_ss2sin(saddr)->sin_addr.s_addr;
-                   break;
-               default:
-#ifdef AF_INET6
-               case AF_INET6:
-#endif /* AF_INET6 */
-                   rx_stats.bogusHost = 0xffffffff;
-               }
-               MUTEX_EXIT(&rx_stats_mutex);
+                if (rx_stats_active) {
+                    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",
-                   ntohl(rx_ss2v4addr(saddr)), ntohs(rx_ss2pn(saddr)),
-                   nbytes));
+                    from.sin_addr.s_addr, from.sin_port, nbytes));
            }
            return -1;
        } else {
            /* Extract packet header. */
            rxi_DecodePacketHeader(p);
 
+           *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) {
+                    MUTEX_ENTER(&rx_stats_mutex);
+                    rx_stats.packetsRead[p->header.type - 1]++;
+                    MUTEX_EXIT(&rx_stats_mutex);
+                }
            }
 
            /* Free any empty packet buffers at the end of this packet */
@@ -1202,6 +1243,9 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p,
  * 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_LINUX20_ENV
+struct task_struct *rxk_ListenerTask;
+#endif
 
 #ifdef AFS_SUN5_ENV
 /*
@@ -1226,11 +1270,12 @@ rxk_Listener(void)
 #endif                         /* AFS_SUN5_ENV */
 {
     struct rx_packet *rxp = NULL;
-    struct sockaddr_storage saddr;
-    int code, slen;
+    int code;
+    int host, port;
 
 #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 */
@@ -1254,8 +1299,8 @@ rxk_Listener(void)
            if (!rxp)
                osi_Panic("rxk_Listener: No more Rx buffers!\n");
        }
-       if (!(code = rxk_ReadPacket(rx_socket, rxp, &saddr, &slen))) {
-           rxp = rxi_ReceivePacket(rxp, rx_socket, &saddr, slen, 0, 0);
+       if (!(code = rxk_ReadPacket(rx_socket, rxp, &host, &port))) {
+           rxp = rxi_ReceivePacket(rxp, rx_socket, host, port, 0, 0);
        }
     }
 
@@ -1263,11 +1308,19 @@ 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)
     osi_rxWakeup(&rxk_ListenerPid);
 #endif
 #ifdef AFS_SUN5_ENV