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);
}
Exemple #2
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);
}