/*
* 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_packet.h"
+#include "rx_internal.h"
+#include "rx_stats.h"
+#include "rx_peer.h"
#ifdef AFS_HPUX110_ENV
#include "h/tihdr.h"
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) {
return rxi_GetHostUDPSocket(htonl(INADDR_ANY), port);
}
-#if !defined(AFS_LINUX26_ENV)
-void
-osi_Panic(msg, a1, a2, a3)
- char *msg;
-{
- if (!msg)
- msg = "Unknown AFS panic";
-
- printf(msg, a1, a2, a3);
-#ifdef AFS_LINUX20_ENV
- * ((char *) 0) = 0;
-#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,
return 0;
}
+#ifndef AFS_LINUX26_ENV
/*
* osi_AssertFailK() -- used by the osi_Assert() macro.
*
#undef ADDBUF
- 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);
+ osi_Panic("%s", buf);
}
#endif
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();
#ifdef RX_ENABLE_LOCKS
AFS_GLOCK();
#endif /* RX_ENABLE_LOCKS */
+
+ return NULL;
}
#endif /* !UKERNEL */
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 {
* 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 */
dpf(("rx: packet dropped: bad ulen=%d\n", asize));
tp = NULL;
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();
/* 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
+# 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. */
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 */
- 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; */
+ rx_rto_setPeerTimeoutSecs(pp, 2);
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;
+ 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 (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;
+ rx_rto_setPeerTimeoutSecs(pp, 3);
+ pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
}
-#endif /* else AFS_USERSPACE_IP_ADDR */
+# 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)) {
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 */
-#else /* ADAPT_MTU */
- pp->rateFlag = 2; /* start timing after two full packets */
- pp->timeout.sec = 2;
- pp->ifMTU = OLD_MAX_PACKET_SIZE;
-#endif /* else ADAPT_MTU */
pp->ifMTU = rxi_AdjustIfMTU(pp->ifMTU);
pp->maxMTU = OLD_MAX_PACKET_SIZE; /* for compatibility with old guys */
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 */
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) {
rxk_shutdownPorts();
return;
}
- dpf(("shutdown_rxkernel: no udp proto"));
+ dpf(("shutdown_rxkernel: no udp proto\n"));
}
#endif /* !AIX && !SUN && !NCR && !UKERNEL */
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);
}
#else /* AFS_USERSPACE_IP_ADDR */
-#if !defined(AFS_AIX41_ENV) && !defined(AFS_DUX40_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
+#if !defined(AFS_AIX41_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
#define IFADDR2SA(f) (&((f)->ifa_addr))
#else /* AFS_AIX41_ENV */
#define IFADDR2SA(f) ((f)->ifa_addr)
int i = 0;
int different = 0;
- register int rxmtu, maxmtu;
+ int rxmtu, maxmtu;
afs_uint32 addrs[ADDRSPERSITE];
int mtus[ADDRSPERSITE];
afs_uint32 ifinaddr;
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++;
((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
addrs[i++] = ifinaddr;
- if ((ifinaddr != 0x7f000001) &&
+ if (!rx_IsLoopbackAddr(ifinaddr) &&
(maxmtu > rx_maxReceiveSize)) {
- rx_maxReceiveSize =
+ rx_maxReceiveSize =
MIN(RX_MAX_PACKET_SIZE, maxmtu);
rx_maxReceiveSize =
MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
ifnet_free_address_list(ifads);
}
}
- ifnet_list_free(ifn);
+ 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
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) {
((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);
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 */
-#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 */
+#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;
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!!! */
*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 */
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;
#endif
-#if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD50_ENV))
+#if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD_ENV))
struct mbuf *nam;
#endif
struct sockaddr_in myaddr;
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);
#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 */
if (code)
memcpy((caddr_t) bindnam->b_rptr + SO_MSGOFFSET, (caddr_t) & myaddr,
addrsize);
bindnam->b_wptr = bindnam->b_rptr + (addrsize + SO_MSGOFFSET + 1);
-
code = sobind(newSocket, bindnam, addrsize);
if (code) {
soclose(newSocket);
freeb(bindnam);
#else /* AFS_HPUX110_ENV */
#if defined(AFS_DARWIN80_ENV)
- {
+ {
int buflen = 50000;
int i,code2;
for (i=0;i<2;i++) {
}
}
#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) {
dpf(("sobind fails (%d)\n", (int)code));
soclose(newSocket);
- AFS_GLOCK();
goto bad;
}
#else /* defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV) */
-#ifdef AFS_OSF_ENV
- nam = m_getclr(M_WAIT, MT_SONAME);
-#else /* AFS_OSF_ENV */
nam = m_get(M_WAIT, MT_SONAME);
-#endif
if (nam == NULL) {
#if defined(KERNEL_HAVE_UERROR)
setuerror(ENOBUFS);
}
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
/* 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)
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;
}
#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)
*/
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()");
if (afs_termState == AFSOP_STOP_RXEVENT) {
#ifdef RXK_LISTENER_ENV
afs_termState = AFSOP_STOP_RXK_LISTENER;
-#else
-#ifdef AFS_SUN510_ENV
+#elif defined(AFS_SUN510_ENV) || defined(RXK_UPCALL_ENV)
afs_termState = AFSOP_STOP_NETIF;
#else
afs_termState = AFSOP_STOP_COMPLETE;
#endif
-#endif
osi_rxWakeup(&afs_termState);
return;
}
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 */
} 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;
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++;
- rx_stats.bogusHost = from.sin_addr.s_addr;
- MUTEX_EXIT(&rx_stats_mutex);
- dpf(("B: bogus packet from [%x,%d] nb=%d",
+ 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;
*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
struct task_struct *rxk_ListenerTask;
#endif
-#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");
-}
-
-void
-rxk_ListenerProc(void)
-#else /* AFS_SUN5_ENV */
void
rxk_Listener(void)
-#endif /* AFS_SUN5_ENV */
{
struct rx_packet *rxp = NULL;
int code;
#ifdef AFS_LINUX20_ENV
rxk_ListenerPid = current->pid;
rxk_ListenerTask = current;
+ allow_signal(SIGKILL); /* Allowed, but blocked until shutdown */
#endif
#ifdef AFS_SUN5_ENV
rxk_ListenerPid = 1; /* No PID, just a flag that we're alive */
#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 {
rxk_ListenerTask = 0;
osi_rxWakeup(&rxk_ListenerTask);
#endif
-#if defined(AFS_SUN5_ENV)
+#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)
}
#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_FBSD_ENV) || defined(UKERNEL)
+ 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("%s", 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("%s", msg);
+# endif
+#endif
+}
+#endif