patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
Index: sys/netinet/raw_ip.c
 | 
						|
===================================================================
 | 
						|
--- sys/netinet/raw_ip.c	(revision 200583)
 | 
						|
+++ sys/netinet/raw_ip.c	(working copy)
 | 
						|
@@ -343,17 +343,35 @@ rip_input(struct mbuf *m, int off)
 | 
						|
 		 */
 | 
						|
 		if (inp->inp_moptions != NULL &&
 | 
						|
 		    IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
 | 
						|
-			struct sockaddr_in group;
 | 
						|
+			/*
 | 
						|
+			 * If the incoming datagram is for IGMP, allow it
 | 
						|
+			 * through unconditionally to the raw socket.
 | 
						|
+			 *
 | 
						|
+			 * In the case of IGMPv2, we may not have explicitly
 | 
						|
+			 * joined the group, and may have set IFF_ALLMULTI
 | 
						|
+			 * on the interface. imo_multi_filter() may discard
 | 
						|
+			 * control traffic we actually need to see.
 | 
						|
+			 *
 | 
						|
+			 * Userland multicast routing daemons should continue
 | 
						|
+			 * filter the control traffic appropriately.
 | 
						|
+			 */
 | 
						|
 			int blocked;
 | 
						|
 
 | 
						|
-			bzero(&group, sizeof(struct sockaddr_in));
 | 
						|
-			group.sin_len = sizeof(struct sockaddr_in);
 | 
						|
-			group.sin_family = AF_INET;
 | 
						|
-			group.sin_addr = ip->ip_dst;
 | 
						|
+			blocked = MCAST_PASS;
 | 
						|
+			if (proto != IPPROTO_IGMP) {
 | 
						|
+				struct sockaddr_in group;
 | 
						|
 
 | 
						|
-			blocked = imo_multi_filter(inp->inp_moptions, ifp,
 | 
						|
-			    (struct sockaddr *)&group,
 | 
						|
-			    (struct sockaddr *)&ripsrc);
 | 
						|
+				bzero(&group, sizeof(struct sockaddr_in));
 | 
						|
+				group.sin_len = sizeof(struct sockaddr_in);
 | 
						|
+				group.sin_family = AF_INET;
 | 
						|
+				group.sin_addr = ip->ip_dst;
 | 
						|
+
 | 
						|
+				blocked = imo_multi_filter(inp->inp_moptions,
 | 
						|
+				    ifp,
 | 
						|
+				    (struct sockaddr *)&group,
 | 
						|
+				    (struct sockaddr *)&ripsrc);
 | 
						|
+			}
 | 
						|
+
 | 
						|
 			if (blocked != MCAST_PASS) {
 | 
						|
 				IPSTAT_INC(ips_notmember);
 | 
						|
 				continue;
 | 
						|
Index: sys/netinet6/raw_ip6.c
 | 
						|
===================================================================
 | 
						|
--- sys/netinet6/raw_ip6.c	(revision 200583)
 | 
						|
+++ sys/netinet6/raw_ip6.c	(working copy)
 | 
						|
@@ -213,17 +213,39 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
 | 
						|
 		 */
 | 
						|
 		if (in6p->in6p_moptions &&
 | 
						|
 		    IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
 | 
						|
-			struct sockaddr_in6 mcaddr;
 | 
						|
+			/*
 | 
						|
+			 * If the incoming datagram is for MLD, allow it
 | 
						|
+			 * through unconditionally to the raw socket.
 | 
						|
+			 *
 | 
						|
+			 * Use the M_RTALERT_MLD flag to check for MLD
 | 
						|
+			 * traffic without having to inspect the mbuf chain
 | 
						|
+			 * more deeply, as all MLDv1/v2 host messages MUST
 | 
						|
+			 * contain the Router Alert option.
 | 
						|
+			 *
 | 
						|
+			 * In the case of MLDv1, we may not have explicitly
 | 
						|
+			 * joined the group, and may have set IFF_ALLMULTI
 | 
						|
+			 * on the interface. im6o_mc_filter() may discard
 | 
						|
+			 * control traffic we actually need to see.
 | 
						|
+			 *
 | 
						|
+			 * Userland multicast routing daemons should continue
 | 
						|
+			 * filter the control traffic appropriately.
 | 
						|
+			 */
 | 
						|
 			int blocked;
 | 
						|
 
 | 
						|
-			bzero(&mcaddr, sizeof(struct sockaddr_in6));
 | 
						|
-			mcaddr.sin6_len = sizeof(struct sockaddr_in6);
 | 
						|
-			mcaddr.sin6_family = AF_INET6;
 | 
						|
-			mcaddr.sin6_addr = ip6->ip6_dst;
 | 
						|
+			blocked = MCAST_PASS;
 | 
						|
+			if ((m->m_flags & M_RTALERT_MLD) == 0) {
 | 
						|
+				struct sockaddr_in6 mcaddr;
 | 
						|
 
 | 
						|
-			blocked = im6o_mc_filter(in6p->in6p_moptions, ifp,
 | 
						|
-			    (struct sockaddr *)&mcaddr,
 | 
						|
-			    (struct sockaddr *)&fromsa);
 | 
						|
+				bzero(&mcaddr, sizeof(struct sockaddr_in6));
 | 
						|
+				mcaddr.sin6_len = sizeof(struct sockaddr_in6);
 | 
						|
+				mcaddr.sin6_family = AF_INET6;
 | 
						|
+				mcaddr.sin6_addr = ip6->ip6_dst;
 | 
						|
+
 | 
						|
+				blocked = im6o_mc_filter(in6p->in6p_moptions,
 | 
						|
+				    ifp,
 | 
						|
+				    (struct sockaddr *)&mcaddr,
 | 
						|
+				    (struct sockaddr *)&fromsa);
 | 
						|
+			}
 | 
						|
 			if (blocked != MCAST_PASS) {
 | 
						|
 				IP6STAT_INC(ip6s_notmember);
 | 
						|
 				continue;
 |