- Small fixes to graph algorithms
- More control over tap device, ability to set interface name to something other than the netname. - Export NETNAME, DEVICE and INTERFACE environment variables to scripts.
This commit is contained in:
		
							parent
							
								
									2165931c62
								
							
						
					
					
						commit
						c0a3f67a5d
					
				
					 8 changed files with 96 additions and 51 deletions
				
			
		|  | @ -17,13 +17,15 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: device.h,v 1.1.2.3 2001/10/27 13:13:35 guus Exp $ | ||||
|     $Id: device.h,v 1.1.2.4 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| #ifndef __TINC_DEVICE_H__ | ||||
| #define __TINC_DEVICE_H__ | ||||
| 
 | ||||
| extern int device_fd; | ||||
| extern char *device; | ||||
| extern char *interface; | ||||
| 
 | ||||
| extern int setup_device(void); | ||||
| extern void close_device(void); | ||||
|  |  | |||
							
								
								
									
										29
									
								
								src/graph.c
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								src/graph.c
									
										
									
									
									
								
							|  | @ -17,7 +17,7 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: graph.c,v 1.1.2.4 2001/10/30 12:59:12 guus Exp $ | ||||
|     $Id: graph.c,v 1.1.2.5 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| /* We need to generate two trees from the graph:
 | ||||
|  | @ -59,7 +59,7 @@ | |||
| 
 | ||||
| void mst_kruskal(void) | ||||
| { | ||||
|   avl_node_t *node; | ||||
|   avl_node_t *node, *next; | ||||
|   edge_t *e; | ||||
|   node_t *n; | ||||
|   connection_t *c; | ||||
|  | @ -90,9 +90,9 @@ void mst_kruskal(void) | |||
| 
 | ||||
|   /* Add safe edges */ | ||||
| 
 | ||||
