darwin rxevent sleep instead of polling
[openafs.git] / src / rx / rx_kcommon.c
index 9dac112..7aa71a9 100644 (file)
@@ -14,8 +14,6 @@
 #include <afsconfig.h>
 #include "afs/param.h"
 
-RCSID
-    ("$Header$");
 
 #include "rx/rx_kcommon.h"
 
@@ -78,8 +76,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) {
@@ -126,13 +124,13 @@ rxi_GetUDPSocket(u_short port)
 
 #if !defined(AFS_LINUX26_ENV)
 void
-#ifdef AFS_AIX_ENV
+#if defined(AFS_AIX_ENV) || defined(AFS_SGI_ENV)
 osi_Panic(char *msg, void *a1, void *a2, void *a3)
 #else
 osi_Panic(char *msg, ...)
 #endif
 {
-#ifdef AFS_AIX_ENV
+#if defined(AFS_AIX_ENV) || defined(AFS_SGI_ENV)
     if (!msg)
         msg = "Unknown AFS panic";
     printf(msg, a1, a2, a3);
@@ -284,7 +282,7 @@ osi_AssertFailK(const char *expr, const char *file, int line)
 
 #undef ADDBUF
 
-    osi_Panic(buf);
+    osi_Panic("%s", buf);
 }
 #else
 void
@@ -406,19 +404,21 @@ 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;
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     } else {
        pp->timeout.sec = 2;
        /* pp->timeout.usec = 0; */
@@ -434,48 +434,50 @@ rxi_InitPeerParams(register struct rx_peer *pp)
                pp->ifMTU = rxmtu;
        }
     } else {                   /* couldn't find the interface, so assume the worst */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     }
-#else /* AFS_USERSPACE_IP_ADDR */
-    AFS_IFNET_T 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; */
        pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
-#ifdef IFF_POINTOPOINT
-       if (ifnet_flags(ifn) & 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;
            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 (ifnet_mtu(ifn) > (RX_IPUDP_SIZE + RX_HEADER_SIZE)) {
-           rxmtu = ifnet_mtu(ifn) - 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;
+       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;
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     } else {
        pp->timeout.sec = 2;
        /* pp->timeout.usec = 0; */
@@ -491,9 +493,9 @@ rxi_InitPeerParams(register struct rx_peer *pp)
                pp->ifMTU = rxmtu;
        }
     } else {                   /* couldn't find the interface, so assume the worst */
-       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE,rx_MyMaxSendSize);
     }
-#endif /* AFS_SUN5_ENV */
+# endif /* AFS_SUN5_ENV */
 #else /* ADAPT_MTU */
     pp->rateFlag = 2;          /* start timing after two full packets */
     pp->timeout.sec = 2;
