svn commit: r221328 - head/sys/netinet

Michael Tuexen tuexen at FreeBSD.org
Mon May 2 15:53:00 UTC 2011


Author: tuexen
Date: Mon May  2 15:53:00 2011
New Revision: 221328
URL: http://svn.freebsd.org/changeset/base/221328

Log:
  Some more cleanups related to an kernel without INET.
  
  MFC after: 1 week

Modified:
  head/sys/netinet/sctputil.c
  head/sys/netinet/sctputil.h

Modified: head/sys/netinet/sctputil.c
==============================================================================
--- head/sys/netinet/sctputil.c	Mon May  2 15:01:28 2011	(r221327)
+++ head/sys/netinet/sctputil.c	Mon May  2 15:53:00 2011	(r221328)
@@ -2844,9 +2844,11 @@ sctp_notify_peer_addr_change(struct sctp
 	spc->spc_flags = 0;
 	spc->spc_length = sizeof(struct sctp_paddr_change);
 	switch (sa->sa_family) {
+#ifdef INET
 	case AF_INET:
 		memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in));
 		break;
+#endif
 #ifdef INET6
 	case AF_INET6:
 		{
@@ -4084,6 +4086,7 @@ sctp_cmpaddr(struct sockaddr *sa1, struc
 			    sin6_2));
 		}
 #endif
+#ifdef INET
 	case AF_INET:
 		{
 			/* IPv4 addresses */
@@ -4093,6 +4096,7 @@ sctp_cmpaddr(struct sockaddr *sa1, struc
 			sin_2 = (struct sockaddr_in *)sa2;
 			return (sin_1->sin_addr.s_addr == sin_2->sin_addr.s_addr);
 		}
+#endif
 	default:
 		/* we don't do these... */
 		return (0);
@@ -4122,6 +4126,7 @@ sctp_print_address(struct sockaddr *sa)
 			break;
 		}
 #endif
+#ifdef INET
 	case AF_INET:
 		{
 			struct sockaddr_in *sin;
@@ -4133,6 +4138,7 @@ sctp_print_address(struct sockaddr *sa)
 			    p[0], p[1], p[2], p[3], ntohs(sin->sin_port));
 			break;
 		}
+#endif
 	default:
 		SCTP_PRINTF("?\n");
 		break;
