From 57d7b5ccf0ddda5a7887d7e84211c3e767a407e6 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Tue, 1 Jun 2010 12:13:42 -0400 Subject: [PATCH] rx allow setpeermtu to take a peer modify setpeermtu to work when a peer is passed in. modify existing callers. note solaris caches a whole host's pmtu, so use that on all peers at the host. Change-Id: Iba05fffd47a7c7b63742d6c539be4fe248336fb7 Reviewed-on: http://gerrit.openafs.org/2068 Reviewed-by: Jeffrey Altman Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/rx/rx.c | 47 +++++++++++++++++++++++------------------- src/rx/rx_prototypes.h | 4 ++-- src/rx/rx_user.c | 2 +- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/rx/rx.c b/src/rx/rx.c index 0acc80d23..b4d27cda6 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -2451,33 +2451,37 @@ rxi_Free(void *addr, size_t size) } 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) { @@ -2493,7 +2497,7 @@ rxi_SetPeerMtu(afs_uint32 host, afs_uint32 port, int mtu) MUTEX_ENTER(&rx_peerHashTable_lock); peer->refCount--; - if (!port) { + if (host && !port) { peer = next; /* pick up where we left off */ goto resume; @@ -5808,7 +5812,8 @@ rxi_CheckCall(struct rx_call *call) ); 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 diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index 77ee08560..48fb89f58 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -94,8 +94,8 @@ extern void rxi_FreeCall(struct rx_call *call); 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); diff --git a/src/rx/rx_user.c b/src/rx/rx_user.c index b5b1dd0b2..9712120a3 100644 --- a/src/rx/rx_user.c +++ b/src/rx/rx_user.c @@ -825,7 +825,7 @@ rxi_HandleSocketError(int socket) 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 */ -- 2.39.5