|
|
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: #include "net/vde.h" ! 25: ! 26: #include "config-host.h" ! 27: ! 28: #include <libvdeplug.h> ! 29: ! 30: #include "net.h" ! 31: #include "qemu-char.h" ! 32: #include "qemu-common.h" ! 33: #include "qemu-option.h" ! 34: #include "sysemu.h" ! 35: ! 36: typedef struct VDEState { ! 37: VLANClientState nc; ! 38: VDECONN *vde; ! 39: } VDEState; ! 40: ! 41: static void vde_to_qemu(void *opaque) ! 42: { ! 43: VDEState *s = opaque; ! 44: uint8_t buf[4096]; ! 45: int size; ! 46: ! 47: size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0); ! 48: if (size > 0) { ! 49: qemu_send_packet(&s->nc, buf, size); ! 50: } ! 51: } ! 52: ! 53: static ssize_t vde_receive(VLANClientState *nc, const uint8_t *buf, size_t size) ! 54: { ! 55: VDEState *s = DO_UPCAST(VDEState, nc, nc); ! 56: ssize_t ret; ! 57: ! 58: do { ! 59: ret = vde_send(s->vde, (const char *)buf, size, 0); ! 60: } while (ret < 0 && errno == EINTR); ! 61: ! 62: return ret; ! 63: } ! 64: ! 65: static void vde_cleanup(VLANClientState *nc) ! 66: { ! 67: VDEState *s = DO_UPCAST(VDEState, nc, nc); ! 68: qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL); ! 69: vde_close(s->vde); ! 70: } ! 71: ! 72: static NetClientInfo net_vde_info = { ! 73: .type = NET_CLIENT_TYPE_VDE, ! 74: .size = sizeof(VDEState), ! 75: .receive = vde_receive, ! 76: .cleanup = vde_cleanup, ! 77: }; ! 78: ! 79: static int net_vde_init(VLANState *vlan, const char *model, ! 80: const char *name, const char *sock, ! 81: int port, const char *group, int mode) ! 82: { ! 83: VLANClientState *nc; ! 84: VDEState *s; ! 85: VDECONN *vde; ! 86: char *init_group = (char *)group; ! 87: char *init_sock = (char *)sock; ! 88: ! 89: struct vde_open_args args = { ! 90: .port = port, ! 91: .group = init_group, ! 92: .mode = mode, ! 93: }; ! 94: ! 95: vde = vde_open(init_sock, (char *)"QEMU", &args); ! 96: if (!vde){ ! 97: return -1; ! 98: } ! 99: ! 100: nc = qemu_new_net_client(&net_vde_info, vlan, NULL, model, name); ! 101: ! 102: snprintf(nc->info_str, sizeof(nc->info_str), "sock=%s,fd=%d", ! 103: sock, vde_datafd(vde)); ! 104: ! 105: s = DO_UPCAST(VDEState, nc, nc); ! 106: ! 107: s->vde = vde; ! 108: ! 109: qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s); ! 110: ! 111: return 0; ! 112: } ! 113: ! 114: int net_init_vde(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan) ! 115: { ! 116: const char *sock; ! 117: const char *group; ! 118: int port, mode; ! 119: ! 120: sock = qemu_opt_get(opts, "sock"); ! 121: group = qemu_opt_get(opts, "group"); ! 122: ! 123: port = qemu_opt_get_number(opts, "port", 0); ! 124: mode = qemu_opt_get_number(opts, "mode", 0700); ! 125: ! 126: if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) { ! 127: return -1; ! 128: } ! 129: ! 130: if (vlan) { ! 131: vlan->nb_host_devs++; ! 132: } ! 133: ! 134: return 0; ! 135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.