|   while(safe_edges < nodes - 1) | ||||
|   for(skipped = 0, node = edge_weight_tree->head; node; node = node->next) | ||||
|   for(skipped = 0, node = edge_weight_tree->head; node; node = next) | ||||
|     { | ||||
|       next = node->next; | ||||
|       e = (edge_t *)node->data; | ||||
| 
 | ||||
|       if(e->from->status.visited == e->to->status.visited) | ||||
|  | @ -109,7 +109,10 @@ void mst_kruskal(void) | |||
|       safe_edges++; | ||||
| 
 | ||||
|       if(skipped) | ||||
|         break; | ||||
|         { | ||||
|           next = edge_weight_tree->head; | ||||
|           continue; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -117,7 +120,7 @@ void mst_kruskal(void) | |||
|    Running time: O(E) | ||||
| */ | ||||
| 
 | ||||
| void sssp_bfs(void) | ||||
| void sssp_bfs(int prune) | ||||
| { | ||||
|   avl_node_t *node, *from, *next, *to; | ||||
|   edge_t *e; | ||||
|  | @ -165,7 +168,7 @@ void sssp_bfs(void) | |||
|                 { | ||||
|                   check->status.visited = 1; | ||||
|                   check->nexthop = (n->nexthop == myself) ? check : n->nexthop; | ||||
|                   check->via = check; /* FIXME: only if !(e->options & INDIRECT), otherwise use n->via */ | ||||
|                   check->via = (e->options & OPTION_INDIRECT || n->via != n) ? n->via : check; | ||||
|                   node = avl_alloc_node(); | ||||
|                   node->data = check; | ||||
|                   avl_insert_before(todo_tree, from, node); | ||||
|  | @ -177,4 +180,16 @@ void sssp_bfs(void) | |||
|     } | ||||
| 
 | ||||
|   avl_free_tree(todo_tree); | ||||
|    | ||||
|   /* Nodes we haven't visited are unreachable, prune them. */ | ||||
| 
 | ||||
|   if(prune) | ||||
|     for(node = node_tree->head; node; node = next) | ||||
|       { | ||||
|         next = node->next; | ||||
|         n = (node_t *)node->data; | ||||
| 
 | ||||
|         if(n->status.visited == 0) | ||||
|           node_del(n); | ||||
|       } | ||||
| } | ||||
|  |  | |||
|  | @ -17,9 +17,8 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: graph.h,v 1.1.2.1 2001/10/29 13:14:57 guus Exp $ | ||||
|     $Id: graph.h,v 1.1.2.2 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| extern void mst_kruskal(void); | ||||
| extern void mst_prim(void); | ||||
| extern void sssp_bfs(void); | ||||
| extern void sssp_bfs(int); | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: device.c,v 1.1.2.3 2001/10/27 13:13:35 guus Exp $ | ||||
|     $Id: device.c,v 1.1.2.4 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| #include "config.h" | ||||
|  | @ -55,7 +55,9 @@ | |||
| 
 | ||||
| int device_fd = -1; | ||||
| int device_type; | ||||
| char *device_fname; | ||||
| char *device; | ||||
| char *interface; | ||||
| char ifrname[IFNAMSIZ]; | ||||
| char *device_info; | ||||
| 
 | ||||
| int device_total_in = 0; | ||||
|  | @ -71,13 +73,15 @@ int setup_device(void) | |||
|   struct ifreq ifr; | ||||
| 
 | ||||
| cp | ||||
|   if(!get_config_string(lookup_config(config_tree, "Device"), &device_fname)) | ||||
|     device_fname = DEFAULT_DEVICE; | ||||
|   if(!get_config_string(lookup_config(config_tree, "Device"), &device)) | ||||
|     device = DEFAULT_DEVICE; | ||||
| 
 | ||||
|   if(!get_config_string(lookup_config(config_tree, "Interface"), &interface)) | ||||
|     interface = netname; | ||||
| cp | ||||
|   if((device_fd = open(device_fname, O_RDWR | O_NONBLOCK)) < 0) | ||||
|   if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0) | ||||
|     { | ||||
|       syslog(LOG_ERR, _("Could not open %s: %m"), device_fname); | ||||
|       syslog(LOG_ERR, _("Could not open %s: %m"), device); | ||||
|       return -1; | ||||
|     } | ||||
| cp | ||||
|  | @ -97,20 +101,24 @@ cp | |||
|   memset(&ifr, 0, sizeof(ifr)); | ||||
| cp | ||||
|   ifr.ifr_flags = IFF_TAP | IFF_NO_PI; | ||||
|   if (netname) | ||||
|     strncpy(ifr.ifr_name, netname, IFNAMSIZ); | ||||
|   if (interface) | ||||
|     strncpy(ifr.ifr_name, interface, IFNAMSIZ); | ||||
| cp | ||||
|   if (!ioctl(device_fd, TUNSETIFF, (void *) &ifr)) | ||||
|   { | ||||
|       device_info = _("Linux tun/tap device"); | ||||
|     device_info = _("Linux tun/tap device"); | ||||
|     device_type = DEVICE_TYPE_TUNTAP; | ||||
|     strncpy(ifrname, ifr.ifr_name, IFNAMSIZ); | ||||
|     interface = ifrname; | ||||
|   } | ||||
|   else | ||||
|     if (!ioctl(device_fd, (('T'<< 8) | 202), (void *) &ifr)) | ||||
|     { | ||||
|       syslog(LOG_WARNING, _("Old ioctl() request was needed for %s"), device_fname); | ||||
|       syslog(LOG_WARNING, _("Old ioctl() request was needed for %s"), device); | ||||
|       device_type = DEVICE_TYPE_TUNTAP; | ||||
|       device_info = _("Linux tun/tap device"); | ||||
|       strncpy(ifrname, ifr.ifr_name, IFNAMSIZ); | ||||
|       interface = ifrname; | ||||
|     } | ||||
|     else | ||||
| #endif | ||||
|  | @ -119,7 +127,7 @@ cp | |||
|       device_type = DEVICE_TYPE_ETHERTAP; | ||||
|     } | ||||
| 
 | ||||
