svn commit: r280989 - head/sys/netinet

Gleb Smirnoff glebius at FreeBSD.org
Thu Apr 2 14:23:01 UTC 2015


Author: glebius
Date: Thu Apr  2 14:22:59 2015
New Revision: 280989
URL: https://svnweb.freebsd.org/changeset/base/280989

Log:
  Provide a comment explaining issues with the counter(9) trick, so that
  people won't copy and paste it blindly.
  
  Prodded by:	ian
  Sponsored by:	Nginx, Inc.

Modified:
  head/sys/netinet/ip_id.c

Modified: head/sys/netinet/ip_id.c
==============================================================================
--- head/sys/netinet/ip_id.c	Thu Apr  2 13:51:06 2015	(r280988)
+++ head/sys/netinet/ip_id.c	Thu Apr  2 14:22:59 2015	(r280989)
@@ -254,6 +254,20 @@ ip_fillid(struct ip *ip)
 		ip->ip_id = ip_randomid();
 	else {
 		counter_u64_add(V_ip_id, 1);
+		/*
+		 * There are two issues about this trick, to be kept in mind.
+		 * 1) We can migrate between counter_u64_add() and next
+		 *    line, and grab counter from other CPU, resulting in too
+		 *    quick ID reuse. This is tolerable in our particular case,
+		 *    since probability of such event is much lower then reuse
+		 *    of ID due to legitimate overflow, that at modern Internet
+		 *    speeds happens all the time.
+		 * 2) We are relying on the fact that counter(9) is based on
+		 *    UMA_ZONE_PCPU uma(9) zone. We also take only last
+		 *    sixteen bits of a counter, so we don't care about the
+		 *    fact that machines with 32-bit word update their counters
+		 *    not atomically.
+		 */
 		ip->ip_id = htons((*(uint64_t *)zpcpu_get(V_ip_id)) & 0xffff);
 	}
 }


More information about the svn-src-head mailing list