rx allow setpeermtu to take a peer
authorDerrick Brashear <shadow@dementia.org>
Tue, 1 Jun 2010 16:13:42 +0000 (12:13 -0400)
committerDerrick Brashear <shadow@dementia.org>
Wed, 2 Jun 2010 17:12:23 +0000 (10:12 -0700)
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 <jaltman@openafs.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/rx/rx.c
src/rx/rx_prototypes.h
src/rx/rx_user.c

index 0acc80d..b4d27cd 100644 (file)
@@ -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
index 77ee085..48fb89f 100644 (file)
@@ -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);
index b5b1dd0..9712120 100644 (file)
@@ -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 */