|   syslog(LOG_INFO, _("%s is a %s"), device_fname, device_info); | ||||
|   syslog(LOG_INFO, _("%s is a %s"), device, device_info); | ||||
| cp | ||||
|   return 0; | ||||
| } | ||||
|  | @ -142,7 +150,7 @@ cp | |||
|     { | ||||
|       if((lenin = read(device_fd, packet->data, MTU)) <= 0) | ||||
|         { | ||||
|           syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device_fname); | ||||
|           syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device); | ||||
|           return -1; | ||||
|         } | ||||
| 
 | ||||
|  | @ -154,7 +162,7 @@ cp | |||
| 
 | ||||
|       if((lenin = readv(device_fd, vector, 2)) <= 0) | ||||
|         { | ||||
|           syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device_fname); | ||||
|           syslog(LOG_ERR, _("Error while reading from %s %s: %m"), device_info, device); | ||||
|           return -1; | ||||
|         } | ||||
| 
 | ||||
|  | @ -183,7 +191,7 @@ cp | |||
|     { | ||||
|       if(write(device_fd, packet->data, packet->len) < 0) | ||||
|         { | ||||
|           syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device_fname); | ||||
|           syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device); | ||||
|           return -1; | ||||
|         } | ||||
|     } | ||||
|  | @ -193,7 +201,7 @@ cp | |||
| 
 | ||||
|       if(writev(device_fd, vector, 2) < 0) | ||||
|         { | ||||
|           syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device_fname); | ||||
|           syslog(LOG_ERR, _("Can't write to %s %s: %m"), device_info, device); | ||||
|           return -1; | ||||
|         } | ||||
|     } | ||||
|  | @ -206,7 +214,7 @@ cp | |||
| void dump_device_stats(void) | ||||
| { | ||||
| cp | ||||
|   syslog(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device_fname); | ||||
|   syslog(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device); | ||||
|   syslog(LOG_DEBUG, _(" total bytes in:  %10d"), device_total_in); | ||||
|   syslog(LOG_DEBUG, _(" total bytes out: %10d"), device_total_out); | ||||
| cp | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: net.c,v 1.35.4.143 2001/10/30 16:34:32 guus Exp $ | ||||
|     $Id: net.c,v 1.35.4.144 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| #include "config.h" | ||||
|  | @ -975,7 +975,8 @@ cp | |||
|   /* Deactivate */ | ||||
| 
 | ||||
|   c->status.active = 0; | ||||
|   c->node->connection = NULL; | ||||
|   if(c->node) | ||||
|     c->node->connection = NULL; | ||||
|   do_prune = 1; | ||||
| cp | ||||
| } | ||||
|  |  | |||
							
								
								
									
										19
									
								
								src/node.c
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								src/node.c
									
										
									
									
									
								
							|  | @ -17,7 +17,7 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: node.c,v 1.1.2.5 2001/10/30 12:59:12 guus Exp $ | ||||
|     $Id: node.c,v 1.1.2.6 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| #include "config.h" | ||||
|  | @ -109,6 +109,23 @@ cp | |||
| 
 | ||||
