diff options
author | Martin Willi <martin@strongswan.org> | 2007-07-26 07:39:49 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2007-07-26 07:39:49 +0000 |
commit | 369a17c218250f8e333756ca4a2a955dde070964 (patch) | |
tree | 0be579d9aa19c8b80b8c9bda9fa8b51191a666b8 | |
parent | 53b0f3c3b3a9ec5c3059d86657444700297e56ae (diff) | |
download | strongswan-369a17c218250f8e333756ca4a2a955dde070964.tar.bz2 strongswan-369a17c218250f8e333756ca4a2a955dde070964.tar.xz |
fixed tap device setup (requires open/close for each call)
using more meaningful names for tap devices
-rw-r--r-- | src/dumm/guest.c | 4 | ||||
-rw-r--r-- | src/dumm/iface.c | 94 | ||||
-rw-r--r-- | src/dumm/iface.h | 9 | ||||
-rw-r--r-- | src/dumm/main.c | 11 | ||||
-rw-r--r-- | src/dumm/mconsole.c | 2 |
5 files changed, 65 insertions, 55 deletions
diff --git a/src/dumm/guest.c b/src/dumm/guest.c index cdb97c7bd..32af9333c 100644 --- a/src/dumm/guest.c +++ b/src/dumm/guest.c @@ -79,7 +79,7 @@ static iface_t* create_iface(private_guest_t *this, char *name) iterator = this->ifaces->create_iterator(this->ifaces, TRUE); while (iterator->iterate(iterator, (void**)&iface)) { - if (streq(name, iface->get_guest(iface))) + if (streq(name, iface->get_guestif(iface))) { DBG1("guest '%s' already has an interface '%s'", this->name, name); iterator->destroy(iterator); @@ -88,7 +88,7 @@ static iface_t* create_iface(private_guest_t *this, char *name) } iterator->destroy(iterator); - iface = iface_create(name, this->mconsole); + iface = iface_create(this->name, name, this->mconsole); if (iface) { this->ifaces->insert_last(this->ifaces, iface); diff --git a/src/dumm/iface.c b/src/dumm/iface.c index 2bc8a3ec8..56b4322f2 100644 --- a/src/dumm/iface.c +++ b/src/dumm/iface.c @@ -19,6 +19,7 @@ #include <sys/types.h> #include <fcntl.h> #include <unistd.h> +#include <stdio.h> #include <net/if.h> #include <sys/ioctl.h> #include <linux/if_tun.h> @@ -33,29 +34,27 @@ struct private_iface_t { /** public interface */ iface_t public; /** device name in guest (eth0) */ - char *guest; + char *guestif; /** device name at host (tap0) */ - char *host; - /** tap device handle to manage taps */ - int tap; + char *hostif; /** mconsole for guest */ mconsole_t *mconsole; }; /** - * Implementation of iface_t.get_guest. + * Implementation of iface_t.get_guestif. */ -static char* get_guest(private_iface_t *this) +static char* get_guestif(private_iface_t *this) { - return this->guest; + return this->guestif; } /** - * Implementation of iface_t.get_host. + * Implementation of iface_t.get_hostif. */ -static char* get_host(private_iface_t *this) +static char* get_hostif(private_iface_t *this) { - return this->host; + return this->hostif; } /** @@ -64,37 +63,56 @@ static char* get_host(private_iface_t *this) static bool destroy_tap(private_iface_t *this) { struct ifreq ifr; + int tap; memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - strncpy(ifr.ifr_name, this->host, sizeof(ifr.ifr_name) - 1); + strncpy(ifr.ifr_name, this->hostif, sizeof(ifr.ifr_name) - 1); - if (ioctl(this->tap, TUNSETIFF, &ifr) < 0 || - ioctl(this->tap, TUNSETPERSIST, 0) < 0) + tap = open(TAP_DEVICE, O_RDWR); + if (tap < 0) { - DBG1("removing %s failed: %m", this->host); + DBG1("unable to open tap device %s: %m", TAP_DEVICE); return FALSE; } + if (ioctl(tap, TUNSETIFF, &ifr) < 0 || + ioctl(tap, TUNSETPERSIST, 0) < 0) + { + DBG1("removing %s failed: %m", this->hostif); + close(tap); + return FALSE; + } + close(tap); return TRUE; } /** * create the tap device */ -static char* create_tap(private_iface_t *this) +static char* create_tap(private_iface_t *this, char *guest) { struct ifreq ifr; + int tap; memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - - if (ioctl(this->tap, TUNSETIFF, &ifr) < 0 || - ioctl(this->tap, TUNSETPERSIST, 1) < 0 || - ioctl(this->tap, TUNSETOWNER, 0)) + snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s-%s", guest, this->guestif); + + tap = open(TAP_DEVICE, O_RDWR); + if (tap < 0) + { + DBG1("unable to open tap device %s: %m", TAP_DEVICE); + return NULL; + } + if (ioctl(tap, TUNSETIFF, &ifr) < 0 || + ioctl(tap, TUNSETPERSIST, 1) < 0 || + ioctl(tap, TUNSETOWNER, 0)) { DBG1("creating new tap device failed: %m"); + close(tap); return NULL; } + close(tap); return strdup(ifr.ifr_name); } @@ -103,50 +121,40 @@ static char* create_tap(private_iface_t *this) */ static void destroy(private_iface_t *this) { - this->mconsole->del_iface(this->mconsole, this->guest); + this->mconsole->del_iface(this->mconsole, this->guestif); destroy_tap(this); - close(this->tap); - free(this->guest); - free(this->host); + free(this->guestif); + free(this->hostif); free(this); } /** * create the iface instance */ -iface_t *iface_create(char *guest, mconsole_t *mconsole) +iface_t *iface_create(char *guest, char *guestif, mconsole_t *mconsole) { private_iface_t *this = malloc_thing(private_iface_t); - this->public.get_host = (char*(*)(iface_t*))get_host; - this->public.get_guest = (char*(*)(iface_t*))get_guest; + this->public.get_hostif = (char*(*)(iface_t*))get_hostif; + this->public.get_guestif = (char*(*)(iface_t*))get_guestif; this->public.destroy = (void*)destroy; this->mconsole = mconsole; - this->tap = open(TAP_DEVICE, O_RDWR); - if (this->tap < 0) - { - DBG1("unable to open tap device %s: %m", TAP_DEVICE); - free(this); - return NULL; - } - this->guest = strdup(guest); - this->host = create_tap(this); - if (this->host == NULL) + this->guestif = strdup(guestif); + this->hostif = create_tap(this, guest); + if (this->hostif == NULL) { destroy_tap(this); - close(this->tap); - free(this->guest); + free(this->guestif); free(this); return NULL; } - if (!this->mconsole->add_iface(this->mconsole, this->guest, this->host)) + if (!this->mconsole->add_iface(this->mconsole, this->guestif, this->hostif)) { - DBG1("creating interface '%s' in guest failed", this->guest); + DBG1("creating interface '%s' in guest failed", this->guestif); destroy_tap(this); - close(this->tap); - free(this->guest); - free(this->host); + free(this->guestif); + free(this->hostif); free(this); return NULL; } diff --git a/src/dumm/iface.h b/src/dumm/iface.h index de69fcbba..06270e836 100644 --- a/src/dumm/iface.h +++ b/src/dumm/iface.h @@ -35,14 +35,14 @@ struct iface_t { * * @return guest interface name */ - char* (*get_guest)(iface_t *this); + char* (*get_guestif)(iface_t *this); /** * @brief Get the interface name at the host (e.g. tap0). * * @return host interface (tap device) name */ - char* (*get_host)(iface_t *this); + char* (*get_hostif)(iface_t *this); /* bool (*up) (iface_t *this); @@ -61,10 +61,11 @@ struct iface_t { /** * @brief Create a new interface for a guest * - * @param guest name of the interface in the guest + * @param guest name of the guest for this interface + * @param guestif name of the interface in the guest * @param mconsole mconsole of guest * @return interface descriptor, or NULL if failed */ -iface_t *iface_create(char *guest, mconsole_t *mconsole); +iface_t *iface_create(char *guest, char *guestif, mconsole_t *mconsole); #endif /* IFACE_H */ diff --git a/src/dumm/main.c b/src/dumm/main.c index 5d3cbbd5f..437e4ed0e 100644 --- a/src/dumm/main.c +++ b/src/dumm/main.c @@ -151,7 +151,7 @@ static void add_if(guest_t *guest, char *name) if (iface) { printf("created guest interface '%s' connected to '%s'\n", - iface->get_guest(iface), iface->get_host(iface)); + iface->get_guestif(iface), iface->get_hostif(iface)); } else { @@ -171,11 +171,11 @@ static void del_if(guest_t *guest, char *name) iterator = guest->create_iface_iterator(guest); while (iterator->iterate(iterator, (void**)&iface)) { - if (streq(name, iface->get_guest(iface))) + if (streq(name, iface->get_guestif(iface))) { iterator->remove(iterator); printf("removing interface '%s' ('%s') from %s\n", - iface->get_guest(iface), iface->get_host(iface), + iface->get_guestif(iface), iface->get_hostif(iface), guest->get_name(guest)); iface->destroy(iface); found = TRUE; @@ -201,7 +201,7 @@ static void list_if(guest_t *guest) iterator = guest->create_iface_iterator(guest); while (iterator->iterate(iterator, (void**)&iface)) { - printf("'%s' => '%s'\n", iface->get_guest(iface), iface->get_host(iface)); + printf("'%s' => '%s'\n", iface->get_guestif(iface), iface->get_hostif(iface)); } iterator->destroy(iterator); @@ -318,7 +318,8 @@ static void list(dumm_t *dumm) ifaces = guest->create_iface_iterator(guest); while (ifaces->iterate(ifaces, (void**)&iface)) { - printf(" '%s' => '%s'\n", iface->get_guest(iface), iface->get_host(iface)); + printf(" '%s' => '%s'\n", + iface->get_guestif(iface), iface->get_hostif(iface)); } ifaces->destroy(ifaces); } diff --git a/src/dumm/mconsole.c b/src/dumm/mconsole.c index 7735e520c..466a68ad9 100644 --- a/src/dumm/mconsole.c +++ b/src/dumm/mconsole.c @@ -154,7 +154,7 @@ mconsole_t *mconsole_create(char *sock) } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - sprintf(&addr.sun_path[1], "%5d-%s", getpid(), sock); + snprintf(&addr.sun_path[1], sizeof(addr.sun_path), "%5d-%s", getpid(), sock); if (bind(this->socket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { DBG1("binding mconsole socket failed: %m"); |