#include "rx_internal.h"
#include "rx_stats.h"
+#include "rx_peer.h"
#include "rx_conn.h"
#include "rx_call.h"
static void rxi_SendDebugPacket(struct rx_packet *apacket, osi_socket asocket,
afs_uint32 ahost, short aport,
afs_int32 istack);
+static struct rx_packet *rxi_AllocPacketNoLock(int class);
+
+#ifndef KERNEL
+static void rxi_MorePacketsNoLock(int apackets);
+#endif
#ifdef RX_ENABLE_TSFPQ
-static int
-rxi_FreeDataBufsTSFPQ(struct rx_packet *p, afs_uint32 first, int flush_global);
+static int rxi_FreeDataBufsTSFPQ(struct rx_packet *p, afs_uint32 first,
+ int flush_global);
+static void rxi_AdjustLocalPacketsTSFPQ(int num_keep_local,
+ int allow_overcommit);
#else
-static int rxi_FreeDataBufsToQueue(struct rx_packet *p,
- afs_uint32 first,
+static void rxi_FreePacketNoLock(struct rx_packet *p);
+static int rxi_FreeDataBufsNoLock(struct rx_packet *p, afs_uint32 first);
+static int rxi_FreeDataBufsToQueue(struct rx_packet *p, afs_uint32 first,
struct rx_queue * q);
#endif
#ifndef KERNEL
/* Add more packet buffers */
-void
+static void
rxi_MorePacketsNoLock(int apackets)
{
#ifdef RX_ENABLE_TSFPQ
}
#ifdef RX_ENABLE_TSFPQ
-void
+static void
rxi_AdjustLocalPacketsTSFPQ(int num_keep_local, int allow_overcommit)
{
struct rx_ts_info_t * rx_ts_info;
*/
/* Actually free the packet p. */
-#ifdef RX_ENABLE_TSFPQ
-void
-rxi_FreePacketNoLock(struct rx_packet *p)
-{
- struct rx_ts_info_t * rx_ts_info;
- dpf(("Free %"AFS_PTR_FMT"\n", p));
-
- RX_TS_INFO_GET(rx_ts_info);
- RX_TS_FPQ_CHECKIN(rx_ts_info,p);
- if (rx_ts_info->_FPQ.len > rx_TSFPQLocalMax) {
- RX_TS_FPQ_LTOG(rx_ts_info);
- }
-}
-#else /* RX_ENABLE_TSFPQ */
-void
+#ifndef RX_ENABLE_TSFPQ
+static void
rxi_FreePacketNoLock(struct rx_packet *p)
{
dpf(("Free %"AFS_PTR_FMT"\n", p));
#endif /* RX_ENABLE_TSFPQ */
#ifdef RX_ENABLE_TSFPQ
-void
+static void
rxi_FreePacketTSFPQ(struct rx_packet *p, int flush_global)
{
struct rx_ts_info_t * rx_ts_info;
return count;
}
-#endif
/*
* free packet continuation buffers into the global free packet pool
* returns:
* zero always
*/
-int
+static int
rxi_FreeDataBufsNoLock(struct rx_packet *p, afs_uint32 first)
{
struct iovec *iov;
return 0;
}
-#ifdef RX_ENABLE_TSFPQ
+#else
+
/*
* free packet continuation buffers into the thread-local free pool
*
* The header is absolutely necessary, besides, this is the way the
* length field is usually used */
#ifdef RX_ENABLE_TSFPQ
-struct rx_packet *
+static struct rx_packet *
rxi_AllocPacketNoLock(int class)
{
struct rx_packet *p;
return p;
}
#else /* RX_ENABLE_TSFPQ */
-struct rx_packet *
+static struct rx_packet *
rxi_AllocPacketNoLock(int class)
{
struct rx_packet *p;
#endif /* RX_ENABLE_TSFPQ */
#ifdef RX_ENABLE_TSFPQ
-struct rx_packet *
+static struct rx_packet *
rxi_AllocPacketTSFPQ(int class, int pull_global)
{
struct rx_packet *p;
u_short * port)
{
struct sockaddr_in from;
- unsigned int nbytes;
+ int nbytes;
afs_int32 rlen;
afs_uint32 tlen, savelen;
struct msghdr msg;
p->wirevec[p->niovecs - 1].iov_len = savelen;
p->length = (u_short)(nbytes - RX_HEADER_SIZE);
- if ((nbytes > tlen) || (p->length & 0x8000)) { /* Bogus packet */
+ if (nbytes < 0 || (nbytes > tlen) || (p->length & 0x8000)) { /* Bogus packet */
if (nbytes < 0 && errno == EWOULDBLOCK) {
if (rx_stats_active)
rx_atomic_inc(&rx_stats.noPacketOnRead);
*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) {
- struct rx_peer *peer;
- rx_atomic_inc(&rx_stats.packetsRead[p->header.type - 1]);
- /*
- * Try to look up this peer structure. If it doesn't exist,
- * don't create a new one -
- * we don't keep count of the bytes sent/received if a peer
- * structure doesn't already exist.
- *
- * The peer/connection cleanup code assumes that there is 1 peer
- * per connection. If we actually created a peer structure here
- * and this packet was an rxdebug packet, the peer structure would
- * never be cleaned up.
- */
- peer = rxi_FindPeer(*host, *port, 0, 0);
- /* Since this may not be associated with a connection,
- * it may have no refCount, meaning we could race with
- * ReapConnections
- */
- if (peer && (peer->refCount > 0)) {
- MUTEX_ENTER(&peer->peer_lock);
- hadd32(peer->bytesReceived, p->length);
- MUTEX_EXIT(&peer->peer_lock);
- }
- }
+ if (rx_stats_active
+ && p->header.type > 0 && p->header.type < RX_N_PACKET_TYPES) {
+
+ rx_atomic_inc(&rx_stats.packetsRead[p->header.type - 1]);
}
#ifdef RX_TRIMDATABUFS
tpeer.ifMTU = htons(tp->ifMTU);
tpeer.idleWhen = htonl(tp->idleWhen);
tpeer.refCount = htons(tp->refCount);
- tpeer.burstSize = tp->burstSize;
- tpeer.burst = tp->burst;
- tpeer.burstWait.sec = htonl(tp->burstWait.sec);
- tpeer.burstWait.usec = htonl(tp->burstWait.usec);
+ tpeer.burstSize = 0;
+ tpeer.burst = 0;
+ tpeer.burstWait.sec = 0;
+ tpeer.burstWait.usec = 0;
tpeer.rtt = htonl(tp->rtt);
tpeer.rtt_dev = htonl(tp->rtt_dev);
tpeer.nSent = htonl(tp->nSent);
tpeer.reSends = htonl(tp->reSends);
- tpeer.inPacketSkew = htonl(tp->inPacketSkew);
- tpeer.outPacketSkew = htonl(tp->outPacketSkew);
tpeer.natMTU = htons(tp->natMTU);
tpeer.maxMTU = htons(tp->maxMTU);
tpeer.maxDgramPackets = htons(tp->maxDgramPackets);
afs_Trace1(afs_iclSetp, CM_TRACE_TIMESTAMP, ICL_TYPE_STRING,
"before osi_NetSend()");
AFS_GUNLOCK();
- } else
+ }
#else
if (waslocked)
AFS_GUNLOCK();
"after osi_NetSend()");
if (!waslocked)
AFS_GUNLOCK();
- } else
+ }
#else
if (waslocked)
AFS_GLOCK();
afs_Trace1(afs_iclSetp, CM_TRACE_TIMESTAMP, ICL_TYPE_STRING,
"before osi_NetSend()");
AFS_GUNLOCK();
- } else
+ }
#else
if (waslocked)
AFS_GUNLOCK();
"after osi_NetSend()");
if (!waslocked)
AFS_GUNLOCK();
- } else
+ }
#else
if (waslocked)
AFS_GLOCK();