svn commit: r207275 - head/sys/netinet

Bruce M Simpson bms at FreeBSD.org
Tue Apr 27 14:14:21 UTC 2010


Author: bms
Date: Tue Apr 27 14:14:21 2010
New Revision: 207275
URL: http://svn.freebsd.org/changeset/base/207275

Log:
  Fix a regression where DVMRP diagnostic traffic, such as that used
  by mrinfo and mtrace, was dropped by the IGMP TTL check. IGMP control
  traffic must always have a TTL of 1.
  
  Submitted by:	Matthew Luckie
  MFC after:	3 days

Modified:
  head/sys/netinet/igmp.c

Modified: head/sys/netinet/igmp.c
==============================================================================
--- head/sys/netinet/igmp.c	Tue Apr 27 13:50:15 2010	(r207274)
+++ head/sys/netinet/igmp.c	Tue Apr 27 14:14:21 2010	(r207275)
@@ -1468,12 +1468,6 @@ igmp_input(struct mbuf *m, int off)
 	}
 	ip = mtod(m, struct ip *);
 
-	if (ip->ip_ttl != 1) {
-		IGMPSTAT_INC(igps_rcv_badttl);
-		m_freem(m);
-		return;
-	}
-
 	/*
 	 * Validate checksum.
 	 */
@@ -1488,6 +1482,17 @@ igmp_input(struct mbuf *m, int off)
 	m->m_data -= iphlen;
 	m->m_len += iphlen;
 
+	/*
+	 * IGMP control traffic is link-scope, and must have a TTL of 1.
+	 * DVMRP traffic (e.g. mrinfo, mtrace) is an exception;
+	 * probe packets may come from beyond the LAN.
+	 */
+	if (igmp->igmp_type != IGMP_DVMRP && ip->ip_ttl != 1) {
+		IGMPSTAT_INC(igps_rcv_badttl);
+		m_freem(m);
+		return;
+	}
+
 	switch (igmp->igmp_type) {
 	case IGMP_HOST_MEMBERSHIP_QUERY:
 		if (igmplen == IGMP_MINLEN) {


More information about the svn-src-head mailing list