|
|
1.1 ! root 1: /* ! 2: * QEMU System Emulator ! 3: * ! 4: * Copyright (c) 2003-2008 Fabrice Bellard ! 5: * ! 6: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 7: * of this software and associated documentation files (the "Software"), to deal ! 8: * in the Software without restriction, including without limitation the rights ! 9: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! 10: * copies of the Software, and to permit persons to whom the Software is ! 11: * furnished to do so, subject to the following conditions: ! 12: * ! 13: * The above copyright notice and this permission notice shall be included in ! 14: * all copies or substantial portions of the Software. ! 15: * ! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ! 19: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ! 21: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ! 22: * THE SOFTWARE. ! 23: */ ! 24: ! 25: #include "net/tap.h" ! 26: #include "qemu-common.h" ! 27: #include "sysemu.h" ! 28: ! 29: #ifdef __NetBSD__ ! 30: #include <net/if_tap.h> ! 31: #endif ! 32: ! 33: #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) ! 34: #include <libutil.h> ! 35: #else ! 36: #include <util.h> ! 37: #endif ! 38: ! 39: #if defined(__OpenBSD__) ! 40: #include <util.h> ! 41: #endif ! 42: ! 43: int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required) ! 44: { ! 45: int fd; ! 46: char *dev; ! 47: struct stat s; ! 48: ! 49: #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ! 50: /* if no ifname is given, always start the search from tap0. */ ! 51: int i; ! 52: char dname[100]; ! 53: ! 54: for (i = 0; i < 10; i++) { ! 55: if (*ifname) { ! 56: snprintf(dname, sizeof dname, "/dev/%s", ifname); ! 57: } else { ! 58: snprintf(dname, sizeof dname, "/dev/tap%d", i); ! 59: } ! 60: TFR(fd = open(dname, O_RDWR)); ! 61: if (fd >= 0) { ! 62: break; ! 63: } ! 64: else if (errno == ENXIO || errno == ENOENT) { ! 65: break; ! 66: } ! 67: if (*ifname) { ! 68: break; ! 69: } ! 70: } ! 71: if (fd < 0) { ! 72: qemu_error("warning: could not open %s (%s): no virtual network emulation\n", dname, strerror(errno)); ! 73: return -1; ! 74: } ! 75: #else ! 76: TFR(fd = open("/dev/tap", O_RDWR)); ! 77: if (fd < 0) { ! 78: fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n"); ! 79: return -1; ! 80: } ! 81: #endif ! 82: ! 83: fstat(fd, &s); ! 84: dev = devname(s.st_rdev, S_IFCHR); ! 85: pstrcpy(ifname, ifname_size, dev); ! 86: ! 87: if (*vnet_hdr) { ! 88: /* BSD doesn't have IFF_VNET_HDR */ ! 89: *vnet_hdr = 0; ! 90: ! 91: if (vnet_hdr_required && !*vnet_hdr) { ! 92: qemu_error("vnet_hdr=1 requested, but no kernel " ! 93: "support for IFF_VNET_HDR available"); ! 94: close(fd); ! 95: return -1; ! 96: } ! 97: } ! 98: fcntl(fd, F_SETFL, O_NONBLOCK); ! 99: return fd; ! 100: } ! 101: ! 102: int tap_set_sndbuf(int fd, QemuOpts *opts) ! 103: { ! 104: return 0; ! 105: } ! 106: ! 107: int tap_probe_vnet_hdr(int fd) ! 108: { ! 109: return 0; ! 110: } ! 111: ! 112: int tap_probe_has_ufo(int fd) ! 113: { ! 114: return 0; ! 115: } ! 116: ! 117: void tap_fd_set_offload(int fd, int csum, int tso4, ! 118: int tso6, int ecn, int ufo) ! 119: { ! 120: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.