| 
					
				 | 
			
			
				@@ -2170,9 +2170,14 @@ parse_addr_and_port_range(const char *s, uint32_t *addr_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  <b>addr_out</b>, a mask (if any) in <b>mask_out</b>, and port(s) (if any) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  in <b>port_min_out</b> and <b>port_max_out</b>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * DOCDOC exact syntax. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * The syntax is: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   Address OptMask OptPortRange 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   Address ::= IPv4Address / "[" IPv6Address "]" / "*" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   OptMask ::= "/" Integer / 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   OptPortRange ::= ":*" / ":" Integer / ":" Integer "-" Integer / 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *  - If mask, minport, or maxport are NULL, avoid storing those elements. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - If mask, minport, or maxport are NULL, we do not want these 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *    options to be set; treat them as an error if present. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  - If the string has no mask, the mask is set to /32 (IPv4) or /128 (IPv6). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  - If the string has one port, it is placed in both min and max port 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *    variables. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2439,17 +2444,20 @@ tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   memcpy(dest, src, sizeof(tor_addr_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** DOCDOC */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Given two addresses <b>addr1</b> and <b>addr2</b>, return 0 if the two 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * addresses are equivalent under the mask mbits, less than 0 if addr1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * preceeds addr2, and greater than 0 otherwise. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Different address families (IPv4 vs IPv6) are always considered unequal. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return tor_addr_compare_masked(addr1, addr2, 128); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** Given two addresses <b>addr1</b> and <b>addr2</b>, return 0 if the two 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * addresses are equivalent under the mask mbits, or nonzero if not. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Different address families (IPv4 vs IPv6) are always considered unequal. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** As tor_addr_compare(), but only looks at the first <b>mask</b> bits of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the address. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Reduce over-specific masks (>128 for ipv6, >32 for ipv4) to 128 or 32. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2464,6 +2472,11 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_assert(addr1 && addr2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* XXXX020 this code doesn't handle mask bits right it's using v4-mapped v6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * addresses.  If I ask whether ::ffff:1.2.3.4 and ::ffff:1.2.7.8 are the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * same in the first 16 bits, it will say "yes."  That's not so intuitive. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   v_family[0] = IN_FAMILY(addr1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   v_family[1] = IN_FAMILY(addr2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2548,7 +2561,8 @@ tor_dup_addr(uint32_t addr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Convert the tor_addr_t *<b>addr</b> into string form and store it in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * <b>dest</b> (no more than <b>len</b> bytes). DOCDOC return value. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * <b>dest</b>, which can hold at least <b>len</b> bytes.  Returns <b>dest</b> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * on success, NULL on failure. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const char * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tor_addr_to_str(char *dest, const tor_addr_t *addr, int len) 
			 |