| void node_del(node_t *n) | ||||
| { | ||||
|   avl_node_t *node, *next; | ||||
|   edge_t *e; | ||||
|   subnet_t *s; | ||||
| cp | ||||
|   for(node = n->subnet_tree->head; node; node = next) | ||||
|     { | ||||
|       next = node->next; | ||||
|       s = (subnet_t *)node->data; | ||||
|       subnet_del(n, s); | ||||
|     } | ||||
| 
 | ||||
|   for(node = n->subnet_tree->head; node; node = next) | ||||
|     { | ||||
|       next = node->next; | ||||
|       e = (edge_t *)node->data; | ||||
|       edge_del(e); | ||||
|     } | ||||
| cp | ||||
|   avl_delete(node_tree, n); | ||||
|   avl_delete(node_udp_tree, n); | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: process.c,v 1.1.2.29 2001/10/28 10:16:18 guus Exp $ | ||||
|     $Id: process.c,v 1.1.2.30 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| #include "config.h" | ||||
|  | @ -44,6 +44,7 @@ | |||
| #include "subnet.h" | ||||
| #include "device.h" | ||||
| #include "connection.h" | ||||
| #include "device.h" | ||||
| 
 | ||||
| #include "system.h" | ||||
| 
 | ||||
|  | @ -199,17 +200,29 @@ void _execute_script(const char *name) | |||
|   char *scriptname; | ||||
|   char *s; | ||||
| cp | ||||
| #ifdef HAVE_UNSETENV | ||||
|   unsetenv("NETNAME"); | ||||
|   unsetenv("DEVICE"); | ||||
|   unsetenv("INTERFACE"); | ||||
| #endif | ||||
| 
 | ||||
|   if(netname) | ||||
|     { | ||||
|       asprintf(&s, "NETNAME=%s", netname); | ||||
|       putenv(s);	/* Don't free s! see man 3 putenv */ | ||||
|     } | ||||
| #ifdef HAVE_UNSETENV | ||||
|   else | ||||
| 
 | ||||
|   if(device) | ||||
|     { | ||||
|       unsetenv("NETNAME"); | ||||
|       asprintf(&s, "DEVICE=%s", device); | ||||
|       putenv(s);	/* Don't free s! see man 3 putenv */ | ||||
|     } | ||||
| 
 | ||||
|   if(interface) | ||||
|     { | ||||
|       asprintf(&s, "INTERFACE=%s", interface); | ||||
|       putenv(s);	/* Don't free s! see man 3 putenv */ | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|   chdir("/"); | ||||
|    | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| 
 | ||||
|     $Id: protocol.c,v 1.28.4.114 2001/10/30 16:34:32 guus Exp $ | ||||
|     $Id: protocol.c,v 1.28.4.115 2001/10/31 12:50:24 guus Exp $ | ||||
| */ | ||||
| 
 | ||||
| #include "config.h" | ||||
|  | @ -682,7 +682,7 @@ cp | |||
|   /* Run MST and SSSP algorithms */ | ||||
|    | ||||
|   mst_kruskal(); | ||||
|   sssp_bfs(); | ||||
|   sssp_bfs(0); | ||||
| cp | ||||
|   return 0; | ||||
| } | ||||
|  | @ -912,12 +912,11 @@ cp | |||
| int del_node_h(connection_t *c) | ||||
| { | ||||
|   node_t *n; | ||||
|   edge_t *e; | ||||
|   char name[MAX_STRING_SIZE]; | ||||
|   ipv4_t address; | ||||
|   port_t port; | ||||
|   connection_t *other; | ||||
|   avl_node_t *node, *next; | ||||
|   avl_node_t *node; | ||||
| cp | ||||
|   if(sscanf(c->buffer, "%*d "MAX_STRING" %lx:%hd", name, &address, &port) != 3) | ||||
|     { | ||||
|  | @ -969,21 +968,12 @@ cp | |||
|         send_del_node(other, n); | ||||
|     } | ||||
| 
 | ||||
|   /* Delete all edges associated with the node */ | ||||
| 
 | ||||
|   for(node = n->edge_tree->head; node; node = next) | ||||
|     { | ||||
|       next = node->next; | ||||
|       e = (edge_t *)node->data; | ||||
|       edge_del(e); | ||||
|     } | ||||
| 
 | ||||
|   /* Delete the node */ | ||||
|    | ||||
|   node_del(n); | ||||
| 
 | ||||
|   mst_kruskal(); | ||||
|   sssp_bfs(); | ||||
|   sssp_bfs(0); | ||||
| cp | ||||
|   return 0; | ||||
| } | ||||
|  | @ -1082,7 +1072,7 @@ cp | |||
|   /* Run MST before or after we tell the rest? */ | ||||
| 
 | ||||
|   mst_kruskal(); | ||||
|   sssp_bfs(); | ||||
|   sssp_bfs(0); | ||||
| cp | ||||
|   return 0; | ||||
| } | ||||
|  | @ -1178,7 +1168,7 @@ cp | |||
|   /* Run MST before or after we tell the rest? */ | ||||
| 
 | ||||
|   mst_kruskal(); | ||||
|   sssp_bfs(); | ||||
|   sssp_bfs(1); | ||||
| cp | ||||
|   return 0; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue