kern/183265: ICMP6_PACKET_TOO_BIG doesn't create an entry in hostcache if multifib is active

Luc Revardel lrevardel at nvidia.com
Thu Oct 24 09:20:00 UTC 2013


>Number:         183265
>Category:       kern
>Synopsis:       ICMP6_PACKET_TOO_BIG doesn't create an entry in hostcache if multifib is active
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Oct 24 09:20:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Luc Revardel
>Release:        8.2
>Organization:
NVidia
>Environment:
Linux 2.6.24-24-generic #1 SMP Fri Jul 24 22:46:06 UTC 2009 i686 GNU/Linux
>Description:
This issue occurs when running in multifib (MAXROUTES=11)

Upon reception of an ICMP6 PACKET_TOO_BIG, the hostcache isn't updated with the MTU provided by the ICMP error message.
Subsequent IPv6 packet are not fragmented according to the new MTU value as they should be.
>How-To-Repeat:
Ensure the kernel is compiled with MAXROUTES>1.

Ping a remote destination on the internet using large ping packets (>1500). The route to the destination should contain a segment on which the MTU is smaller than 1500 (say X) in order to reproduce the problem.

First ping packet (IPv6 fragment)should be emitted with a size of 1500.
The host shold receive an ICMP6 packet with a smaller MTU (X).
Next ping packet will be re-emitted with a size of 1500 instead of X.

>Fix:
It looks like the fibnum isn't managed by icmp6_mtudisc_update.
tcp_macmtu6 doesn't find a route matching the searched address.

Fixing inc.inc_fibnum in icmp6_mtudisc_update() seems to solve the problem:

icmp6_mtudisc_update()
[...]
	bzero(&inc, sizeof(inc));
	inc.inc_flags |= INC_ISIPV6;
	inc.inc6_faddr = *dst;
+	inc.inc_fibnum = M_GETFIB(ip6cp->ip6c_m);
	if (in6_setscope(&inc.inc6_faddr, m->m_pkthdr.rcvif, NULL))
		return;

	if (mtu < tcp_maxmtu6(&inc, NULL)) {
		tcp_hc_updatemtu(&inc, mtu);
		ICMP6STAT_INC(icp6s_pmtuchg);
	}
[...]

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list