I encountered a strange problem with PMTU discovery not working properly on various machines when the packets were tunneled over a GIF / IPSEC Transport type tunnel (both ends running FreeBSD 6.0). Configuration files attached.
Various older FreeBSD systems (it seemed systems that had jails running) and also Windows Virtual Machines running in Microsoft's Virtual Server 2005 system, did not perform PMTU discovery properly. The FreeBSD 6.0 routers were sending out ICMP host-unreachable need-fragment packets without an MTU hint. Most machines handle this fine, but the ones noted above did not decrease PMTU for the connection. The attached patch makes sure that the FreeBSD 6.0 router will include an MTU hint in the ICMP packet. The problem was caused by the IPSec lookup in ip_forward() returning an secpolicy pointer, but then that pointer having no details (such as request, etc...) contained in it. The attached patch (against 6.0) covers that eventuality. The 'bug' is obviously in the machines that don't handle the missing MTU hint properly, but since we can't patch Windows, this patch helps alleviate the problem from the other side. Cheers, Nate
--- sys/netinet/ip_input.c.orig Wed Jan 4 10:18:01 2006 +++ sys/netinet/ip_input.c Wed Jan 4 10:39:35 2006 @@ -1918,29 +1918,29 @@ ip_forward(struct mbuf *m, int srcrt) } } #ifdef IPSEC key_freesp(sp); #else /* FAST_IPSEC */ KEY_FREESP(&sp); #endif - ipstat.ips_cantfrag++; - break; - } else + } #endif /*IPSEC || FAST_IPSEC*/ - /* - * When doing source routing 'ia' can be NULL. Fall back - * to the minimum guaranteed routeable packet size and use - * the same hack as IPSEC to setup a dummyifp for icmp. - */ - if (ia == NULL) - mtu = IP_MSS; - else - mtu = ia->ia_ifp->if_mtu; + if (!mtu) { + /* + * When doing source routing 'ia' can be NULL. Fall back + * to the minimum guaranteed routeable packet size and use + * the same hack as IPSEC to setup a dummyifp for icmp. + */ + if (ia == NULL) + mtu = IP_MSS; + else + mtu = ia->ia_ifp->if_mtu; + } #if defined(IPSEC) || defined(FAST_IPSEC) } #endif /*IPSEC || FAST_IPSEC*/ ipstat.ips_cantfrag++; break; case ENOBUFS: /*
_______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "[EMAIL PROTECTED]"