Esempio n. 1
0
static struct vport *netdev_create(const struct vport_parms *parms)
{
	struct vport *vport;
	struct netdev_vport *netdev_vport;
	int err;

	vport = vport_alloc(sizeof(struct netdev_vport), &netdev_vport_ops, parms);
	if (IS_ERR(vport)) {
		err = PTR_ERR(vport);
		goto error;
	}

	netdev_vport = netdev_vport_priv(vport);

	netdev_vport->dev = dev_get_by_name(&init_net, parms->name);
	if (!netdev_vport->dev) {
		err = -ENODEV;
		goto error_free_vport;
	}

	if (netdev_vport->dev->flags & IFF_LOOPBACK ||
	    netdev_vport->dev->type != ARPHRD_ETHER ||
	    is_internal_dev(netdev_vport->dev)) {
		err = -EINVAL;
		goto error_put;
	}

	err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook,
					 vport);
	if (err)
		goto error_put;

	dev_set_promiscuity(netdev_vport->dev, 1);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
	dev_disable_lro(netdev_vport->dev);
#endif
	netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH;

	return vport;

error_put:
	dev_put(netdev_vport->dev);
error_free_vport:
	vport_free(vport);
error:
	return ERR_PTR(err);
}
Esempio n. 2
0
static struct vport *netdev_create(const char *name, const void __user *config)
{
    struct vport *vport;
    struct netdev_vport *netdev_vport;
    int err;

    vport = vport_alloc(sizeof(struct netdev_vport), &netdev_vport_ops);
    if (IS_ERR(vport)) {
        err = PTR_ERR(vport);
        goto error;
    }

    netdev_vport = netdev_vport_priv(vport);

    netdev_vport->dev = dev_get_by_name(&init_net, name);
    if (!netdev_vport->dev) {
        err = -ENODEV;
        goto error_free_vport;
    }

    if (netdev_vport->dev->flags & IFF_LOOPBACK ||
            netdev_vport->dev->type != ARPHRD_ETHER ||
            is_internal_dev(netdev_vport->dev)) {
        err = -EINVAL;
        goto error_put;
    }

    /* If we are using the vport stats layer initialize it to the current
     * values so we are roughly consistent with the device stats. */
    if (USE_VPORT_STATS) {
        struct odp_vport_stats stats;

        err = netdev_get_stats(vport, &stats);
        if (!err)
            vport_set_stats(vport, &stats);
    }

    return vport;

error_put:
    dev_put(netdev_vport->dev);
error_free_vport:
    vport_free(vport);
error:
    return ERR_PTR(err);
}