int main(int argc, const char *argv[]) { int syserr; vnd_errno_t vnderr; vnd_handle_t *vhp, *vhp2; if (argc < 2) { (void) fprintf(stderr, "missing arguments...\n"); return (1); } if (strlen(argv[1]) >= LIBVND_NAMELEN) { (void) fprintf(stderr, "vnic name too long...\n"); return (1); } vhp = vnd_create(NULL, argv[1], argv[1], &vnderr, &syserr); assert(vhp != NULL); assert(vnderr == 0); assert(syserr == 0); vhp2 = vnd_open(NULL, argv[1], &vnderr, &syserr); assert(vhp2 != NULL); assert(vnderr == 0); assert(syserr == 0); vnd_close(vhp2); vnd_close(vhp); return (0); }
int net_init_vnic(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan) { int fd, len, vnderr, syserr; const char *ifname, *mac; uchar_t *macaddr; VLANClientState *ncp; VNICState *vsp; vnd_prop_buf_t vib; if ((ifname = qemu_opt_get(opts, "ifname")) == NULL) { error_report("missing ifname required for vnic\n"); return (-1); } mac = qemu_opt_get(opts, "macaddr"); if (mac != NULL) { macaddr = _link_aton(mac, &len); if (macaddr == NULL || len != ETHERADDRL) { error_report("invalid macaddr for vnic: %s\n", mac); return (-1); } } ncp = qemu_new_net_client(&net_vnic_info, vlan, NULL, "vnic", name); vsp = DO_UPCAST(VNICState, vns_nc, ncp); vsp->vns_hdl = vnd_open(NULL, ifname, &vnderr, &syserr); if (vsp->vns_hdl == NULL) { const char *err = vnderr != VND_E_SYS ? vnd_strerror(vnderr) : vnd_strsyserror(syserr); error_report("vnic: failed to open interface %s - %s\n", ifname, err); return (-1); } vib.vpb_size = 1024 * 1024 * 4; /* 4 MB */ if (vnd_prop_set(vsp->vns_hdl, VND_PROP_RXBUF, &vib, sizeof (vib)) != 0) { const char *err = vnderr != VND_E_SYS ? vnd_strerror(vnderr) : vnd_strsyserror(syserr); error_report("failed to change rx buf size: %s\n", err); return (-1); } vib.vpb_size = 1024 * 1024 * 4; /* 4 MB */ if (vnd_prop_set(vsp->vns_hdl, VND_PROP_TXBUF, &vib, sizeof (vib)) != 0) { const char *err = vnderr != VND_E_SYS ? vnd_strerror(vnderr) : vnd_strsyserror(syserr); error_report("failed to change tx buf size: %s\n", err); return (-1); } fd = vnd_pollfd(vsp->vns_hdl); if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { error_report("vnic: failed to set fd on interface %s to " "non-blocking: %s\n", ifname, strerror(errno)); return (-1); } vsp->vns_fd = fd; snprintf(vsp->vns_nc.info_str, sizeof (vsp->vns_nc.info_str), "ifname=%s", qemu_opt_get(opts, "ifname")); if (vnic_dhcp_init(&vsp->vns_ds, opts) == 0) return (-1); if (vnic_frameio_init(vsp) != 0) { error_report("vnic: failed initialize frameio: %s\n", strerror(errno)); return (-1); } /* We have to manually intialize the polling for read */ vnic_read_poll(vsp, 1); return (0); }