| 
					
				 | 
			
			
				@@ -4671,6 +4671,29 @@ fetch_bridge_descriptors(or_options_t *options, time_t now) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   SMARTLIST_FOREACH_END(bridge); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** If our <b>bridge</b> is configured to be a different address than 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the bridge gives in its routerinfo <b>ri</b>, rewrite the routerinfo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * we received to use the address we meant to use. Now we handle 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * multihomed bridges better. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+rewrite_routerinfo_address_for_bridge(bridge_info_t *bridge, routerinfo_t *ri) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_addr_t addr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_addr_from_ipv4h(&addr, ri->addr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      bridge->port == ri->or_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; /* they match, so no need to do anything */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ri->addr = tor_addr_to_ipv4h(&bridge->addr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_free(ri->address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ri->address = tor_dup_ip(ri->addr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ri->or_port = bridge->port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  log_info(LD_DIR, "Adjusted bridge '%s' to match configured address %s:%d.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           ri->nickname, ri->address, ri->or_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** We just learned a descriptor for a bridge. See if that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * digest is in our entry guard list, and add it if not. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4689,6 +4712,8 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (!from_cache) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         download_status_reset(&bridge->fetch_status); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      rewrite_routerinfo_address_for_bridge(bridge, ri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       add_an_entry_guard(ri, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_notice(LD_DIR, "new bridge descriptor '%s' (%s)", ri->nickname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  from_cache ? "cached" : "fresh"); 
			 |