From 5e112453b2e953c5fa1d248355610ddf06f21b4a Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 30 Sep 2008 10:17:14 +0200 Subject: Sandbox: Fix make system Sandbox compilation failed with: gcc -Wp,-MD,arch/sandbox/lib/.tap.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.3.1/include -I/usr/include -Iinclude -P -Wall -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(tap)" -D"KBUILD_MODNAME=KBUILD_STR(tap)" -c -o arch/sandbox/lib/tap.o arch/sandbox/lib/tap.c In file included from /usr/include/bits/socket.h:32, from /usr/include/sys/socket.h:36, from arch/sandbox/lib/tap.c:29: /usr/include/limits.h:125:26: error: limits.h: No such file or directory /usr/include/limits.h uses the next_include directive This was because of the -nostdinc Signed-off-by: Sascha Hauer --- arch/sandbox/Makefile | 2 +- arch/sandbox/lib/Makefile | 8 - arch/sandbox/lib/common.c | 414 ---------------------------------------------- arch/sandbox/lib/tap.c | 68 -------- arch/sandbox/os/Makefile | 6 + arch/sandbox/os/common.c | 414 ++++++++++++++++++++++++++++++++++++++++++++++ arch/sandbox/os/tap.c | 68 ++++++++ 7 files changed, 489 insertions(+), 491 deletions(-) delete mode 100644 arch/sandbox/lib/common.c delete mode 100644 arch/sandbox/lib/tap.c create mode 100644 arch/sandbox/os/Makefile create mode 100644 arch/sandbox/os/common.c create mode 100644 arch/sandbox/os/tap.c diff --git a/arch/sandbox/Makefile b/arch/sandbox/Makefile index 314c151bea..06f162f63a 100644 --- a/arch/sandbox/Makefile +++ b/arch/sandbox/Makefile @@ -73,6 +73,6 @@ cmd_uboot__ = $(CC) -o $@ -Wl,-T,$(uboot-lds) \ -Wl,--start-group $(uboot-common) -Wl,--end-group \ -lrt -lpthread -common-y += arch/sandbox/lib/ board/sandbox/ +common-y += board/sandbox/ arch/sandbox/os/ MRPROPER_FILES += include/asm-sandbox/arch diff --git a/arch/sandbox/lib/Makefile b/arch/sandbox/lib/Makefile index 418f4d3427..436fd0d3e0 100644 --- a/arch/sandbox/lib/Makefile +++ b/arch/sandbox/lib/Makefile @@ -2,11 +2,3 @@ CPPFLAGS_u-boot.lds = -U$(SUBARCH) -DELF_ARCH=$(ELF_ARCH) \ -DELF_FORMAT="$(ELF_FORMAT)" extra-y += u-boot.lds - -CPPFLAGS := -I/usr/include -Iinclude -P -CFLAGS := -Wall -#NOSTDINC_FLAGS := - -obj-y = common.o tap.o - -USER_OBJS := common.o diff --git a/arch/sandbox/lib/common.c b/arch/sandbox/lib/common.c deleted file mode 100644 index bc90bf9351..0000000000 --- a/arch/sandbox/lib/common.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - * common.c - common wrapper functions between U-Boot and the host - * - * Copyright (c) 2007 Sascha Hauer , Pengutronix - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file - * @brief Common wrapper functions between U-Boot and the host - */ -/* - * These are host includes. Never include any U-Boot header - * files here... - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* - * ...except the ones needed to connect with U-Boot - */ -#include -#include - -static struct termios term_orig, term_vi; -static char erase_char; /* the users erase character */ - -static void rawmode(void) -{ - tcgetattr(0, &term_orig); - term_vi = term_orig; - term_vi.c_lflag &= (~ICANON & ~ECHO & ~ISIG); - term_vi.c_iflag &= (~IXON & ~ICRNL); - term_vi.c_oflag |= (ONLCR); - term_vi.c_cc[VMIN] = 1; - term_vi.c_cc[VTIME] = 0; - erase_char = term_vi.c_cc[VERASE]; - tcsetattr(0, TCSANOW, &term_vi); -} - -static void cookmode(void) -{ - fflush(stdout); - tcsetattr(0, TCSANOW, &term_orig); -} - -void linux_putc(const char c) -{ - fputc(c, stdout); - - /* If \n, also do \r */ - if (c == '\n') - linux_putc ('\r'); - - fflush(stdout); -} - -int linux_tstc(int fd) -{ - struct timeval tv = { - .tv_usec = 100, - }; - fd_set rfds; - int ret; - - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - - /* - * We set the timeout here to 100us, because otherwise - * U-Boot would eat all cpu resources while waiting - * for input. - */ - ret = select(fd + 1, &rfds, NULL, NULL, &tv); - - if (ret) - return 1; - - return 0; -} - -int ctrlc(void) -{ - char chr; - - if (linux_read_nonblock(0, &chr, 1) == 1 && chr == 3) - return 1; - return 0; -} - -int linux_getc(void) -{ - char ret; - - read(0, &ret, 1); - - return ret; -} - -uint64_t linux_get_time(void) -{ - struct timespec ts; - uint64_t now; - - clock_gettime(CLOCK_MONOTONIC, &ts); - - now = ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec; - - return now; -} - -int reset_cpu(int unused) -{ - cookmode(); - exit(0); -} - -void enable_interrupts(void) -{ -} - -void disable_interrupt(void) -{ -} - -int linux_read(int fd, void *buf, size_t count) -{ - ssize_t ret; - - if (count == 0) - return 0; - - do { - ret = read(fd, buf, count); - - if (ret == 0) { - printf("read on fd %d returned 0, device gone? - exiting\n", fd); - reset_cpu(0); - } else if (ret == -1) { - if (errno == EAGAIN) - return -errno; - else if (errno == EINTR) - continue; - else { - printf("read on fd %d returned -1, errno %d - exiting\n", fd, errno); - reset_cpu(0); - } - } - } while (ret <= 0); - - return (int)ret; -} - -int linux_read_nonblock(int fd, void *buf, size_t count) -{ - int oldflags, ret; - - oldflags = fcntl(fd, F_GETFL); - if (oldflags == -1) - goto err_out; - - if (fcntl(fd, F_SETFL, oldflags | O_NONBLOCK) == -1) - goto err_out; - - ret = linux_read(fd, buf, count); - - if (fcntl(fd, F_SETFL, oldflags) == -1) - goto err_out; - - return ret; - -err_out: - perror("fcntl"); - return -1; -} - -ssize_t linux_write(int fd, const void *buf, size_t count) -{ - return write(fd, buf, count); -} - -off_t linux_lseek(int fd, off_t offset) -{ - return lseek(fd, offset, SEEK_SET); -} - -void flush_cache(unsigned long dummy1, unsigned long dummy2) -{ - /* why should we? */ -} - -extern void start_uboot(void); -extern void mem_malloc_init(void *start, void *end); - -static int add_image(char *str, char *name_template) -{ - char *file; - int readonly = 0, map = 1; - struct stat s; - char *opt; - int fd, ret; - struct hf_platform_data *hf = malloc(sizeof(struct hf_platform_data)); - - if (!hf) - return -1; - - file = strtok(str, ","); - while ((opt = strtok(NULL, ","))) { - if (!strcmp(opt, "ro")) - readonly = 1; - if (!strcmp(opt, "map")) - map = 1; - } - - printf("add file %s(%s)\n", file, readonly ? "ro" : ""); - - fd = open(file, readonly ? O_RDONLY : O_RDWR); - hf->fd = fd; - hf->filename = file; - - if (fd < 0) { - perror("open"); - goto err_out; - } - - if (fstat(fd, &s)) { - perror("fstat"); - goto err_out; - } - - hf->size = s.st_size; - - if (map) { - hf->map_base = (unsigned long)mmap(NULL, hf->size, - PROT_READ | (readonly ? 0 : PROT_WRITE), - MAP_SHARED, fd, 0); - if ((void *)hf->map_base == MAP_FAILED) - printf("warning: mmapping %s failed\n", file); - } - - - ret = u_boot_register_filedev(hf, name_template); - if (ret) - goto err_out; - return 0; - -err_out: - if (fd > 0) - close(fd); - free(hf); - return -1; -} - -static void print_usage(const char*); - -int main(int argc, char *argv[]) -{ - void *ram; - int opt, ret, fd; - int malloc_size = 8 * 1024 * 1024; - - ram = malloc(malloc_size); - if (!ram) { - printf("unable to get malloc space\n"); - exit(1); - } - mem_malloc_init(ram, ram + malloc_size); - - while ((opt = getopt(argc, argv, "hi:e:I:O:")) != -1) { - switch (opt) { - case 'h': - print_usage(basename(argv[0])); - exit(0); - case 'i': - ret = add_image(optarg, "fd"); - if (ret) - exit(1); - break; - case 'm': - /* This option is broken. add_image needs malloc, so - * mem_alloc_init() has to be called before option - * parsing - */ - malloc_size = strtoul(optarg, NULL, 0); - break; - case 'e': - ret = add_image(optarg, "env"); - if (ret) - exit(1); - break; - case 'O': - fd = open(optarg, O_WRONLY); - if (fd < 0) { - perror("open"); - exit(1); - } - - u_boot_register_console("cout", -1, fd); - break; - case 'I': - fd = open(optarg, O_RDWR); - if (fd < 0) { - perror("open"); - exit(1); - } - - u_boot_register_console("cin", fd, -1); - break; - default: - exit(1); - } - } - - u_boot_register_console("console", fileno(stdin), fileno(stdout)); - - rawmode(); - start_uboot(); - - /* never reached */ - return 0; -} - -#ifdef __PPC__ -/* HACK: we need this symbol on PPC, better ask a PPC export about this :) */ -char _SDA_BASE_[4096]; -#endif - -static void print_usage(const char *prgname) -{ - printf( -"Usage: %s [OPTIONS]\n" -"Start U-Boot.\n" -"Options:\n" -" -i Map a file to U-Boot. This option can be given multiple\n" -" times. The files will show up as /dev/fd0 ... /dev/fdx\n" -" under U-Boot.\n" -" -e Map a file to U-Boot. With this option files are mapped as\n" -" /dev/env0 ... /dev/envx and thus are used as default\n" -" environment. An empty file generated with dd will do to get\n" -" started wth an empty environment\n" -" -O Register file as a console capable of doing stdout. File can\n" -" be a regular file or a fifo.\n" -" -I Register file as a console capable of doing stdin. File can\n" -" be a regular file or a fifo.\n", - prgname - ); -} - -/** - * @page uboot_simul U-Boot Simulator - * - * U-Boot can be run as a simulator on your host to check and debug new non - * hardware related features. - * - * @section simu_build How to build U-Boot for simulation - * - * @section simu_run How to run U-Boot simulator - * - * $ uboot [\] - * - * Options can be: - * - * -i \ - * - * Map a \ to U-Boot. This option can be given multiple times. The \s - * will show up as /dev/fd0 ... /dev/fdx in the U-Boot simulator. - * - * -e \ - * - * Map \ to U-Boot. With this option \s are mapped as /dev/env0 ... - * /dev/envx and thus are used as default environment. A clean file generated - * with dd will do to get started with an empty environment - * - * -O \ - * - * Register \ as a console capable of doing stdout. \ can be a - * regular file or a fifo. - * - * -I \ - * - * Register \ as a console capable of doing stdin. \ can be a regular - * file or a fifo. - * - * @section simu_dbg How to debug U-Boot simulator - * - */ diff --git a/arch/sandbox/lib/tap.c b/arch/sandbox/lib/tap.c deleted file mode 100644 index ebd828b2b2..0000000000 --- a/arch/sandbox/lib/tap.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * tap.c - host side functions for tap driver - * - * Copyright (c) 2007 Sascha Hauer , Pengutronix - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int tap_alloc(char *dev) -{ - struct ifreq ifr; - int fd, err; - - if ((fd = open("/dev/net/tun", O_RDWR)) < 0) { - perror("could not open /dev/net/tun"); - return -1; - } - - memset(&ifr, 0, sizeof(ifr)); - - /* Flags: IFF_TUN - TUN device (no Ethernet headers) - * IFF_TAP - TAP device - * - * IFF_NO_PI - Do not provide packet information - */ - ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - if (*dev) - strncpy(ifr.ifr_name, dev, IFNAMSIZ); - - if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0) { - perror("could not get tap device"); - close(fd); - return err; - } - - strcpy(dev, ifr.ifr_name); - return fd; -} - -/** - * @file - * @brief Host side functions for tap driver - */ diff --git a/arch/sandbox/os/Makefile b/arch/sandbox/os/Makefile new file mode 100644 index 0000000000..117f05eba0 --- /dev/null +++ b/arch/sandbox/os/Makefile @@ -0,0 +1,6 @@ +CPPFLAGS := -Iinclude/asm/arch -P +CFLAGS := -Wall +NOSTDINC_FLAGS := + +obj-y = common.o tap.o + diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c new file mode 100644 index 0000000000..71b0c8072b --- /dev/null +++ b/arch/sandbox/os/common.c @@ -0,0 +1,414 @@ +/* + * common.c - common wrapper functions between U-Boot and the host + * + * Copyright (c) 2007 Sascha Hauer , Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * @file + * @brief Common wrapper functions between U-Boot and the host + */ +/* + * These are host includes. Never include any U-Boot header + * files here... + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +/* + * ...except the ones needed to connect with U-Boot + */ +#include +#include + +static struct termios term_orig, term_vi; +static char erase_char; /* the users erase character */ + +static void rawmode(void) +{ + tcgetattr(0, &term_orig); + term_vi = term_orig; + term_vi.c_lflag &= (~ICANON & ~ECHO & ~ISIG); + term_vi.c_iflag &= (~IXON & ~ICRNL); + term_vi.c_oflag |= (ONLCR); + term_vi.c_cc[VMIN] = 1; + term_vi.c_cc[VTIME] = 0; + erase_char = term_vi.c_cc[VERASE]; + tcsetattr(0, TCSANOW, &term_vi); +} + +static void cookmode(void) +{ + fflush(stdout); + tcsetattr(0, TCSANOW, &term_orig); +} + +void linux_putc(const char c) +{ + fputc(c, stdout); + + /* If \n, also do \r */ + if (c == '\n') + linux_putc ('\r'); + + fflush(stdout); +} + +int linux_tstc(int fd) +{ + struct timeval tv = { + .tv_usec = 100, + }; + fd_set rfds; + int ret; + + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + /* + * We set the timeout here to 100us, because otherwise + * U-Boot would eat all cpu resources while waiting + * for input. + */ + ret = select(fd + 1, &rfds, NULL, NULL, &tv); + + if (ret) + return 1; + + return 0; +} + +int ctrlc(void) +{ + char chr; + + if (linux_read_nonblock(0, &chr, 1) == 1 && chr == 3) + return 1; + return 0; +} + +int linux_getc(void) +{ + char ret; + + read(0, &ret, 1); + + return ret; +} + +uint64_t linux_get_time(void) +{ + struct timespec ts; + uint64_t now; + + clock_gettime(CLOCK_MONOTONIC, &ts); + + now = ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec; + + return now; +} + +int reset_cpu(int unused) +{ + cookmode(); + exit(0); +} + +void enable_interrupts(void) +{ +} + +void disable_interrupt(void) +{ +} + +int linux_read(int fd, void *buf, size_t count) +{ + ssize_t ret; + + if (count == 0) + return 0; + + do { + ret = read(fd, buf, count); + + if (ret == 0) { + printf("read on fd %d returned 0, device gone? - exiting\n", fd); + reset_cpu(0); + } else if (ret == -1) { + if (errno == EAGAIN) + return -errno; + else if (errno == EINTR) + continue; + else { + printf("read on fd %d returned -1, errno %d - exiting\n", fd, errno); + reset_cpu(0); + } + } + } while (ret <= 0); + + return (int)ret; +} + +int linux_read_nonblock(int fd, void *buf, size_t count) +{ + int oldflags, ret; + + oldflags = fcntl(fd, F_GETFL); + if (oldflags == -1) + goto err_out; + + if (fcntl(fd, F_SETFL, oldflags | O_NONBLOCK) == -1) + goto err_out; + + ret = linux_read(fd, buf, count); + + if (fcntl(fd, F_SETFL, oldflags) == -1) + goto err_out; + + return ret; + +err_out: + perror("fcntl"); + return -1; +} + +ssize_t linux_write(int fd, const void *buf, size_t count) +{ + return write(fd, buf, count); +} + +off_t linux_lseek(int fd, off_t offset) +{ + return lseek(fd, offset, SEEK_SET); +} + +void flush_cache(unsigned long dummy1, unsigned long dummy2) +{ + /* why should we? */ +} + +extern void start_uboot(void); +extern void mem_malloc_init(void *start, void *end); + +static int add_image(char *str, char *name_template) +{ + char *file; + int readonly = 0, map = 1; + struct stat s; + char *opt; + int fd, ret; + struct hf_platform_data *hf = malloc(sizeof(struct hf_platform_data)); + + if (!hf) + return -1; + + file = strtok(str, ","); + while ((opt = strtok(NULL, ","))) { + if (!strcmp(opt, "ro")) + readonly = 1; + if (!strcmp(opt, "map")) + map = 1; + } + + printf("add file %s(%s)\n", file, readonly ? "ro" : ""); + + fd = open(file, readonly ? O_RDONLY : O_RDWR); + hf->fd = fd; + hf->filename = file; + + if (fd < 0) { + perror("open"); + goto err_out; + } + + if (fstat(fd, &s)) { + perror("fstat"); + goto err_out; + } + + hf->size = s.st_size; + + if (map) { + hf->map_base = (unsigned long)mmap(NULL, hf->size, + PROT_READ | (readonly ? 0 : PROT_WRITE), + MAP_SHARED, fd, 0); + if ((void *)hf->map_base == MAP_FAILED) + printf("warning: mmapping %s failed\n", file); + } + + + ret = u_boot_register_filedev(hf, name_template); + if (ret) + goto err_out; + return 0; + +err_out: + if (fd > 0) + close(fd); + free(hf); + return -1; +} + +static void print_usage(const char*); + +int main(int argc, char *argv[]) +{ + void *ram; + int opt, ret, fd; + int malloc_size = 8 * 1024 * 1024; + + ram = malloc(malloc_size); + if (!ram) { + printf("unable to get malloc space\n"); + exit(1); + } + mem_malloc_init(ram, ram + malloc_size); + + while ((opt = getopt(argc, argv, "hi:e:I:O:")) != -1) { + switch (opt) { + case 'h': + print_usage(basename(argv[0])); + exit(0); + case 'i': + ret = add_image(optarg, "fd"); + if (ret) + exit(1); + break; + case 'm': + /* This option is broken. add_image needs malloc, so + * mem_alloc_init() has to be called before option + * parsing + */ + malloc_size = strtoul(optarg, NULL, 0); + break; + case 'e': + ret = add_image(optarg, "env"); + if (ret) + exit(1); + break; + case 'O': + fd = open(optarg, O_WRONLY); + if (fd < 0) { + perror("open"); + exit(1); + } + + u_boot_register_console("cout", -1, fd); + break; + case 'I': + fd = open(optarg, O_RDWR); + if (fd < 0) { + perror("open"); + exit(1); + } + + u_boot_register_console("cin", fd, -1); + break; + default: + exit(1); + } + } + + u_boot_register_console("console", fileno(stdin), fileno(stdout)); + + rawmode(); + start_uboot(); + + /* never reached */ + return 0; +} + +#ifdef __PPC__ +/* HACK: we need this symbol on PPC, better ask a PPC export about this :) */ +char _SDA_BASE_[4096]; +#endif + +static void print_usage(const char *prgname) +{ + printf( +"Usage: %s [OPTIONS]\n" +"Start U-Boot.\n" +"Options:\n" +" -i Map a file to U-Boot. This option can be given multiple\n" +" times. The files will show up as /dev/fd0 ... /dev/fdx\n" +" under U-Boot.\n" +" -e Map a file to U-Boot. With this option files are mapped as\n" +" /dev/env0 ... /dev/envx and thus are used as default\n" +" environment. An empty file generated with dd will do to get\n" +" started wth an empty environment\n" +" -O Register file as a console capable of doing stdout. File can\n" +" be a regular file or a fifo.\n" +" -I Register file as a console capable of doing stdin. File can\n" +" be a regular file or a fifo.\n", + prgname + ); +} + +/** + * @page uboot_simul U-Boot Simulator + * + * U-Boot can be run as a simulator on your host to check and debug new non + * hardware related features. + * + * @section simu_build How to build U-Boot for simulation + * + * @section simu_run How to run U-Boot simulator + * + * $ uboot [\] + * + * Options can be: + * + * -i \ + * + * Map a \ to U-Boot. This option can be given multiple times. The \s + * will show up as /dev/fd0 ... /dev/fdx in the U-Boot simulator. + * + * -e \ + * + * Map \ to U-Boot. With this option \s are mapped as /dev/env0 ... + * /dev/envx and thus are used as default environment. A clean file generated + * with dd will do to get started with an empty environment + * + * -O \ + * + * Register \ as a console capable of doing stdout. \ can be a + * regular file or a fifo. + * + * -I \ + * + * Register \ as a console capable of doing stdin. \ can be a regular + * file or a fifo. + * + * @section simu_dbg How to debug U-Boot simulator + * + */ diff --git a/arch/sandbox/os/tap.c b/arch/sandbox/os/tap.c new file mode 100644 index 0000000000..ebd828b2b2 --- /dev/null +++ b/arch/sandbox/os/tap.c @@ -0,0 +1,68 @@ +/* + * tap.c - host side functions for tap driver + * + * Copyright (c) 2007 Sascha Hauer , Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int tap_alloc(char *dev) +{ + struct ifreq ifr; + int fd, err; + + if ((fd = open("/dev/net/tun", O_RDWR)) < 0) { + perror("could not open /dev/net/tun"); + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + + /* Flags: IFF_TUN - TUN device (no Ethernet headers) + * IFF_TAP - TAP device + * + * IFF_NO_PI - Do not provide packet information + */ + ifr.ifr_flags = IFF_TAP | IFF_NO_PI; + if (*dev) + strncpy(ifr.ifr_name, dev, IFNAMSIZ); + + if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0) { + perror("could not get tap device"); + close(fd); + return err; + } + + strcpy(dev, ifr.ifr_name); + return fd; +} + +/** + * @file + * @brief Host side functions for tap driver + */ -- cgit v1.2.3