@@ -4143,6 +4149,7 @@ void
 sctp_print_address_pkt(struct ip *iph, struct sctphdr *sh)
 {
 	switch (iph->ip_v) {
+#ifdef INET
 	case IPVERSION:
 		{
 			struct sockaddr_in lsa, fsa;
@@ -4163,6 +4170,7 @@ sctp_print_address_pkt(struct ip *iph, s
 			sctp_print_address((struct sockaddr *)&fsa);
 			break;
 		}
+#endif
 #ifdef INET6
 	case IPV6_VERSION >> 4:
 		{
@@ -4862,22 +4870,33 @@ sctp_find_ifa_in_ep(struct sctp_inpcb *i
 uint32_t
 sctp_get_ifa_hash_val(struct sockaddr *addr)
 {
-	if (addr->sa_family == AF_INET) {
-		struct sockaddr_in *sin;
+	switch (addr->sa_family) {
+#ifdef INET
+	case AF_INET:
+		{
+			struct sockaddr_in *sin;
 
-		sin = (struct sockaddr_in *)addr;
-		return (sin->sin_addr.s_addr ^ (sin->sin_addr.s_addr >> 16));
-	} else if (addr->sa_family == AF_INET6) {
-		struct sockaddr_in6 *sin6;
-		uint32_t hash_of_addr;
+			sin = (struct sockaddr_in *)addr;
+			return (sin->sin_addr.s_addr ^ (sin->sin_addr.s_addr >> 16));
+		}
+#endif
+#ifdef INET6
+	case INET6:
+		{
+			struct sockaddr_in6 *sin6;
+			uint32_t hash_of_addr;
 
-		sin6 = (struct sockaddr_in6 *)addr;
-		hash_of_addr = (sin6->sin6_addr.s6_addr32[0] +
-		    sin6->sin6_addr.s6_addr32[1] +
-		    sin6->sin6_addr.s6_addr32[2] +
-		    sin6->sin6_addr.s6_addr32[3]);
-		hash_of_addr = (hash_of_addr ^ (hash_of_addr >> 16));
-		return (hash_of_addr);
+			sin6 = (struct sockaddr_in6 *)addr;
+			hash_of_addr = (sin6->sin6_addr.s6_addr32[0] +
+			    sin6->sin6_addr.s6_addr32[1] +
+			    sin6->sin6_addr.s6_addr32[2] +
+			    sin6->sin6_addr.s6_addr32[3]);
+			hash_of_addr = (hash_of_addr ^ (hash_of_addr >> 16));
+			return (hash_of_addr);
+		}
+#endif
+	default:
+		break;
 	}
 	return (0);
 }
@@ -6250,7 +6269,9 @@ sctp_connectx_helper_add(struct sctp_tcb
 	inp = stcb->sctp_ep;
 	*error = 0;
 	for (i = 0; i < totaddr; i++) {
-		if (sa->sa_family == AF_INET) {
+		switch (sa->sa_family) {
+#ifdef INET
+		case AF_INET:
 			incr = sizeof(struct sockaddr_in);
 			if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) {
 				/* assoc gone no un-lock */
@@ -6260,7 +6281,10 @@ sctp_connectx_helper_add(struct sctp_tcb
 				goto out_now;
 			}
 			added++;
-		} else if (sa->sa_family == AF_INET6) {
+			break;
+#endif
+#ifdef INET6
+		case AF_INET6:
 			incr = sizeof(struct sockaddr_in6);
 			if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) {
 				/* assoc gone no un-lock */
@@ -6270,6 +6294,10 @@ sctp_connectx_helper_add(struct sctp_tcb
 				goto out_now;
 			}
 			added++;
+			break;
+#endif
+		default:
+			break;
 		}
 		sa = (struct sockaddr *)((caddr_t)sa + incr);
 	}
@@ -6288,10 +6316,13 @@ sctp_connectx_helper_find(struct sctp_in
 
 	at = incr = 0;
 	sa = addr;
+
 	*error = *num_v6 = *num_v4 = 0;
 	/* account and validate addresses */
 	for (i = 0; i < (size_t)*totaddr; i++) {
-		if (sa->sa_family == AF_INET) {
+		switch (sa->sa_family) {
+#ifdef INET
+		case AF_INET:
 			(*num_v4) += 1;
 			incr = sizeof(struct sockaddr_in);
 			if (sa->sa_len != incr) {
@@ -6300,30 +6331,40 @@ sctp_connectx_helper_find(struct sctp_in
 				*bad_addr = 1;
 				return (NULL);
 			}
-		} else if (sa->sa_family == AF_INET6) {
-			struct sockaddr_in6 *sin6;
-
-			sin6 = (struct sockaddr_in6 *)sa;
-			if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
-				/* Must be non-mapped for connectx */
-				SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
-				*error = EINVAL;
-				*bad_addr = 1;
-				return (NULL);
-			}
-			(*num_v6) += 1;
-			incr = sizeof(struct sockaddr_in6);
-			if (sa->sa_len != incr) {
-				SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
-				*error = EINVAL;
-				*bad_addr = 1;
-				return (NULL);
+			break;
+#endif
+#ifdef INET6
+		case AF_INET6:
+			{
+				struct sockaddr_in6 *sin6;
+
+				sin6 = (struct sockaddr_in6 *)sa;
+				if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
+					/* Must be non-mapped for connectx */
+					SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
+					*error = EINVAL;
+					*bad_addr = 1;
+					return (NULL);
+				}
+				(*num_v6) += 1;
+				incr = sizeof(struct sockaddr_in6);
+				if (sa->sa_len != incr) {
+					SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
+					*error = EINVAL;
+					*bad_addr = 1;
+					return (NULL);
+				}
+				break;
 			}
-		} else {
+#endif
+		default:
 			*totaddr = i;
 			/* we are done */
 			break;
 		}
+		if (i == (size_t)*totaddr) {
+			break;
+		}
 		SCTP_INP_INCR_REF(inp);
 		stcb = sctp_findassociation_ep_addr(&inp, sa, NULL, NULL, NULL);
 		if (stcb != NULL) {
@@ -6364,7 +6405,7 @@ sctp_bindx_add_address(struct socket *so
 		return;
 	}
 	addr_touse = sa;
-#if defined(INET6) && !defined(__Userspace__)	/* TODO port in6_sin6_2_sin */
+#ifdef INET6
 	if (sa->sa_family == AF_INET6) {
 		struct sockaddr_in6 *sin6;
 
@@ -6393,6 +6434,7 @@ sctp_bindx_add_address(struct socket *so
 		}
 	}
 #endif
+#ifdef INET
 	if (sa->sa_family == AF_INET) {
 		if (sa->sa_len != sizeof(struct sockaddr_in)) {
 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
@@ -6407,6 +6449,7 @@ sctp_bindx_add_address(struct socket *so
 			return;
 		}
 	}
+#endif
 	if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) {
 		if (p == NULL) {
 			/* Can't get proc for Net/Open BSD */
@@ -6519,6 +6562,7 @@ sctp_bindx_delete_address(struct socket 
 		}
 	}
 #endif
+#ifdef INET
 	if (sa->sa_family == AF_INET) {
 		if (sa->sa_len != sizeof(struct sockaddr_in)) {
 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
@@ -6533,6 +6577,7 @@ sctp_bindx_delete_address(struct socket 
 			return;
 		}
 	}
+#endif
 	/*
 	 * No lock required mgmt_ep_sa does its own locking. If the FIX:
 	 * below is ever changed we may need to lock before calling
@@ -6599,6 +6644,7 @@ sctp_local_addr_count(struct sctp_tcb *s
 				if (sctp_is_addr_restricted(stcb, sctp_ifa))
 					continue;
 				switch (sctp_ifa->address.sa.sa_family) {
+#ifdef INET
 				case AF_INET:
 					if (ipv4_addr_legal) {
 						struct sockaddr_in *sin;
@@ -6621,6 +6667,7 @@ sctp_local_addr_count(struct sctp_tcb *s
 						continue;
 					}
 					break;
+#endif
 #ifdef INET6
 				case AF_INET6:
 					if (ipv6_addr_legal) {
@@ -6715,6 +6762,8 @@ sctp_log_trace(uint32_t subsys, const ch
 }
 
 #endif
+/* XXX: Remove the #ifdef after tunneling over IPv6 works also on FreeBSD. */
+#ifdef INET
 /* We will need to add support
  * to bind the ports and such here
  * so we can do UDP tunneling. In
@@ -6816,7 +6865,7 @@ out:
 	m_freem(m);
 }
 
-void 
+void
 sctp_over_udp_stop(void)
 {
 	struct socket *sop;
@@ -6833,7 +6882,8 @@ sctp_over_udp_stop(void)
 	soclose(sop);
 	SCTP_BASE_INFO(udp_tun_socket) = NULL;
 }
-int 
+
+int
 sctp_over_udp_start(void)
 {
 	uint16_t port;
@@ -6886,3 +6936,5 @@ exit_stage_left:
 	 */
 	return (0);
 }
+
+#endif

Modified: head/sys/netinet/sctputil.h
==============================================================================
--- head/sys/netinet/sctputil.h	Mon May  2 15:01:28 2011	(r221327)
+++ head/sys/netinet/sctputil.h	Mon May  2 15:53:00 2011	(r221328)
@@ -313,10 +313,14 @@ do { \
 	} \
 } while (0)
 
-/* new functions to start/stop udp tunneling */
+/* functions to start/stop udp tunneling */
+/* XXX: Remove the #ifdef after tunneling over IPv6 works also on FreeBSD. */
+#ifdef INET
 void sctp_over_udp_stop(void);
 int sctp_over_udp_start(void);
 
+#endif
+
 int
 sctp_soreceive(struct socket *so, struct sockaddr **psa,
     struct uio *uio,


More information about the svn-src-head mailing list