From: Guus Sliepen Date: Tue, 5 Jun 2001 16:09:55 +0000 (+0000) Subject: - tinc can now act as a switch or a hub too (as opposed to a router only) X-Git-Tag: release-1.0pre5~134 X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=4f9dad0972ac0f665a1b6050b059bd52f93e6221 - tinc can now act as a switch or a hub too (as opposed to a router only) - cleaner initialisation of "UNKNOWN" and "MYSELF" names --- diff --git a/src/connection.c b/src/connection.c index c1acfeab..453a25ee 100644 --- a/src/connection.c +++ b/src/connection.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: connection.c,v 1.1.2.10 2001/03/04 13:59:25 guus Exp $ + $Id: connection.c,v 1.1.2.11 2001/06/05 16:09:55 guus Exp $ */ #include "config.h" @@ -88,7 +88,7 @@ void free_connection(connection_t *p) cp if(p->queue) list_delete_list(p->queue); - if(p->name && p->name!=unknown) + if(p->name) free(p->name); if(p->hostname) free(p->hostname); diff --git a/src/net.c b/src/net.c index 2c08dcf2..266dbab7 100644 --- a/src/net.c +++ b/src/net.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: net.c,v 1.35.4.110 2001/05/28 08:56:57 guus Exp $ + $Id: net.c,v 1.35.4.111 2001/06/05 16:09:55 guus Exp $ */ #include "config.h" @@ -104,8 +104,6 @@ static int seconds_till_retry; int keylifetime = 0; int keyexpires = 0; -char *unknown = NULL; - void send_udppacket(connection_t *cl, vpn_packet_t *inpkt) { vpn_packet_t outpkt; @@ -261,6 +259,26 @@ cp send_udppacket(cl, packet); } +/* Broadcast a packet to all active connections */ + +void broadcast_packet(connection_t *from, vpn_packet_t *packet) +{ + avl_node_t *node; + connection_t *cl; +cp + if(debug_lvl >= DEBUG_TRAFFIC) + syslog(LOG_INFO, _("Broadcasting packet of %d bytes from %s (%s)"), + packet->len, from->name, from->hostname); + + for(node = connection_tree->head; node; node = node->next) + { + cl = (connection_t *)node->data; + if(cl->status.meta && cl != from) + send_packet(cl, packet); + } +cp +} + void flush_queue(connection_t *cl) { list_node_t *node, *next; @@ -731,7 +749,7 @@ int setup_myself(void) cp myself = new_connection(); - asprintf(&myself->hostname, "MYSELF"); + asprintf(&myself->hostname, _("MYSELF")); myself->options = 0; myself->protocol_version = PROT_CURRENT; @@ -1011,7 +1029,7 @@ cp return NULL; } - p->name = unknown; + asprintf(&p->name, _("UNKNOWN")); p->address = ntohl(ci.sin_addr.s_addr); p->hostname = hostlookup(ci.sin_addr.s_addr); p->port = htons(ci.sin_port); /* This one will be overwritten later */ diff --git a/src/net.h b/src/net.h index ba17331c..c56abd85 100644 --- a/src/net.h +++ b/src/net.h @@ -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.h,v 1.9.4.31 2001/05/25 11:54:28 guus Exp $ + $Id: net.h,v 1.9.4.32 2001/06/05 16:09:55 guus Exp $ */ #ifndef __TINC_NET_H__ @@ -98,8 +98,6 @@ extern int total_tap_out; extern int total_socket_in; extern int total_socket_out; -extern char *unknown; - extern char *request_name[256]; extern char *status_text[10]; @@ -111,6 +109,7 @@ extern void send_packet(connection_t *, vpn_packet_t *); extern void receive_packet(connection_t *, vpn_packet_t *); extern void receive_tcppacket(connection_t *, char *, int); extern void accept_packet(vpn_packet_t *); +extern void broadcast_packet(connection_t *, vpn_packet_t *); extern int setup_network_connections(void); extern void close_network_connections(void); extern void main_loop(void); diff --git a/src/protocol.c b/src/protocol.c index bf54c6a5..cf5cd677 100644 --- a/src/protocol.c +++ b/src/protocol.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: protocol.c,v 1.28.4.91 2001/05/25 11:54:28 guus Exp $ + $Id: protocol.c,v 1.28.4.92 2001/06/05 16:09:55 guus Exp $ */ #include "config.h" @@ -214,6 +214,9 @@ cp /* Copy string to cl */ + if(cl->name) + free(cl->name); + cl->name = xstrdup(name); /* Load information about peer */ diff --git a/src/route.c b/src/route.c index 3d488874..2c3cc0d0 100644 --- a/src/route.c +++ b/src/route.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: route.c,v 1.1.2.10 2001/06/04 11:14:35 guus Exp $ + $Id: route.c,v 1.1.2.11 2001/06/05 16:09:55 guus Exp $ */ #include "config.h" @@ -79,28 +79,16 @@ connection_t *route_mac(connection_t *source, vpn_packet_t *packet) cp /* Learn source address */ - learn_mac(source, (mac_t *)(&packet->data[0])); + learn_mac(source, (mac_t *)(&packet->data[6])); /* Lookup destination address */ - subnet = lookup_subnet_mac((mac_t *)(&packet->data[6])); + subnet = lookup_subnet_mac((mac_t *)(&packet->data[0])); - if(!subnet) - { - if(debug_lvl >= DEBUG_TRAFFIC) - { - syslog(LOG_WARNING, _("Cannot route packet: unknown destination address %x:%x:%x:%x:%x:%x"), - packet->data[6], - packet->data[7], - packet->data[8], - packet->data[9], - packet->data[10], - packet->data[11]); - } - return NULL; - } -cp - return subnet->owner; + if(subnet) + return subnet->owner; + else + return NULL; } connection_t *route_ipv4(vpn_packet_t *packet) @@ -205,7 +193,6 @@ cp void route_outgoing(vpn_packet_t *packet) { unsigned short int type; - avl_node_t *node; connection_t *cl; cp /* FIXME: multicast? */ @@ -240,15 +227,12 @@ cp cl = route_mac(myself, packet); if(cl) send_packet(cl, packet); + else + broadcast_packet(myself, packet); break; case RMODE_HUB: - for(node = connection_tree->head; node; node = node->next) - { - cl = (connection_t *)node->data; - if(cl->status.active) - send_packet(cl, packet); - } + broadcast_packet(myself, packet); break; } } @@ -258,10 +242,16 @@ void route_incoming(connection_t *source, vpn_packet_t *packet) switch(routing_mode) { case RMODE_ROUTER: - memcpy(packet->data, mymac.net.mac.address.x, 6); + memcpy(packet->data, mymac.net.mac.address.x, 6); /* Override destination address to make the kernel accept it */ break; case RMODE_SWITCH: - learn_mac(source, (mac_t *)(&packet->data[0])); + if((packet->data[0] & packet->data[1]) == 0xFF) /* Broadcast? */ + broadcast_packet(source, packet); /* If yes, spread it on */ + else + learn_mac(source, (mac_t *)(&packet->data[6])); + break; + case RMODE_HUB: + broadcast_packet(source,packet); /* Spread it on */ break; } diff --git a/src/subnet.c b/src/subnet.c index 51b1cd7a..28357c88 100644 --- a/src/subnet.c +++ b/src/subnet.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: subnet.c,v 1.1.2.19 2001/06/01 08:02:09 guus Exp $ + $Id: subnet.c,v 1.1.2.20 2001/06/05 16:09:55 guus Exp $ */ #include "config.h" @@ -244,7 +244,7 @@ cp subnet->net.ipv6.mask.x[7]); break; default: - asprintf(&netstr, _("unknown")); + asprintf(&netstr, _("unknown subnet type")); } cp return netstr; diff --git a/src/tincd.c b/src/tincd.c index 94f792cd..d9512240 100644 --- a/src/tincd.c +++ b/src/tincd.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: tincd.c,v 1.10.4.46 2001/05/28 08:56:57 guus Exp $ + $Id: tincd.c,v 1.10.4.47 2001/06/05 16:09:55 guus Exp $ */ #include "config.h" @@ -305,10 +305,6 @@ main(int argc, char **argv, char **envp) bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); - /* Do some intl stuff right now */ - - unknown = _("unknown"); - environment = envp; parse_options(argc, argv, envp);