sizeof(afs_int32), &tSize);
maxDgramPackets = (afs_uint32) ntohl(tSize);
maxDgramPackets = MIN(maxDgramPackets, rxi_nDgramPackets);
- maxDgramPackets =
- MIN(maxDgramPackets, (int)(peer->ifDgramPackets));
- maxDgramPackets = MIN(maxDgramPackets, tSize);
+ maxDgramPackets = MIN(maxDgramPackets, peer->ifDgramPackets);
+ if (peer->natMTU < peer->ifMTU)
+ maxDgramPackets = MIN(maxDgramPackets, rxi_AdjustDgramPackets(1, peer->natMTU));
if (maxDgramPackets > 1) {
peer->maxDgramPackets = maxDgramPackets;
call->MTU = RX_JUMBOBUFFERSIZE + RX_HEADER_SIZE;
rxi_InitPeerParams(struct rx_peer *pp)
{
afs_uint32 ppaddr;
- u_short rxmtu;
+ u_short rxmtu, maxmtu = 0;
int ix;
-
-
LOCK_IF_INIT;
if (!Inited) {
UNLOCK_IF_INIT;
LOCK_IF;
for (ix = 0; ix < rxi_numNetAddrs; ++ix) {
+ if (maxmtu < myNetMTUs[ix])
+ maxmtu = myNetMTUs[ix] - RX_IPUDP_SIZE;
if ((rxi_NetAddrs[ix] & myNetMasks[ix]) ==
(ppaddr & myNetMasks[ix])) {
#ifdef IFF_POINTOPOINT
rxmtu = myNetMTUs[ix] - RX_IPUDP_SIZE;
if (rxmtu < RX_MIN_PACKET_SIZE)
rxmtu = RX_MIN_PACKET_SIZE;
- if (pp->ifMTU < rxmtu)
- pp->ifMTU = MIN(rx_MyMaxSendSize, rxmtu);
}
}
UNLOCK_IF;
+ if (rxmtu)
+ pp->ifMTU = MIN(rx_MyMaxSendSize, rxmtu);
if (!pp->ifMTU) { /* not local */
pp->timeout.sec = 3;
- pp->ifMTU = MIN(rx_MyMaxSendSize, RX_REMOTE_PACKET_SIZE);
+ pp->ifMTU = MIN(rx_MyMaxSendSize, maxmtu ? maxmtu : RX_REMOTE_PACKET_SIZE);
}
break;
#ifdef AF_INET6