}
void
-rxi_SetPeerMtu(afs_uint32 host, afs_uint32 port, int mtu)
+rxi_SetPeerMtu(struct rx_peer *peer, afs_uint32 host, afs_uint32 port, int mtu)
{
struct rx_peer **peer_ptr = NULL, **peer_end = NULL;
- struct rx_peer *peer = NULL, *next = NULL;
+ struct rx_peer *next = NULL;
int hashIndex;
- MUTEX_ENTER(&rx_peerHashTable_lock);
- if (port == 0) {
- peer_ptr = &rx_peerHashTable[0];
- peer_end = &rx_peerHashTable[rx_hashTableSize];
- next = NULL;
- resume:
- for ( ; peer_ptr < peer_end; peer_ptr++) {
- if (!peer)
- peer = *peer_ptr;
- for ( ; peer; peer = next) {
- next = peer->next;
- if (host == peer->host)
+ if (!peer) {
+ MUTEX_ENTER(&rx_peerHashTable_lock);
+ if (port == 0) {
+ peer_ptr = &rx_peerHashTable[0];
+ peer_end = &rx_peerHashTable[rx_hashTableSize];
+ next = NULL;
+ resume:
+ for ( ; peer_ptr < peer_end; peer_ptr++) {
+ if (!peer)
+ peer = *peer_ptr;
+ for ( ; peer; peer = next) {
+ next = peer->next;
+ if (host == peer->host)
+ break;
+ }
+ }
+ } else {
+ hashIndex = PEER_HASH(host, port);
+ for (peer = rx_peerHashTable[hashIndex]; peer; peer = peer->next) {
+ if ((peer->host == host) && (peer->port == port))
break;
}
}
} else {
- hashIndex = PEER_HASH(host, port);
- for (peer = rx_peerHashTable[hashIndex]; peer; peer = peer->next) {
- if ((peer->host == host) && (peer->port == port))
- break;
- }
+ MUTEX_ENTER(&rx_peerHashTable_lock);
}
if (peer) {
MUTEX_ENTER(&rx_peerHashTable_lock);
peer->refCount--;
- if (!port) {
+ if (host && !port) {
peer = next;
/* pick up where we left off */
goto resume;
);
if (ire && ire->ire_max_frag > 0)
- rxi_SetPeerMtu(call->conn->peer->host, 0, ire->ire_max_frag);
+ rxi_SetPeerMtu(NULL, call->conn->peer->host, 0,
+ ire->ire_max_frag);
#if defined(GLOBAL_NETSTACKID)
netstack_rele(ns);
#endif
extern char *rxi_Alloc(size_t size);
extern void rxi_Free(void *addr, size_t size);
-extern void rxi_SetPeerMtu(afs_uint32 host, afs_uint32 port,
- int mtu);
+extern void rxi_SetPeerMtu(struct rx_peer *peer, afs_uint32 host,
+ afs_uint32 port, int mtu);
extern struct rx_peer *rxi_FindPeer(afs_uint32 host,
u_short port,
struct rx_peer *origPeer, int create);
err =(struct sock_extended_err *) CMSG_DATA(cmsg);
if (err->ee_errno == EMSGSIZE && err->ee_info >= 68) {
- rxi_SetPeerMtu(addr.sin_addr.s_addr, addr.sin_port,
+ rxi_SetPeerMtu(NULL, addr.sin_addr.s_addr, addr.sin_port,
err->ee_info - RX_IPUDP_SIZE);
}
/* other DEST_UNREACH's and TIME_EXCEEDED should be dealt with too */