@@ -529,7 +531,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) {
@@ -662,7 +664,7 @@ rxi_GetIFInfo(void)
     int i = 0;
     int different = 0;
 
-    register int rxmtu, maxmtu;
+    int rxmtu, maxmtu;
     afs_uint32 addrs[ADDRSPERSITE];
     int mtus[ADDRSPERSITE];
     afs_uint32 ifinaddr;
@@ -670,27 +672,27 @@ rxi_GetIFInfo(void)
     errno_t t;
     unsigned int count;
     int cnt=0, m, j;
-    ifaddr_t *ifads;
-    ifnet_t *ifn;
+    rx_ifaddr_t *ifads;
+    rx_ifnet_t *ifns;
     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;
+    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, &ifn, &count)) {
+    if (!ifnet_list_get(AF_INET, &ifns, &count)) {
        for (m = 0; m < count; m++) {
-           if (!ifnet_get_address_list(ifn[m], &ifads)) {
+           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 = ifnet_mtu(ifaddr_ifnet(ifads[j])) - RX_IPUDP_SIZE;
+                       rxmtu = rx_ifnet_mtu(rx_ifaddr_ifnet(ifads[j])) - RX_IPUDP_SIZE;
                        ifinaddr = ntohl(sin->sin_addr.s_addr);
                        if (myNetAddrs[i] != ifinaddr) {
                            different++;
@@ -715,7 +717,7 @@ rxi_GetIFInfo(void)
                ifnet_free_address_list(ifads);
            }
        }
-       ifnet_list_free(ifn);
+       ifnet_list_free(ifns);
     }
 #else
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
@@ -782,45 +784,27 @@ rxi_GetIFInfo(void)
 
 #if defined(AFS_DARWIN60_ENV) || defined(AFS_XBSD_ENV)
 /* Returns ifnet which best matches address */
-#ifdef AFS_DARWIN80_ENV
-ifnet_t
-#else
-struct ifnet *
-#endif
+rx_ifnet_t
 rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
 {
     struct sockaddr_in s, sr;
-#ifdef AFS_DARWIN80_ENV
-    ifaddr_t ifad;
-#else
-    struct ifaddr *ifad;
-#endif
+    rx_ifaddr_t ifad;
 
     s.sin_family = AF_INET;
     s.sin_addr.s_addr = addr;
-#ifdef AFS_DARWIN80_ENV
-    ifad = ifaddr_withnet((struct sockaddr *)&s);
-#else
-    ifad = ifa_ifwithnet((struct sockaddr *)&s);
-#endif
+    ifad = rx_ifaddr_withnet((struct sockaddr *)&s);
 
-#ifdef AFS_DARWIN80_ENV
     if (ifad && maskp) {
-       ifaddr_netmask(ifad, (struct sockaddr *)&sr, sizeof(sr));
+       rx_ifaddr_netmask(ifad, (struct sockaddr *)&sr, sizeof(sr));
        *maskp = sr.sin_addr.s_addr;
     }
-    return (ifad ? ifaddr_ifnet(ifad) : NULL);
-#else
-    if (ifad && maskp)
-       *maskp = ((struct sockaddr_in *)ifad->ifa_netmask)->sin_addr.s_addr;
-    return (ifad ? ifad->ifa_ifp : NULL);
-#endif
+    return (ifad ? rx_ifaddr_ifnet(ifad) : NULL);
 }
 
 #else /* DARWIN60 || XBSD */
 
 /* Returns ifnet which best matches address */
-struct ifnet *
+rx_ifnet_t
 rxi_FindIfnet(afs_uint32 addr, afs_uint32 * maskp)
 {
     int match_value = 0;
@@ -878,7 +862,7 @@ 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
@@ -1063,7 +1047,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)
@@ -1090,6 +1074,20 @@ rxk_FreeSocket(register struct socket *asocket)
 #endif /* !SUN5 && !LINUX20 */
 
 #if defined(RXK_LISTENER_ENV) || defined(AFS_SUN5_ENV)
+#ifdef AFS_DARWIN80_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)
  */
@@ -1113,7 +1111,12 @@ afs_rxevent_daemon(void)
        afs_Trace1(afs_iclSetp, CM_TRACE_TIMESTAMP, ICL_TYPE_STRING,
                   "before afs_osi_Wait()");
 #endif
+#ifdef AFS_DARWIN80_ENV
+       afs_osi_TimedSleep(&afs_termState, ((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()");
@@ -1145,7 +1148,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 */
@@ -1197,8 +1200,8 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
            if (nbytes <= 0) {
                 if (rx_stats_active) {
                     MUTEX_ENTER(&rx_stats_mutex);
-                    rx_AtomicIncrement_NL(rx_stats.bogusPacketOnRead);
-                    rx_AtomicSwap_NL(&rx_stats.bogusHost, from.sin_addr.s_addr);
+                    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",
@@ -1212,13 +1215,17 @@ 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) {
-                if (rx_stats_active) 
-                    rx_AtomicIncrement(rx_stats.packetsRead[p->header.type - 1], rx_stats_mutex);
+                if (rx_stats_active) {
+                    MUTEX_ENTER(&rx_stats_mutex);
+                    rx_stats.packetsRead[p->header.type - 1]++;
+                    MUTEX_EXIT(&rx_stats_mutex);
+                }
            }
 
+#ifdef RX_TRIMDATABUFS
            /* Free any empty packet buffers at the end of this packet */
            rxi_TrimDataBufs(p, 1);
-
+#endif
            return 0;
        }
     } else