X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet.c;h=4baefe52080fe5e2864596b9e90b1d57ced53e8c;hp=e9d6ecbac4281020b769d1107474403921e481ee;hb=73f7efddd723b25c1477ec1139dc7211307ff660;hpb=bb3d18d56fa0dd2bc5146d0a0044b6ef0880bdb4 diff --git a/src/net.c b/src/net.c index e9d6ecba..4baefe52 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.39 2000/10/16 16:33:29 guus Exp $ + $Id: net.c,v 1.35.4.42 2000/10/20 19:46:57 guus Exp $ */ #include "config.h" @@ -39,6 +39,7 @@ #ifdef HAVE_TUNTAP #include +#include #include LINUX_IF_TUN_H #endif @@ -55,7 +56,7 @@ #include "system.h" int tap_fd = -1; - +int taptype = 0; int total_tap_in = 0; int total_tap_out = 0; int total_socket_in = 0; @@ -333,7 +334,8 @@ int setup_tap_fd(void) int nfd; const char *tapfname; config_t const *cfg; - + char *envvar; + #ifdef HAVE_TUNTAP struct ifreq ifr; #endif @@ -355,23 +357,34 @@ cp cp tap_fd = nfd; + taptype = 0; + #ifdef HAVE_TUNTAP /* Ok now check if this is an old ethertap or a new tun/tap thingie */ memset(&ifr, 0, sizeof(ifr)); cp - ifr.ifr_flags = IFF_TAP; + ifr.ifr_flags = IFF_TAP | IFF_NO_PI; if (netname) strncpy(ifr.ifr_name, netname, IFNAMSIZ); cp if (!ioctl(tap_fd, TUNSETIFF, (void *) &ifr)) { syslog(LOG_INFO, _("%s is a new style tun/tap device"), tapfname); + taptype = 1; + if((cfg = get_config_val(config, tapsubnet)) == NULL) syslog(LOG_INFO, _("tun/tap device will be left unconfigured")); else /* Setup inetaddr/netmask etc */; } #endif + + /* Add name of network interface to environment (for scripts) */ + + ioctl(tap_fd, SIOCGIFNAME, (void *) &ifr); + asprintf(&envvar, "IFNAME=%s", ifr.ifr_name); + putenv(envvar); + free(envvar); cp return 0; @@ -634,13 +647,41 @@ cp syslog(LOG_ERR, _("Invalid name for myself!")); return -1; } +cp + if(!(cfg = get_config_val(config, privatekey))) + { + syslog(LOG_ERR, _("Private key for tinc daemon required!")); + return -1; + } + else + { + myself->rsa_key = RSA_new(); + BN_hex2bn(&myself->rsa_key->d, cfg->data.ptr); + BN_hex2bn(&myself->rsa_key->e, "FFFF"); + } if(read_host_config(myself)) { syslog(LOG_ERR, _("Cannot open host configuration file for myself!")); return -1; } - +cp + if(!(cfg = get_config_val(myself->config, publickey))) + { + syslog(LOG_ERR, _("Public key for tinc daemon required!")); + return -1; + } + else + { + BN_hex2bn(&myself->rsa_key->n, cfg->data.ptr); + } +/* + if(RSA_check_key(myself->rsa_key) != 1) + { + syslog(LOG_ERR, _("Invalid public/private keypair!")); + return -1; + } +*/ if(!(cfg = get_config_val(myself->config, port))) myself->port = 655; else @@ -712,6 +753,7 @@ cp int setup_network_connections(void) { config_t const *cfg; + char *scriptname; cp if((cfg = get_config_val(config, pingtimeout)) == NULL) timeout = 5; @@ -724,6 +766,23 @@ cp if(setup_myself() < 0) return -1; + /* Run tinc-up script to further initialize the tap interface */ + + asprintf(&scriptname, "%s/tinc-up", confbase); + + if(!fork()) + { + + execl(scriptname, NULL); + + if(errno != ENOENT) + syslog(LOG_WARNING, _("Error while executing %s: %m"), scriptname); + + exit(0); + } + + free(scriptname); + if((cfg = get_next_config_val(config, connectto, upstreamindex++)) == NULL) /* No upstream IP given, we're listen only. */ return 0; @@ -750,6 +809,7 @@ cp void close_network_connections(void) { conn_list_t *p; + char *scriptname; cp for(p = conn_list; p != NULL; p = p->next) { @@ -773,6 +833,22 @@ cp close(myself->socket); } + /* Execute tinc-down script right before shutting down the interface */ + + asprintf(&scriptname, "%s/tinc-down", confbase); + + if(!fork()) + { + execl(scriptname, NULL); + + if(errno != ENOENT) + syslog(LOG_WARNING, _("Error while executing %s: %m"), scriptname); + + exit(0); + } + + free(scriptname); + close(tap_fd); destroy_conn_list(); @@ -1111,10 +1187,24 @@ void handle_tap_input(void) int ether_type, lenin; cp memset(&vp, 0, sizeof(vp)); - if((lenin = read(tap_fd, &vp, MTU)) <= 0) + + if(taptype = 1) { - syslog(LOG_ERR, _("Error while reading from tapdevice: %m")); - return; + if((lenin = read(tap_fd, vp.data, MTU)) <= 0) + { + syslog(LOG_ERR, _("Error while reading from tapdevice: %m")); + return; + } + vp.len = lenin; + } + else + { + if((lenin = read(tap_fd, &vp, MTU)) <= 0) + { + syslog(LOG_ERR, _("Error while reading from tapdevice: %m")); + return; + } + vp.len = lenin - 2; } total_tap_in += lenin; @@ -1137,10 +1227,6 @@ cp from = ntohl(*((unsigned long*)(&vp.data[26]))); to = ntohl(*((unsigned long*)(&vp.data[30]))); - vp.len = (length_t)lenin - 2; - - strip_mac_addresses(&vp); - send_packet(to, &vp); cp }