svn commit: r218167 - in head/sys/netinet: . cc

Lawrence Stewart lstewart at FreeBSD.org
Tue Feb 1 13:32:28 UTC 2011


Author: lstewart
Date: Tue Feb  1 13:32:27 2011
New Revision: 218167
URL: http://svn.freebsd.org/changeset/base/218167

Log:
  Algorithm modules can define their own private congestion signal types in the
  top 8 bits of the 32 bit signal bit field space for internal use. These private
  signals should not be leaked outside of a module.
  
  Given that many algorithm modules use the NewReno hook functions to simplify
  their implementation, the obvious place such a leak would show up is in the
  NewReno cong_signal hook function.
  
  - Show the full number of significant bits in the signal type definitions in
    <netinet/cc.h>.
  
  - Add a bitmask to simplify figuring out if a given signal is in the private or
    public bit range.
  
  - Add a sanity check in newreno_cong_signal() to ensure private signals are not
    being leaked into the hook function.
  
  Sponsored by:	FreeBSD Foundation
  Discussed with:	David Hayes <dahayes at swin edu au>
  MFC after:	1 week
  X-MFC with:	r215166

Modified:
  head/sys/netinet/cc.h
  head/sys/netinet/cc/cc_newreno.c

Modified: head/sys/netinet/cc.h
==============================================================================
--- head/sys/netinet/cc.h	Tue Feb  1 10:28:05 2011	(r218166)
+++ head/sys/netinet/cc.h	Tue Feb  1 13:32:27 2011	(r218167)
@@ -101,10 +101,12 @@ struct cc_var {
  * bits (0x01000000 - 0x80000000) are reserved for CC algos to declare their own
  * congestion signal types.
  */
-#define	CC_ECN		0x000001/* ECN marked packet received. */
-#define	CC_RTO		0x000002/* RTO fired. */
-#define	CC_RTO_ERR	0x000004/* RTO fired in error. */
-#define	CC_NDUPACK	0x000008/* Threshold of dupack's reached. */
+#define	CC_ECN		0x00000001	/* ECN marked packet received. */
+#define	CC_RTO		0x00000002	/* RTO fired. */
+#define	CC_RTO_ERR	0x00000004	/* RTO fired in error. */
+#define	CC_NDUPACK	0x00000008	/* Threshold of dupack's reached. */
+
+#define	CC_SIGPRIVMASK	0xFF000000	/* Mask to check if sig is private. */
 
 /*
  * Structure to hold data and function pointers that together represent a

Modified: head/sys/netinet/cc/cc_newreno.c
==============================================================================
--- head/sys/netinet/cc/cc_newreno.c	Tue Feb  1 10:28:05 2011	(r218166)
+++ head/sys/netinet/cc/cc_newreno.c	Tue Feb  1 13:32:27 2011	(r218167)
@@ -182,6 +182,10 @@ newreno_cong_signal(struct cc_var *ccv, 
 {
 	u_int win;
 
+	/* Catch algos which mistakenly leak private signal types. */
+	KASSERT((type & CC_SIGPRIVMASK) == 0,
+	    ("%s: congestion signal type 0x%08x is private\n", __func__, type));
+
 	win = max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) *
 	    CCV(ccv, t_maxseg);
 


More information about the svn-src-head mailing list