Skip to content

Commit

Permalink
libtap: add knet_tap_find, switch to ifname macro
Browse files Browse the repository at this point in the history
also revert a0cbd79 to fix unnamed tap device creation

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Dec 17, 2010
1 parent 7e9275e commit 9f7376c
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 24 deletions.
43 changes: 38 additions & 5 deletions libtap/libtap.c
Expand Up @@ -211,6 +211,37 @@ static int tap_get_mac_unsafe(const knet_tap_t knet_tap, char **ether_addr)
return err;
}

knet_tap_t knet_tap_find(char *dev, size_t dev_size)
{
knet_tap_t knet_tap;

if (dev == NULL) {
errno = EINVAL;
return NULL;
}

if (dev_size < IFNAMSIZ) {
errno = EINVAL;
return NULL;
}

if (strlen(dev) > IFNAMSIZ) {
errno = E2BIG;
return NULL;
}

pthread_mutex_lock(&tap_mutex);

knet_tap = tap_cfg.tap_head;
while (knet_tap != NULL) {
if (!strcmp(dev, knet_tap->ifname))
break;
knet_tap = knet_tap->next;
}

pthread_mutex_unlock(&tap_mutex);
return knet_tap;
}

knet_tap_t knet_tap_open(char *dev, size_t dev_size)
{
Expand Down Expand Up @@ -243,17 +274,19 @@ knet_tap_t knet_tap_open(char *dev, size_t dev_size)
if ((knet_tap->knet_tap_fd = open("/dev/net/tun", O_RDWR)) < 0)
goto out_error;

strncpy(knet_tap->ifr.ifr_name, dev, IFNAMSIZ);
strncpy(knet_tap->ifname, dev, IFNAMSIZ);
knet_tap->ifr.ifr_flags = IFF_TAP | IFF_NO_PI;

if (ioctl(knet_tap->knet_tap_fd, TUNSETIFF, &knet_tap->ifr) < 0)
goto out_error;

if ((strlen(dev) > 0) && (strcmp(dev, knet_tap->ifr.ifr_name) != 0)) {
if ((strlen(dev) > 0) && (strcmp(dev, knet_tap->ifname) != 0)) {
errno = EBUSY;
goto out_error;
}

strcpy(dev, knet_tap->ifname);

if (!tap_init) {
tap_cfg.tap_head = NULL;
tap_cfg.tap_sockfd = socket(AF_INET, SOCK_STREAM, 0);
Expand Down Expand Up @@ -298,7 +331,7 @@ void knet_tap_close(knet_tap_t knet_tap)

pthread_mutex_lock(&tap_mutex);

while (temp != knet_tap) {
while ((temp) && (temp != knet_tap)) {
prev = temp;
temp = temp->next;
}
Expand Down Expand Up @@ -506,13 +539,13 @@ static int tap_set_ip(knet_tap_t knet_tap, const char *command,
snprintf(cmdline, sizeof(cmdline)-1,
"ip addr %s %s/%s dev %s broadcast %s",
command, ip_addr, prefix,
knet_tap->ifr.ifr_name, broadcast);
knet_tap->ifname, broadcast);
free(broadcast);
} else {
snprintf(cmdline, sizeof(cmdline)-1,
"ip addr %s %s/%s dev %s",
command, ip_addr, prefix,
knet_tap->ifr.ifr_name);
knet_tap->ifname);
}

return tap_execute_shell(cmdline);
Expand Down
2 changes: 2 additions & 0 deletions libtap/libtap.h
Expand Up @@ -6,6 +6,8 @@ typedef struct knet_tap *knet_tap_t;
knet_tap_t knet_tap_open(char *dev, size_t dev_size);
void knet_tap_close(knet_tap_t knet_tap);

knet_tap_t knet_tap_find(char *dev, size_t dev_size);

int knet_tap_get_fd(const knet_tap_t knet_tap);

int knet_tap_get_mtu(const knet_tap_t knet_tap);
Expand Down
2 changes: 2 additions & 0 deletions libtap/libtap_private.h
Expand Up @@ -11,6 +11,8 @@ struct knet_tap {
struct knet_tap *next;
};

#define ifname ifr.ifr_name

struct tap_config {
struct knet_tap *tap_head;
int tap_sockfd;
Expand Down
25 changes: 6 additions & 19 deletions tests/tap_test.c
Expand Up @@ -46,46 +46,33 @@ static int is_if_in_system(char *name)
static int test_iface(char *name, size_t size)
{
knet_tap_t knet_tap;
char *oldname = NULL;

if ((name) && (strlen(name))) {
oldname = strdup(name);
if (!oldname) {
log_error("Not enough memory to run the test");
exit(1);
}
}

knet_tap=knet_tap_open(name, size);
if (!knet_tap) {
if (tap_cfg.tap_sockfd < 0)
log_error("Unable to open knet_socket");
log_error("Unable to open knet.");
if (oldname)
free(oldname);
return -1;
}
log_info("Created interface: %s", name);

if (oldname) {
if (strcmp(oldname, name) != 0)
log_error("New name does NOT match request name... NOT FATAL");
}

if (is_if_in_system(name) > 0) {
log_info("Found interface %s on the system", name);
} else {
log_info("Unable to find interface %s on the system", name);
}

if (!knet_tap_find(name, size)) {
log_info("Unable to find interface %s in tap db", name);
} else {
log_info("Found interface %s in tap db", name);
}

knet_tap_close(knet_tap);

if (is_if_in_system(name) == 0)
log_info("Successfully removed interface %s from the system", name);

if (oldname)
free(oldname);

return 0;
}

Expand Down

0 comments on commit 9f7376c

Please sign in to comment.