PERFORCE change 125276 for review

Marko Zec zec at FreeBSD.org
Fri Aug 17 13:10:25 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=125276

Change 125276 by zec at zec_tpx32 on 2007/08/17 20:10:08

	Restore support for RFC1724-style addressing of interfaces
	(where 0.0.0.0/8 is interpreted as interface index) in our
	IPv4 multicast API (well, at least in some code paths).
	
	Without this neither RIP nor OSPF can work with quagga,
	neither on a clean kernel nor with options VIMAGE builds -
	strange that I'm the only one who has been hit by this?

Affected files ...

.. //depot/projects/vimage/src/sys/netinet/in_mcast.c#5 edit

Differences ...

==== //depot/projects/vimage/src/sys/netinet/in_mcast.c#5 (text+ko) ====

@@ -120,6 +120,8 @@
 static int	inp_leave_group(struct inpcb *, struct sockopt *);
 static int	inp_set_multicast_if(struct inpcb *, struct sockopt *);
 static int	inp_set_source_filters(struct inpcb *, struct sockopt *);
+static struct ifnet *
+		ip_multicast_if(struct in_addr *a);
 
 /*
  * Resize the ip_moptions vector to the next power-of-two minus 1.
@@ -1032,9 +1034,9 @@
 		 * If all of these conditions fail, return EADDRNOTAVAIL, and
 		 * reject the IPv4 multicast join.
 		 */
-		if (mreqs.imr_interface.s_addr != INADDR_ANY) {
-			INADDR_TO_IFP(mreqs.imr_interface, ifp);
-		} else {
+		if (mreqs.imr_interface.s_addr != INADDR_ANY)
+			ifp = ip_multicast_if(&mreqs.imr_interface);
+		else {
 			struct route ro;
 
 			ro.ro_rt = NULL;
@@ -1414,7 +1416,6 @@
 inp_set_multicast_if(struct inpcb *inp, struct sockopt *sopt)
 {
 	INIT_VNET_NET(curvnet);
-	INIT_VNET_INET(curvnet);
 	struct in_addr		 addr;
 	struct ip_mreqn		 mreqn;
 	struct ifnet		*ifp;
@@ -1453,7 +1454,7 @@
 		if (addr.s_addr == INADDR_ANY) {
 			ifp = NULL;
 		} else {
-			INADDR_TO_IFP(addr, ifp);
+			ifp = ip_multicast_if(&addr);
 			if (ifp == NULL)
 				return (EADDRNOTAVAIL);
 		}
@@ -1839,3 +1840,25 @@
 
 	return (error);
 }
+
+/*
+ * following RFC1724 section 3.3, 0.0.0.0/8 is interpreted as interface index.
+ */
+static struct ifnet *
+ip_multicast_if(struct in_addr *a)
+{
+	INIT_VNET_NET(curvnet);
+	INIT_VNET_INET(curvnet);
+	int ifindex;
+	struct ifnet *ifp;
+
+	if (ntohl(a->s_addr) >> 24 == 0) {
+		ifindex = ntohl(a->s_addr) & 0xffffff;
+		if (ifindex < 0 || V_if_index < ifindex)
+			return NULL;
+		ifp = ifnet_byindex(ifindex);
+	} else
+		INADDR_TO_IFP(*a, ifp);
+	return ifp;
+}
+


More information about the p4-projects mailing list