Skip to content

Commit

Permalink
libtap: start introducing internal list/config tracking
Browse files Browse the repository at this point in the history
Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Dec 16, 2010
1 parent a0cbd79 commit 64252db
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 14 deletions.
53 changes: 41 additions & 12 deletions libtap/libtap.c
Expand Up @@ -20,7 +20,8 @@
#include "libtap.h"
#include "libtap_private.h"

STATIC int tap_sockfd = 0;
STATIC int tap_init = 0;
STATIC struct tap_config tap_cfg;
STATIC pthread_mutex_t tap_mutex = PTHREAD_MUTEX_INITIALIZER;

/* forward declarations */
Expand Down Expand Up @@ -198,14 +199,20 @@ knet_tap_t knet_tap_open(char *dev, size_t dev_size)
goto out_error;
}

if (!tap_sockfd)
tap_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (tap_sockfd < 0)
if (!tap_init) {
tap_cfg.tap_head = NULL;
tap_cfg.tap_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (tap_cfg.tap_sockfd < 0)
goto out_error;
tap_init = 1;
}

if (ioctl(tap_sockfd, SIOGIFINDEX, &knet_tap->ifr) < 0)
if (ioctl(tap_cfg.tap_sockfd, SIOGIFINDEX, &knet_tap->ifr) < 0)
goto out_error;

knet_tap->next = tap_cfg.tap_head;
tap_cfg.tap_head = knet_tap;

pthread_mutex_unlock(&tap_mutex);
return knet_tap;

Expand All @@ -217,9 +224,24 @@ knet_tap_t knet_tap_open(char *dev, size_t dev_size)

void knet_tap_close(knet_tap_t knet_tap)
{
knet_tap_t temp = tap_cfg.tap_head;
knet_tap_t prev = tap_cfg.tap_head;

pthread_mutex_lock(&tap_mutex);

tap_close_unsafe(knet_tap);
while (temp != knet_tap) {
prev = temp;
temp = temp->next;
}

if (temp == knet_tap) {
if (knet_tap == prev) {
tap_cfg.tap_head = knet_tap->next;
} else {
prev->next = knet_tap->next;
}
tap_close_unsafe(knet_tap);
}

pthread_mutex_unlock(&tap_mutex);

Expand All @@ -238,7 +260,7 @@ int knet_tap_get_mtu(const knet_tap_t knet_tap)
goto out;
}

err = ioctl(tap_sockfd, SIOCGIFMTU, &knet_tap->ifr);
err = ioctl(tap_cfg.tap_sockfd, SIOCGIFMTU, &knet_tap->ifr);
if (err)
goto out;

Expand All @@ -254,6 +276,8 @@ int knet_tap_set_mtu(knet_tap_t knet_tap, const int mtu)
{
int err, oldmtu;

knet_tap_get_mtu(knet_tap);

pthread_mutex_lock(&tap_mutex);

if (!knet_tap) {
Expand All @@ -265,7 +289,7 @@ int knet_tap_set_mtu(knet_tap_t knet_tap, const int mtu)
oldmtu = knet_tap->ifr.ifr_mtu;
knet_tap->ifr.ifr_mtu = mtu;

err = ioctl(tap_sockfd, SIOCSIFMTU, &knet_tap->ifr);
err = ioctl(tap_cfg.tap_sockfd, SIOCSIFMTU, &knet_tap->ifr);
if (err)
knet_tap->ifr.ifr_mtu = oldmtu;

Expand All @@ -288,7 +312,7 @@ int knet_tap_get_mac(const knet_tap_t knet_tap, char **ether_addr)
goto out;
}

err = ioctl(tap_sockfd, SIOCGIFHWADDR, &knet_tap->ifr);
err = ioctl(tap_cfg.tap_sockfd, SIOCGIFHWADDR, &knet_tap->ifr);
if (err)
goto out;

Expand All @@ -307,8 +331,13 @@ int knet_tap_get_mac(const knet_tap_t knet_tap, char **ether_addr)
int knet_tap_set_mac(knet_tap_t knet_tap, const char *ether_addr)
{
struct ether_addr oldmac;
char *temp_mac = NULL;
int err;

knet_tap_get_mac(knet_tap, &temp_mac);
if (temp_mac)
free(temp_mac);

pthread_mutex_lock(&tap_mutex);

if ((!knet_tap) || (!ether_addr)) {
Expand All @@ -320,7 +349,7 @@ int knet_tap_set_mac(knet_tap_t knet_tap, const char *ether_addr)
memcpy(&oldmac, knet_tap->ifr.ifr_hwaddr.sa_data, ETH_ALEN);
memcpy(knet_tap->ifr.ifr_hwaddr.sa_data, ether_aton(ether_addr), ETH_ALEN);

err = ioctl(tap_sockfd, SIOCSIFHWADDR, &knet_tap->ifr);
err = ioctl(tap_cfg.tap_sockfd, SIOCSIFHWADDR, &knet_tap->ifr);
if (err)
memcpy(knet_tap->ifr.ifr_hwaddr.sa_data, &oldmac, ETH_ALEN);

Expand All @@ -345,7 +374,7 @@ int knet_tap_set_up(knet_tap_t knet_tap)

oldflags = knet_tap->ifr.ifr_flags;
knet_tap->ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
err=ioctl(tap_sockfd, SIOCSIFFLAGS, &knet_tap->ifr);
err=ioctl(tap_cfg.tap_sockfd, SIOCSIFFLAGS, &knet_tap->ifr);

if (err)
knet_tap->ifr.ifr_flags = oldflags;
Expand All @@ -371,7 +400,7 @@ int knet_tap_set_down(knet_tap_t knet_tap)

oldflags = knet_tap->ifr.ifr_flags;
knet_tap->ifr.ifr_flags &= ~IFF_UP;
err=ioctl(tap_sockfd, SIOCSIFFLAGS, &knet_tap->ifr);
err=ioctl(tap_cfg.tap_sockfd, SIOCSIFFLAGS, &knet_tap->ifr);

if (err)
knet_tap->ifr.ifr_flags = oldflags;
Expand Down
6 changes: 6 additions & 0 deletions libtap/libtap_private.h
Expand Up @@ -6,6 +6,12 @@
struct knet_tap {
struct ifreq ifr;
int knet_tap_fd;
struct knet_tap *next;
};

struct tap_config {
struct knet_tap *tap_head;
int tap_sockfd;
};

#endif
5 changes: 3 additions & 2 deletions tests/tap_test.c
Expand Up @@ -11,9 +11,10 @@
#include <unistd.h>

#include "libtap.h"
#include "libtap_private.h"
#include "utils.h"

extern int tap_sockfd;
extern struct tap_config tap_cfg;

extern int tap_execute_shell(const char *command);

Expand Down Expand Up @@ -57,7 +58,7 @@ static int test_iface(char *name, size_t size)

knet_tap=knet_tap_open(name, size);
if (!knet_tap) {
if (tap_sockfd < 0)
if (tap_cfg.tap_sockfd < 0)
log_error("Unable to open knet_socket");
log_error("Unable to open knet.");
if (oldname)
Expand Down

0 comments on commit 64252db

Please sign in to comment.