svn commit: r186821 - in head/sys: netinet netinet6

Randall Stewart rrs at FreeBSD.org
Tue Jan 6 05:27:57 PST 2009


Author: rrs
Date: Tue Jan  6 13:27:56 2009
New Revision: 186821
URL: http://svn.freebsd.org/changeset/base/186821

Log:
  Addresses Roberts comments on comments. Also adds
  the KASSERT and checks suggested.
  
  Reviewed by:	The udp tunneling was discussed on net@ under the
                  thread entitled "Heads up -- Thinking about UDP and tunneling"

Modified:
  head/sys/netinet/udp_usrreq.c
  head/sys/netinet6/udp6_usrreq.c

Modified: head/sys/netinet/udp_usrreq.c
==============================================================================
--- head/sys/netinet/udp_usrreq.c	Tue Jan  6 13:12:26 2009	(r186820)
+++ head/sys/netinet/udp_usrreq.c	Tue Jan  6 13:27:56 2009	(r186821)
@@ -501,13 +501,8 @@ udp_input(struct mbuf *m, int off)
 					 * Engage the tunneling protocol we
 					 * will have to leave the info_lock
 					 * up, since we are hunting through
-					 * multiple UDP inp's hope we don't
-					 * break.
+					 * multiple UDP's.
 					 * 
-					 * XXXML: Maybe add a flag to the
-					 * prototype so that the tunneling
-					 * can defer work that can't be done
-					 * under the info lock?
 					 */
 					udp_tun_func_t tunnel_func;
 
@@ -546,9 +541,7 @@ udp_input(struct mbuf *m, int off)
 			INP_INFO_RUNLOCK(&V_udbinfo);
 		} else {
 			/*
-			 * Engage the tunneling protocol we must make sure
-			 * all locks are released when we call the tunneling
-			 * protocol.
+			 * Engage the tunneling protocol.
 			 */
 			udp_tun_func_t tunnel_func;
 
@@ -602,8 +595,7 @@ udp_input(struct mbuf *m, int off)
 	}
 	if (inp->inp_ppcb != NULL) {
 		/*
-		 * Engage the tunneling protocol we must make sure all locks
-		 * are released when we call the tunneling protocol.
+		 * Engage the tunneling protocol.
 		 */
 		udp_tun_func_t tunnel_func;
 
@@ -1205,6 +1197,8 @@ udp_set_kernel_tunneling(struct socket *
 	struct inpcb *inp;
 
 	inp = (struct inpcb *)so->so_pcb;
+	KASSERT(so->so_type == SOCK_DGRAM, ("udp_set_kernel_tunneling: !dgram"));
+	KASSERT(so->so_pcb != NULL, ("udp_set_kernel_tunneling: NULL inp"));
 	if (so->so_type != SOCK_DGRAM) {
 		/* Not UDP socket... sorry! */
 		return (ENOTSUP);
@@ -1214,6 +1208,10 @@ udp_set_kernel_tunneling(struct socket *
 		return (EINVAL);
 	}
 	INP_WLOCK(inp);
+	if (inp->inp_ppcb != NULL) {
+		INP_WUNLOCK(inp);
+		return (EBUSY);
+	}
 	inp->inp_ppcb = f;
 	INP_WUNLOCK(inp);
 	return (0);

Modified: head/sys/netinet6/udp6_usrreq.c
==============================================================================
--- head/sys/netinet6/udp6_usrreq.c	Tue Jan  6 13:12:26 2009	(r186820)
+++ head/sys/netinet6/udp6_usrreq.c	Tue Jan  6 13:27:56 2009	(r186821)
@@ -293,8 +293,7 @@ udp6_input(struct mbuf **mp, int *offp, 
 						 * protocol we will have to
 						 * leave the info_lock up,
 						 * since we are hunting
-						 * through multiple UDP
-						 * inp's hope we don't break.
+						 * through multiple UDP's.
 						 * 
 						 */
 						udp_tun_func_t tunnel_func;
@@ -336,9 +335,7 @@ udp6_input(struct mbuf **mp, int *offp, 
 		INP_INFO_RUNLOCK(&V_udbinfo);
 		if (last->inp_ppcb != NULL) {
 			/*
-			 * Engage the tunneling protocol we must make sure
-			 * all locks are released when we call the tunneling
-			 * protocol.
+			 * Engage the tunneling protocol.
 			 */
 			udp_tun_func_t tunnel_func;
 
@@ -386,8 +383,7 @@ udp6_input(struct mbuf **mp, int *offp, 
 	INP_INFO_RUNLOCK(&V_udbinfo);
 	if (inp->inp_ppcb != NULL) {
 		/*
-		 * Engage the tunneling protocol we must make sure all locks
-		 * are released when we call the tunneling protocol.
+		 * Engage the tunneling protocol.
 		 */
 		udp_tun_func_t tunnel_func;
 


More information about the svn-src-head mailing list