| 
					
				 | 
			
			
				@@ -320,6 +320,19 @@ connection_or_finished_connecting(or_connection_t *or_conn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Return 1 if identity digest <b>id_digest</b> is known to be a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * currently or recently running relay. Otherwise return 0. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+connection_or_digest_is_known_relay(const char *id_digest) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (router_get_consensus_status_by_id(id_digest)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 1; /* It's in the consensus: "yes" */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (router_get_by_digest(id_digest)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 1; /* Not in the consensus, but we have a descriptor for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               * it. Probably it was in a recent consensus. "Yes". */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** If we don't necessarily know the router we're connecting to, but we 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * have an addr/port/id_digest, then fill in as much as we can. Start 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * by checking to see if this describes a router we know. */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -331,10 +344,24 @@ connection_or_init_conn_from_address(or_connection_t *conn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   or_options_t *options = get_options(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   routerinfo_t *r = router_get_by_digest(id_digest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  conn->bandwidthrate = (int)options->BandwidthRate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  conn->read_bucket = conn->bandwidthburst = (int)options->BandwidthBurst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   connection_or_set_identity_digest(conn, id_digest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (connection_or_digest_is_known_relay(id_digest)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* It's in the consensus, or we have a descriptor for it meaning it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * was probably in a recent consensus. It's a recognized relay: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * give it full bandwidth. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    conn->bandwidthrate = (int)options->BandwidthRate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    conn->read_bucket = conn->bandwidthburst = (int)options->BandwidthBurst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { /* Not a recognized relay. Squeeze it down based on the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            * suggested bandwidth parameters in the consensus. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    conn->bandwidthrate = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (int)networkstatus_get_param(NULL, "bwconnrate", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                   (int)options->BandwidthRate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    conn->read_bucket = conn->bandwidthburst = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (int)networkstatus_get_param(NULL, "bwconnburst", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                   (int)options->BandwidthBurst); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   conn->_base.port = port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_addr_copy(&conn->_base.addr, addr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_addr_copy(&conn->real_addr, addr); 
			 |